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!