[Top][All Lists]

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

how to kill child process?

From: vapnik spaknik
Subject: how to kill child process?
Date: Sun, 23 Aug 2020 19:50:58 +0000 (UTC)

    I'm writing a backup script in guile, and want to run rsync several times 
over the same ssh connection.
>From the shell command line I can start an ssh session with a control master 
>socket, and then tell ssh to reuse that socket with each invocation of rsync:
> ssh -S ~/.ssh/%C -N -f remotehost &
> rsync -au -e "ssh -S ~/.ssh/%C remotehost" remotehost:file1 backupdir/file1
> rsync -au -e "ssh -S ~/.ssh/%C remotehost" remotehost:file2 backupdir/file2
and finally, find the pid and kill the ssh session:
> ps -e|grep ssh
> kill <PID>

To do the same thing in guile I tried the following:

(let ((pid (primitive-fork))) 
      (if (eq? 0 pid) 
          (execlp "ssh" "ssh" "-S" "~/.ssh/%C" "-N" "-f" "remotehost") 
          (begin (system "rsync -au -e \"ssh -S ~/.ssh/%C remotehost\" 
remotehost:file1 backupdir/file1")
                     (system "rsync -au -e \"ssh -S ~/.ssh/%C remotehost\" 
remotehost:file1 backupdir/file1")
                     (kill pid SIGTERM)))

However, this doesn't work because the pid returned by primitive-fork is the 
pid of the guile thread, not its child ssh process, and killing the guile 
thread doesn't kill its child process.
I don't want to run (system "kill ssh") because I might have other ssh 
processes running that I need to keep alive.

It might be possible for me to achieve the same end results using a tunnel with 
guile-ssh for this particular problem, but I would like to know how to solve 
the more general problem of killing a long-running child process in guile, 
since I will probably face this problem again at some point in the future.
Can anyone help me?

Joe Bloggs.

reply via email to

[Prev in Thread] Current Thread [Next in Thread]