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