Bash / ZSH:撤消“取消”


30

有没有办法将进程“取消”后,将其“重新”附加到shell作业表?

编辑:$ SEARCHENGINE完全使我失败。看起来不太好。

Answers:


16

考虑到linux作业和进程所有权的工作方式,如果没有采用过程的帮助,恐怕实际上不可能重新拥有一个进程。

父母可以“放弃”孩子,然后由名为“ init”的过程“收养”孩子。系统安全性可防止某人抓取其他人的进程。当您放弃它时,一个过程将成为其他人(init)的控制。作为“用户”,您仍然可以终止该过程,但是您无法取回它。试图强制init返回您的进程不太可能,因为init甚至不读取邮件。

听起来很平均,实际上可以归结为“不要那样做!”的答案。


1
这是不对的:父进程不能导致子进程被接受,除非退出。您描述的行为必须从子进程中触发(或由内核触发,如果父进程死亡,则内核会自动执行其中的一些操作)。一个过程不能自愿收养孩子,但也不能放弃一个孩子。
吉尔(Gilles)'所以

1
我很抱歉。我的错。过于简化。再次通过bash源运行,bash仍保留所有权,但禁止将sighup传递给子进程。因此,可能有可能将其取回,但尚未将其内置到bash中。由于某种原因,我陷入了对孤儿和僵尸进行init收获的过程。
lornix

@lomix是的,但是当您退出外壳时,您放弃了它,那么它确实得到了1.的ppid,因此您的推理是有效的。除非他们将要退出,否则他们将
放弃

1
抱歉,这个答案是错误的。只需使用reptyr(有关用法示例,请参见我的答案)。
Christian Pietsch 2015年

18

虽然我认为这样做对不幸放弃错误流程的人无济于事,但是如果您要从工作流中驱逐被拒绝,而将其替换为:

https://github.com/nelhage/reptyr

您将能够重做任何进程(即在屏幕内移动它)。


2
好吧,我通过reptyr恢复了我不熟悉的vim流程,因此它的工作原理与我正在寻找的不知名的实用程序一样。
hlovdal13年

您说对了,@ hlovdal:这个答案是错误的。reptyr是解决方案,但无需停止使用disown。为了清楚起见,我写了一个新答案。
Christian Pietsch 2015年

11

您所需要的就是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

2
(sudo apt-get install reptyr)然后首次尝试获得此信息:“内核在附加时拒绝了权限。如果您的uid与目标对象相匹配,请检查/ proc / sys / kernel / yama / ptrace_scope的值。有关更多信息,请参见/etc/sysctl.d/10-ptrace.conf“,我将两个位置的值都从1更改为0,并且它起作用了。我以同一用户(在ubuntu 14.04 LTS上的ipython笔记本)测试了一个进程的disown和reptyr。对于隔离环境中的开发而言,这可能是可以的……但是不确定该更改的最终安全后果。也许有人有专长可以插入内容。
FizxMike

1

抱歉,没有。原则上讲,这是有可能的,因为放弃仅更改了一些shell内部状态-它基本上从列表中删除了进程ID,并且可以放回它而不会造成太多麻烦(测试时您必须格外小心重新连接的pid在正确的会话中,但这不是无法克服的)。但是,通常的shell(bash,ksh,tcsh,zsh)似乎都没有办法重新添加。(虽然与zsh中,你可以写jobstatesjobdirsjobtext关联数组,我不知道有多少你可以做到这一点的方式。)

如果您希望外壳程序像对它自己的子进程一样,将信号发送到被取消处理的进程,则可以编写一个存根作业,等待它接收到信号并将相同的信号发送给被取消处理的进程。您可以发送SIGSTOP和发送SIGCONT到未使用的进程来模拟Ctrl+ Zbg。所有这些都不会像拥有所有权那样方便。


0

什么情况 如果只想让终端恢复一会儿,可以改用GNU Screen。它并不能完全从终端上分离流程-屏幕会模拟一个流程,以使流程受益-但您可以将其与正在使用的真实终端连接和分离。您甚至可以分离屏幕,注销,然后重新登录并重新连接到同一屏幕。


6
情况是:您拒绝了错误的过程并希望将其取回。
nisc

1
啊。更难。屏幕需要预先计划。
斯科特
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.