~ salmonella-environment-setup (master) 386bd0d65111d8f8d01afdb7dd51a2ba00fc5eec


commit 386bd0d65111d8f8d01afdb7dd51a2ba00fc5eec
Author:     Mario Domenech Goulart <mario@parenteses.org>
AuthorDate: Fri May 25 11:24:48 2018 +0200
Commit:     Mario Domenech Goulart <mario@parenteses.org>
CommitDate: Fri May 25 11:28:09 2018 +0200

    Add kill-orphan.scm
    
    At the moment it only works on Linux, but I believe it should work on
    FreeBSD with some cond-expand to handle the FreeBSD specific code
    related to /proc (that's why it is in the `common' directory).
    
    Eventually salmonella-run-publish should be able to deal with hanging
    process better (maybe by using process groups, as suggested by John
    Cowan).

diff --git a/scripts/common/kill-orphan.scm b/scripts/common/kill-orphan.scm
new file mode 100644
index 0000000..7dfb7e5
--- /dev/null
+++ b/scripts/common/kill-orphan.scm
@@ -0,0 +1,44 @@
+(use extras posix srfi-1 srfi-13)
+
+(define salmonella-home
+  ;; Change this to the directory where salmonella builds run.  This
+  ;; is the path on the Linux machines.
+  "/home/chicken/salmonella/build/salmonella-run-publish/")
+
+(define max-attempts-to-kill 10)
+
+(define (get-pids)
+  (filter-map string->number (directory "/proc")))
+
+(let ((pids (get-pids)))
+  (for-each
+   (lambda (pid)
+     (handle-exceptions exn
+        #f ;; ignore
+        (let* ((status-file (sprintf "/proc/~a/status" pid))
+               (parent-pid
+                (let loop ((lines (with-input-from-file status-file
+                                    read-lines)))
+                  (if (null? lines)
+                      #f
+                      (let ((line (car lines)))
+                        (if (string-prefix? "PPid:" line)
+                            (string->number (cadr (string-split line)))
+                            (loop (cdr lines)))))))
+               (command-line
+                (with-input-from-file (sprintf "/proc/~a/cmdline" pid)
+                  read-line)))
+          (if (and (eq? parent-pid 1)
+                   (string-prefix? salmonella-home command-line))
+              (let loop ((i 1))
+                (if (> i max-attempts-to-kill)
+                    (printf "Giving up at attempting to kill ~a\n" pid)
+                    (begin
+                      (printf "Killing ~a: ~a [cwd: ~a] (attempt ~a out of ~a)\n"
+                              command-line
+                              (read-symbolic-link (sprintf "/proc/~a/cwd" pid))
+                              pid i max-attempts-to-kill)
+                      (process-signal pid signal/kill)
+                      (when (memv pid (get-pids))
+                            (loop (fx+ i 1))))))))))
+   pids))
Trap