我正在通过 SSH 对长时间运行的数据迁移脚本进行一些测试。假设我在下午 4 点左右开始运行脚本;现在,下午 6 点左右,我在诅咒自己没有做这一切screen
。
有什么方法可以“追溯”nohup
一个过程,还是我需要让我的电脑整夜在线?如果无法附加screen
到/nohup
我已经开始的进程,那为什么?与父/子进程如何交互有关?(我不会接受至少不能解决“为什么”问题的“否”答案——对不起;))
我正在通过 SSH 对长时间运行的数据迁移脚本进行一些测试。假设我在下午 4 点左右开始运行脚本;现在,下午 6 点左右,我在诅咒自己没有做这一切screen
。
有什么方法可以“追溯”nohup
一个过程,还是我需要让我的电脑整夜在线?如果无法附加screen
到/nohup
我已经开始的进程,那为什么?与父/子进程如何交互有关?(我不会接受至少不能解决“为什么”问题的“否”答案——对不起;))
如果您使用的是 Bash,则可以运行
disown -h job
使用reptyr
从自述文件:
作者的几篇博文:
要将进程从一个 tty 窃取到您当前的 tty,您可能想尝试以下 hack:
http://www.ucc.asn.au/~dagobah/things/grab.c
它需要重新格式化才能编译到当前的 Linux/glibc 版本,但仍然可以工作。
当一个进程启动时,STDIN、STDOUT 和 STDERR 连接到something。通常,一旦命令启动,您就无法更改它。在您描述的情况下,这可能是与 ssh 会话关联的 tty。nohup 几乎就是...
也就是说,将 STDIN 设置为 /dev/null,将 STDOUT 设置为文件,将 STDERR 设置为 STDOUT。Screen 做了更复杂的事情,包括设置直接指向自身的 tty。
我不知道有任何方法可以追溯 nohup 或筛选正在运行的进程。如果您 cd 到 /proc/$pid/fd 并查看 0、1 和 2 指向什么。
你可能对 disown 有一些运气,但如果进程尝试使用 STDIN、STDOUT 或 STDERR 做任何事情,则不会。
我只能给你一个简单的“不”,没有屏幕部分的原因,我会对你自己的原因感兴趣。
但是,您是否尝试过
disown
(内置 bash)Cryopid是从grab.c 的作者进一步开发的,它将一个进程冻结为一个文件,然后您运行(在屏幕内)以恢复该进程。
Solaris/OpenSolaris 上的 nohup 有一个 -p 标志来 nohup 正在运行的进程 - 例如,请参阅Solaris 10 nohup 手册页。
我最近看到了一个指向neercs的链接,它是一个使用 libcaca(一个彩色 ascii-art 库)构建的类似屏幕的实用程序。除其他功能外,它还拥有抓取现有进程并在您的 neercs(屏幕)会话中重新父级的能力。
但是我没有使用它,所以我无法评论它是否有效。
我可能想不到这一点,所以请随时纠正我(我已经了解了 disown!)...... ctrl-Z 和“bg”不会至少让进程在后台运行吗?还是您仍然希望在运行时看到 STDOUT 的关键问题?
如果您可以忍受无法与进程交互并且不反对加载随机内核模块,那么您可能会比查看Snoop做得更糟。或者,还有其他几个项目。这是一个调用injcode,它主要可以做你想做的事情。