While doing tests, I've noticed a similar issue when I don't type the passphrase and wait. In this case, there is a timeout from unison: "Timed out negotiating connection with the server". This corresponds (in src/remote.ml) to
let initConnection ?(connReady=fun () -> ()) ?cleanup in_ch out_ch = (* [makeConnection] is not expected to raise any recoverable exceptions. If this assumption changes in the future then [in_ch] and [out_ch] must be closed in the recovery code. *) let conn = makeConnection false in_ch out_ch in let close_on_fail t = Lwt.catch (fun () -> t) (fun e -> closeConnection conn; Lwt.fail e) in let with_timeout t = Lwt.choose [t; Lwt_unix.sleep 120. >>= fun () -> Lwt.fail (Util.Fatal "Timed out negotiating connection with the server")] in close_on_fail (with_timeout ( peekWithBlocking conn.inputBuffer >>= fun _ -> connReady (); Lwt.return () >>= fun () -> (* Connection working, notify *) checkHeader conn >>= checkServerUpgrade conn >>= checkServerVersion conn)) >>= fun () -> registerConnCleanup conn cleanup; [...] I can see that the process gets a SIGTERM. But at least in this case, I think that unison is correct, and that my wrapper should catch the signal and kill its child process if there is one. And it could do that for SIGINT too (original issue). In short, it may not be worth to change unison. -- Vincent Lefèvre <vinc...@vinc17.net> - Web: <https://www.vinc17.net/> 100% accessible validated (X)HTML - Blog: <https://www.vinc17.net/blog/> Work: CR INRIA - computer arithmetic / AriC project (LIP, ENS-Lyon)