let read_procmem pid = let cin = open_in (Printf.sprintf "/proc/%i/status" pid) in let matchline s = try Scanf.sscanf s " VmHWM: %i kB" (fun i -> Some i) with | _ -> None in let rec loop () = match matchline (input_line cin) with Some i -> i | None -> loop () in let s = try loop() with _ -> -1 in close_in cin; s ;; let rec monitor pid timeout mem = let p, s = Unix.waitpid [ Unix.WNOHANG ] pid in if p == 0 then if (Unix.gettimeofday() > timeout || (read_procmem pid) >= mem) then Unix.kill pid Sys.sigkill else let () = Unix.sleep 1 in monitor pid timeout mem ;; let run args timeout mem = let pid = Unix.fork () in if pid == 0 then Unix.execvp args.(0) args else monitor pid timeout mem ;; let () = if Array.length Sys.argv < 4 then exit 1 else try let timeout = Unix.gettimeofday () +. float_of_string Sys.argv.(1) in let mem = int_of_string Sys.argv.(2) in let command = Array.sub Sys.argv 3 ((Array.length Sys.argv) - 3) in run command timeout mem; exit 0 with _ -> exit 2 ;;