Skip to main content

A pgrep like with ocaml

pgrep

"pgrep" is a tool to "grep" processes. If you want to know if a process containing a pattern exists, you use "pgrep pattern".

informations

The informations about a process are stored in

 /proc/$PID/cmdline 

ocaml

To make a pgrep-like with Ocaml, we'll have to loop on all /pro/$PID and check if

 /proc/$PID/cmdline 
has the pattern we look for.

I made it with this (crappy) piece of code, in which you fill find how, in OCaml, to:

  • Open a File
  • Write recursive functions
  • Replace a string with another
  • Deal with command line arguments
 open Unix   ;; open List   ;; open Str    ;; open Sys    ;; open Printf ;; open String ;; open Array  ;; (* In /proc//cmdline, the field separator is '\000' *) let rec cmd_to_string accumulator cmd_channel = try let red = input_char cmd_channel in match red with | '\000' -> cmd_to_string (accumulator^(" ")) cmd_channel; | _      -> cmd_to_string (accumulator^(String.make 1 red)) cmd_channel; with End_of_file -> accumulator;; let a_pid_cmd a_pid = let cmd_handle = open_in ("/proc/"^a_pid^"/cmdline") in let the_cmd = cmd_to_string "" cmd_handle in close_in cmd_handle; the_cmd;; (* Improve: I could have returned the tuple (binary, arguments) *) let slash_proc_list = to_list (readdir "/proc");; (* Number-only == PID *) let r_number = regexp "^[0-9]+$";; let rec proc_list accumulator slash_proc_list = match slash_proc_list with | [] -> accumulator; | tete::queue -> match (string_match r_number tete 0) with | true  -> (proc_list ((a_pid_cmd tete)::accumulator) queue); | false -> (proc_list (accumulator) queue);; let the_proc_list = proc_list [] slash_proc_list;; (* Extraction of the binary, includes the basedir *) let invoked a_line= try List.hd (Str.split (regexp " ") a_line) with _ -> "";; let rec procs_matching accumulator regex_as_string a_proc_list = match a_proc_list with | [] -> accumulator; | tete::queue -> let r_asked   = regexp regex_as_string and proc_name = invoked tete in match (string_match r_asked proc_name 0) with | true  -> procs_matching (tete::accumulator) regex_as_string queue; | false -> procs_matching (accumulator)       regex_as_string queue;; (* Improve: Should know how to deal with basedirs /usr/bin, /bin,... *) let the_procs_matching = procs_matching [] Sys.argv.(1) the_proc_list;; let rec print_list a_list =  match a_list with | []          -> (); | tete::queue -> Printf.printf "%s  " tete;  print_list queue;; let check_procs max_number a_proc_list = let the_length = List.length a_proc_list in match (the_length < int_of_string(max_number)) with | true  -> Printf.printf "%d processes found: " the_length; print_list a_proc_list; WEXITED 0; | false ->  WEXITED 2;; check_procs Sys.argv.(2) the_procs_matching;; 

Comments

Popular posts from this blog

vmware net_device trans_start

VMWare Workstation 12 and Kernel 4.7 When recompiling vmware kernel modules on a kernel 4.7, I get this error:

/tmp/modconfig-xrrZGZ/vmnet-only/netif.c:468:7: error: ‘struct net_device’ has no member named ‘trans_start’; did you mean ‘mem_start’?     dev->trans_start = jiffies;
This seems to be an already encountered problem: http://rglinuxtech.com/?p=1746http://ferenc.homelinux.com/?p=356 I choosed to replace the line, instead of deleting it.

- dev->trans_start = jiffies; + netif_trans_update(dev); I also noted that I had to re-tar the modified sources instead of leaving them untared, because the compilation process only takes the archives. 
On precedent editions of these files, I just left the modified folders "vmnet-only/" and "vmmon-only/" expanded without the need to re-tar them.


Jira workflow for new projects

Associated workflow creation I'm a Jira Cloud user and begining from some version 6, I noticed that when I create a project, it automatically creates a Workflow and Issue Scheme that is prepended by the project key and which is a copy of the default scheme.
I always had to make a cleanup after creating a project. Default workflow for new projects I also miss a feature that would allow me to make a custom workflow (and globally custom project setting) the default for new projects I create.
Solution: Create with shared configuration While searching, I noticed that with Jira Cloud which is version 7.1.0 at the time I write, there is a link at the bottom of the "Create project" wizard:
"Create with shared configuration" will allow me to select the project I want the new one to share configuration with.

The new created project will use the same configuration as the project I selectThere will be no creation of Workflow and Issue Scheme that I need to cleanup

This fea…

vmware workstation 12 unable to load libvmwareui.so

Using VMWare Workstation on ArchLinux, it suddenly refused to launch.
when inspecting the logs, which BTW are in /tmp/vmware-<id>, I see:

2015-12-11T17:41:54.442+03:00| appLoader| I125: Log for appLoader pid=1727 version=12.0.1 build=build-3160714 option=Release
2015-12-11T17:41:54.442+03:00| appLoader| I125: The process is 64-bit.
2015-12-11T17:41:54.442+03:00| appLoader| I125: Host codepage=UTF-8 encoding=UTF-8
2015-12-11T17:41:54.442+03:00| appLoader| I125: Host is unknown
2015-12-11T17:41:54.448+03:00| appLoader| W115: HostinfoReadDistroFile: Cannot work with empty file.
2015-12-11T17:41:54.448+03:00| appLoader| W115: HostinfoOSData: Error: no distro file found
2015-12-11T17:41:54.448+03:00| appLoader| I125: Invocation: "/usr/lib/vmware/bin/vmware-modconfig --launcher=/usr/bin/vmware-modconfig --appname=VMware Workstation --icon=vmware-workstation"
2015-12-11T17:41:54.448+03:00| appLoader| I125: Calling: "/usr/lib/vmware/bin/vmware-modconfig --launcher=/usr/bin/vmware…