使用tcsh的事后远程nohup


11

我在运行长期(几周?)过程的xterm中有一个tcsh实例。在其下运行的Xvnc服务器杂草丛生;它消耗了100%的CPU,并且没有响应。(这是一个已知的错误,我知道它是无法恢复的。)

长期过程目前在stdout上受阻。

有什么办法可以杀死一个基础进程(tcsh,xterm等)并使该长期进程继续运行?

(请,没有关于的答案screen。我知道。这不是我的过程;这是用户的过程。他们不会学习。)

Answers:


17

这篇文章可能会有所帮助。建议是:

  1. 后台进程(使用Ctrl-Z,然后使用bg
  2. 运行disown -h%[jobid](可能是bash-ism,所以您必须翻译tcsh)

坏消息,当然是,BG将需要在这个过程中运行相同的外壳做......但它可能正在后台运行。

真正的坏消息是,不认通话可能需要在同一个壳来完成。在这种情况下,是的,您很困惑。但是我不确定,也许root可以强制断开连接。

嗯 可能的好消息 -tcsh会自动删除

如果tcsh异常退出,它将在退出时自动放弃在后台运行的作业。

因此,如果您的长期过程已经处于后台,那么终止其tcsh父进程应该可以使其继续进行。现在,该过程已与启动终端断开连接。(如果没有,请参见上面的“坏消息”。)

不幸的是,它不是屏幕,所以没有真正的重新连接。您可以使用gdb进行伪造(同样,从第一个链接开始):

[...]有一些肮脏的骇客,并非不可能重新打开进程的stdout / stderr / stdin。

因此,您仍然可以创建一个空白屏幕窗口(例如运行sleep)。

然后例如使用gdb附加到进程,执行一些调用close(0)
调用close(1)
调用close(2)
调用open(“ / dev / pts / xx”,...)
调用dup(0)
调用dup(0)
分离

该进程的输出将进入屏幕。它不会连接到该屏幕终端,因此例如[sic]会杀死“ sleep”命令,而不是进程,但是对于OP来说足够了。

我想知道在该过程中是否也不应同时存在“ call dup(1)”和“ call dup(2)” ...


是的,这是一个前台流程,所以我想我搞砸了。
wfaulk

是的 但是就像你说的,这不是你的过程,不是你的错。对不起,您陷入困境,对。
魁北克吉ote德09年

2
这完全救了我的屁股。我遇到了与最初发布的问题相同的问题,即X服务器(以及之间的xterm)楔入时,进程在STDOUT上阻塞。事实证明,除了关闭STDOUT之外,我实际上不需要执行任何操作。那输出是无关紧要的;实际数据位于日志文件中的某个位置。这样我就可以附加gdb,运行“ call close(1)”,然后运行“ cont”,它又开始运行了。非常感谢!
wfaulk

!!有趣。那一切都冻结了吗?怪异的 很高兴它对您有所帮助!
09年

2
可能值得指出的是,将“ Ctrl-Z”发送到前台进程并将SIGSTOP发送到其pid是同一回事。(SIGCONT重新启动了该过程。)我不知道这是否会对相同情况下的其他人有所帮助,但是,在我的快速测试中,先发送SIGSTOP,然后发送SIGCONT,然后重复发送“ Ctrl-Z” bg
wfaulk

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.