Disown a running shell process and reattach it to a new screen
Stop worrying about your VPN connection dropping and your remote job to get kill. You can work on a remote server from your laptop or desktop in a safe and controlled way by detaching your screen session and reattaching later.
How to detach a running job from your shell session?
There is a couple of ways to achieve this. The easiest and most common one is probably to just send to background and disown your process. Use Ctrl+Z to suspend a program then
bg to run the process in background and
disown to detach it from your current terminal session. With the built-in bash
job call you can list all the existed backgrounded process, you can use
fg to run the process in foreground again as long as it didn't get detached.
bg [jobspec ...] Resume each suspended job jobspec in the background, as if it had been started with &. If jobspec is not present, the shell’s notion of the current job is used. bg jobspec returns 0 unless run when job control is disabled or, when run with job control enabled, any specified jobspec was not found or was started without job control. disown [-ar] [-h] [jobspec ...] Without options, each jobspec is removed from the table of active jobs. If the -h option is given, each jobspec is not removed from the table, but is marked so that SIGHUP is not sent to the job if the shell receives a SIGHUP. If no jobspec is present, and neither the -a nor the -r option is sup- plied, the current job is used. If no jobspec is supplied, the -a option means to remove or mark all jobs; the -r option without a jobspec argument restricts operation to running jobs. The return value is 0 unless a jobspec does not specify a valid job. fg [jobspec] Resume jobspec in the foreground, and make it the current job. If jobspec is not present, the shell’s notion of the current job is used. The return value is that of the command placed into the foreground, or failure if run when job control is disabled or, when run with job control enabled, if jobspec does not specify a valid job or jobspec specifies a job that was started without job control. jobs [-lnprs] [ jobspec ... ] jobs -x command [ args ... ] The first form lists the active jobs. The options have the following meanings: -l List process IDs in addition to the normal information. -p List only the process ID of the job’s process group leader. -n Display information only about jobs that have changed status since the user was last notified of their status. -r Restrict output to running jobs. -s Restrict output to stopped jobs. If jobspec is given, output is restricted to information about that job. The return status is 0 unless an invalid option is encountered or an invalid jobspec is supplied. If the -x option is supplied, jobs replaces any jobspec found in command or args with the correspond- ing process group ID, and executes command passing it args, returning its exit status.
How to detach from your active terminal and reattach to a different session?
To detach the job from the current terminal and reattach later, you have few options. You can use a screen manager like screen, the terminal multiplexer tmux, or a wrapper for both like byobu. Using
screen you will simply create a session before running your job using
screen -D -R, run your command and leave the screen session Ctrl+A d.
If you already started a process and forgot to run it in a
tmux session, then sent it to background and disown it as mentionned above. You could reattach it later from a different
tty using retty or reptyr. Note that
reptyr are generally not pre-installed on a Linux distribution.