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.