Can I nohup/screen an already-started process?
If you're using Bash, you can run
disown -h job
disown [-ar] [-h] [jobspec ...]
Without options, each jobspec is removed from the table of active jobs. If the
-hoption is given, the job 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 jobspec is not present, and neither the
-roption is supplied, the current job is used. If no jobspec is supplied, the
-aoption means to remove or mark all jobs; the
-roption without a jobspec argument restricts operation to running jobs.
From the README:
reptyr - A tool for "re-ptying" programs. ----------------------------------------- reptyr is a utility for taking an existing running program and attaching it to a new terminal. Started a long-running process over ssh, but have to leave and don't want to interrupt it? Just start a screen, use reptyr to grab it, and then kill the ssh session and head on home. USAGE ----- reptyr PID "reptyr PID" will grab the process with id PID and attach it to your current terminal. After attaching, the process will take input from and write output to the new terminal, including ^C and ^Z. (Unfortunately, if you background it, you will still have to run "bg" or "fg" in the old terminal. This is likely impossible to fix in a reasonable way without patching your shell.)
A few blog posts by its author:
- reptyr: Attach a running process to a new terminal
- reptyr: Changing a process’s controlling terminal
To steal a process from one tty to your current tty, you may want to try this hack:
It needs some reformatting in order to compile to current Linux/glibc versions, but still works.
When a process starts, STDIN, STDOUT and STDERR are connected to something. Generally you can't change that once the command is started. In the case you're describing, that's probably a tty associated with the ssh session. nohup pretty much just does ...
command < /dev/null > nohup.out 2>&1
That is, sets STDIN to /dev/null, STDOUT to a file and STDERR to STDOUT. Screen does much more sophisticated things involving setting up ttys that direct to itself.
I don't know of any way to retroactively nohup or screenize a running process. If you cd to /proc/$pid/fd and see what 0, 1 and 2 point to.
You might have some luck with disown, but not if the process tries to do anything with STDIN, STDOUT or STDERR.
I can only give you a simple "No" without the why for the screen part, I'd be interested in the reason myself thou.
However have you tried
disown (a bash builtin)
~ $ echo $SHELL /bin/bash ~ $ type disown disown is a shell builtin ~ $ help disown disown: disown [-h] [-ar] [jobspec ...] By default, removes each JOBSPEC argument from the table of active jobs. If the -h option is given, the job is not removed from the table, but is marked so that SIGHUP is not sent to the job if the shell receives a SIGHUP. The -a option, when JOBSPEC is not supplied, means to remove all jobs from the job table; the -r option means to remove only running jobs.