If I use

timeout 10 ssh -n -o BatchMode=yes 'sleep 20' > 2>&1 &

To give out a remote command on a server, and I kill the SSH connection after 10 seconds, then I can see that the sleep 20 is still running on the server, but there is no SSH connection.

How can I kill the remote command after a timeout, say 10 seconds?

The remote machine is AIX 6.1 (or SLES) and no package is available for "timeout". My client is Ubuntu 10.03.

  • 1
    If you knew the PID of the command (I'm assuming you do, seeing as you can still see it running), you send it a TERM signal.
    – n0pe
    Aug 20 '11 at 16:17

Assuming your remote server has a POSIX-compliant shell, the following should work:

ssh ...options... 'command & pid=$!; sleep 20; kill $pid'

Indeed the POSIX standard states about $!:

Expands to the decimal process ID of the most recent background command (see Lists) executed from the current shell. (For example, background commands executed from subshells do not affect the value of "$!" in the current shell environment.) For a pipeline, the process ID is that of the last command in the pipeline.

If the remote system has job control, you can shorten it this way:

ssh ...options... 'command & sleep 20; kill %1'
  • +1 for the kill %1 way; I've done that in some scripts in the past. Aug 21 '11 at 13:22
  • what does "kill %1" do? does it always kill the good process? what happensd if there are more processes sent to background with "&" ? Aug 22 '11 at 8:35

If you want still do it with just 'timeout' command, your remote execution command (ssh) should get a tty allocated, then timeout will even kill the remote call. Change your ssh command to have '-t' in it.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.