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

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&

Jenkins invalid privatekey

Publish over SSH, Message "invalid privatekey:" With quite recent (June-July 2020) installations of Jenkins and OpenSSH, I have the following error message when using the "Deploy overs SSH" Jenkins plug-in and publishing artifacts to the target overs SSH: jenkins.plugins.publish_over.BapPublisherException: Failed to add SSH key. Message [invalid privatekey: [B@d8d395a] This problem seems to be referenced here: https://issues.jenkins-ci.org/browse/JENKINS-57495 Just regenerate a key with the right parameters To solve it: ssh-keygen -t rsa -b 4096 Or ssh-keygen -t rsa -b 4096 -m PEM

AzureCLI Custom Python

Installing Azure CLI on Archlinux When trying to install Azure CLI on Archlinux, I follow the documentation, in the "script" tab , and it leads to the following errors: [mihamina@arch-00 ~]$ curl -L https://aka.ms/InstallAzureCli | bash [...] Running install script. -- Verifying Python version. -- Python version 3.11.3 okay. [...] -- Executing: ['/usr/bin/python3', 'virtualenv.py', '--python', '/usr/bin/python3', '/home/mihamina/lib/azure-cli'] /tmp/tmpn0w4l6w9/virtualenv-16.7.11/virtualenv.py:24: DeprecationWarning: The distutils package is deprecated and slated for removal in Python 3.12. Use setuptools or check PEP 632 for potential alternatives import distutils.spawn /tmp/tmpn0w4l6w9/virtualenv-16.7.11/virtualenv.py:25: DeprecationWarning: The distutils.sysconfig module is deprecated, use sysconfig instead import distutils.sysconfig Already using interpreter /u