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

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='https://ngx.rktmb.org/foo'


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='https://ngx.rktmb.org/foo'" parameter.

npm run build --base-href='https://ngx.rktmb.org/foo


did not set the base href in indext.html

After looking for a while, I found https://github.com/angular/angular-cli/issues/13560 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='https://ngx.rktmb.org/foo'

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=ftp://packages-infra.mg.rktmb.org/pub/centos/7/base-reposync-7 " >> /etc/yum.repos.d/CentOS-Base.repo RUN echo "gpgcheck=0 " >>…

Project Lead NextGen Project

Jira, change project Lead in a Next-Gent project Atlassian has launched a new feature on Jira Cloud instances: Next-Gent project
Roles, Workflow and settings are not the same as in usual.
When one creates a Next-Gent project, the creator is the "Project Lead", and changin this is not straight:
How-to-change-project-lead-in-a-Next-Gen-ProjectHow-do-i-set-default-assignee-and-workflow-in-next-gen-projects Here is the mergeGet the ID of your project: say 10002Go to https://[account name].atlassian.net/secure/project/EditProject!default.jspa?pid=10002Set the project Lead