Sometimes we need to inspect a lot of systems at once and its annoying to have to wait a long time for a result. What to do?
Jane Street created a library for asynchronous programming called Async which you can read about on the Ocaml Core site. We can use that to speed things up a bit. Say that we need to ping a bunch of systems to make sure that they’re accessible before performing some other checks. We can do something like:
open Core.Std
open Async.Std
module Ashell = struct
module Shell = Core_extended.Shell
module Process = Shell.Process
let k_shell_command k f fmt =
ksprintf (fun command -> k f (Process.shell command)) fmt
let sh_test ?true_v =
Process.test_k (k_shell_command (fun f cmd ->
In_thread.run (fun () -> f cmd))) ?true_v
end
let ping_host = Ashell.sh_test "/bin/ping -c 1 %s >/dev/null 2>&1 || /bin/false"
let ping_all host_list =
Deferred.List.iter
host_list
~how:`Parallel
~f:(fun h -> ping_host h
| fun p -> printf "%s%sn" h (if p then "" else " (ping failed)"))
fun () -> shutdown 0
let () =
ping_all ["node1"; "node2"; "node3"; "node4"];
never_returns (Scheduler.go())
When Jane Street’s Async_extended library is released you’ll be able to ditch the Ashell module above and use Shell.test in the program.
If it looks daunting then read the introduction linked above and you’ll be able to write faster code for systems administration tasks quickly and safely typed! Awesome!