Last updated

How to background a running process over SSH

Today I was logged in on my FreeNAS server to setup Duplicity backups. After initial success on a small dataset of about 100MB, I cloned my configuration to backup my long term storage dataset. It contains about 50GB of data - or so I thought. It turns out there’s over 500GB there.

I let the job run throughout the day, not minding it much. But then time comes to close my SSH connection, and I know what that means: the process will be killed. And I really do not want to kill this running backup.

I know about screen. And tmux. And nohup. Even about <command> &. But alas it’s too late for that.

Luckily, there’s solution to this (if you’re running Bash or Zsh at least, I didn’t do a compatibility chec).

1. Background your running process

Your process is probably running in the foreground, so you’ll need to background it. There are two steps to this.

  1. Stop your process with Ctrl-Z. This basically pauzes the process, it does not kill it.
  2. Background the process by issueing the bg command. This will continue the process where it left off in the background. No harm done.

2. Disown the process

The final step is to use disown to remove the job from the current shell. This means than when the shell is killed when you sign off, the process is not killed as well.

You can use jobs (or jobs -l on FreeBSD) to see a list of current jobs and their process ID. To disown a process, use disown -h <process id>.

That’s all. Your process has now been removed from your shell session and is running happily in the background.

Bonus action: Background your process from another SSH session

In case you can’t use Ctrl-Z, you can log in with another SSH session and use the kill command to stop and continue the process that way.

  1. Sign in with another session and use ps to find the process ID.
  2. kill -SIGSTOP <process id> to stop the process
  3. kill -SIGCONT <process id> to continue the process in the background.
  4. Use disown as described above to disconnect the process from it’s parent shell process.

Disclaimer

This approach does not with all processes, namely those that require access to the TTY to function. vim is a good example of this. If you background Vim, it will be stopped and you cannot disown it.