Hi,
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.