I'm doing some test-runs of long-running data migration scripts, over SSH. Let's say I start running a script around 4 PM; now, 6 PM rolls around, and I'm cursing myself for not doing this all in screen
.
Is there any way to "retroactively" nohup
a process, or do I need to leave my computer online all night? If it's not possible to attach screen
to/nohup
a process I've already started, then why? Something to do with how parent/child proceses interact? (I won't accept a "no" answer that doesn't at least address the question of 'why' -- sorry ;) )
If you're using Bash, you can run
disown -h job
Use reptyr
From the README:
A few blog posts by its author:
To steal a process from one tty to your current tty, you may want to try this hack:
http://www.ucc.asn.au/~dagobah/things/grab.c
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 ...
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)Cryopid is a further development from the author of grab.c that freezes a process to a file, which you then run (inside screen) to resume the process.
nohup on Solaris/OpenSolaris has a -p flag to nohup a running process - for instance, see the Solaris 10 nohup man page.
I recently saw a link to neercs, which is a screen-like utility built using libcaca, a colour ascii-art library. Amongst other features, it boasts the ability to grab an existing process and re-parent it inside your neercs (screen) session.
I've not used it however, so I cannot comment on whether it works or not.
I'm probably under-thinking this so feel free to correct me (I already learned about disown!)... Wouldn't a ctrl-Z and "bg" work to at least get the process running in the background? Or is the key issue that you'd still want to see STDOUT while it runs?
If you can live with not being able to interact with the process and you don't object to loading random kernel modules, you could do worse than to look at Snoop. Alternatively, there are a couple of other projects. Here is one call injcode, which can mostly do what you want to do.