Answers:
考虑到linux作业和进程所有权的工作方式,如果没有采用过程的帮助,恐怕实际上不可能重新拥有一个进程。
父母可以“放弃”孩子,然后由名为“ init”的过程“收养”孩子。系统安全性可防止某人抓取其他人的进程。当您放弃它时,一个过程将成为其他人(init)的控制。作为“用户”,您仍然可以终止该过程,但是您无法取回它。试图强制init返回您的进程不太可能,因为init甚至不读取邮件。
听起来很平均,实际上可以归结为“不要那样做!”的答案。
reptyr
(有关用法示例,请参见我的答案)。
虽然我认为这样做对不幸放弃错误流程的人无济于事,但是如果您要从工作流中驱逐被拒绝,而将其替换为:
https://github.com/nelhage/reptyr
您将能够重做任何进程(即在屏幕内移动它)。
reptyr
是解决方案,但无需停止使用disown
。为了清楚起见,我写了一个新答案。
您所需要的就是reptyr
。它生活在GitHub上,自Wheezy起就被打包为Debian,也可能被打包为其他GNU / Linux发行版。如果您使用其进程ID(PID)调用它,它将在当前终端中显示您未使用的进程。因此,例如:
pgrep -f DISOWNED_PROCESS # to find out the PID of the disowned process
reptyr PID # insert this PID here
抱歉,没有。原则上讲,这是有可能的,因为放弃仅更改了一些shell内部状态-它基本上从列表中删除了进程ID,并且可以放回它而不会造成太多麻烦(测试时您必须格外小心重新连接的pid在正确的会话中,但这不是无法克服的)。但是,通常的shell(bash,ksh,tcsh,zsh)似乎都没有办法重新添加。(虽然与zsh中,你可以写jobstates
,jobdirs
和jobtext
关联数组,我不知道有多少你可以做到这一点的方式。)
如果您希望外壳程序像对它自己的子进程一样,将信号发送到被取消处理的进程,则可以编写一个存根作业,等待它接收到信号并将相同的信号发送给被取消处理的进程。您可以发送SIGSTOP
和发送SIGCONT
到未使用的进程来模拟Ctrl+ Z和bg
。所有这些都不会像拥有所有权那样方便。
什么情况 如果只想让终端恢复一会儿,可以改用GNU Screen。它并不能完全从终端上分离流程-屏幕会模拟一个流程,以使流程受益-但您可以将其与正在使用的真实终端连接和分离。您甚至可以分离屏幕,注销,然后重新登录并重新连接到同一屏幕。