Skip to main content

A pgrep like with ocaml


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


The informations about a process are stored in



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

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;; 


Popular posts from this blog

npm run build base-href

Using NPM to specify base-href When building an Angular application, people usually use "ng" and pass arguments to that invocation. Typically, when wanting to hard code "base-href" in "index.html", one will issue: ng build --base-href='' I used to build my angular apps through Bamboo or Jenkins and they have a "npm" plugin. I got the habit to build the application with "npm run build" before deploying it. But the development team once asked me to set the "--base-href=''" parameter. npm run build --base-href=' did not set the base href in indext.html After looking for a while, I found where it says: You need to use −− to pass arguments to npm scripts. This did the job! The command to issue is then: npm run build -- --base-href='

dockerfile multiline to file

Outputing a multiline string from Dockerfile I motsly use a Dockerfile by sourcing from a base ditribution: CentOS or Debian. But I also have a local mirror and would like to use it for packages installation. Espacially on CentOS it is about many lines to write to the /etc/yum.repos.d/CentOS-Base.repo file. Easiest way: one RUN per line The first method that comes in mind is to issue one RUN per line to write. Here you are: RUN echo "[base] " > /etc/yum.repos.d/CentOS-Base.repo RUN echo "name=CentOS-$releasever - Base " >> /etc/yum.repos.d/CentOS-Base.repo RUN echo "baseurl= " >> /etc/yum.repos.d/CentOS-Base.repo RUN echo "gpgcheck=0 &quo

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 select There will be no creation of Workflow and Issue Scheme that