事后使用 tcsh 进行远程 nohup

事后使用 tcsh 进行远程 nohup

我在 xterm 中有一个 tcsh 实例,它正在运行一个长期(数周?)进程。它所运行的 Xvnc 服务器陷入了困境;它消耗了 100% 的 CPU 并且没有响应。(这是一个已知错误,我知道无法恢复。

长期进程目前正在标准输出上阻塞。

有什么方法可以终止底层进程(tcsh、xterm 等等)并保持该长期进程运行?

(请不要回答screen。我知道​​。这不是我的过程;这是用户的。他们不会学习。)

答案1

这个帖子可能会有帮助。建议是:

  1. 后台进程(使用 Ctrl-Z,然后背景
  2. 跑步放弃-h%[jobid](可能是 bash 主义,因此你必须为 tcsh 进行翻译)

坏消息当然,背景需要在进程运行的同一个 shell 中完成...但是...它可能已经在后台运行了。

真是坏消息否认调用可能需要在同一个 shell 中完成。在这种情况下,是的,你完蛋了。但我不确定,也许 root 可以强制断开连接。

嗯。有可能好消息-- tcsh 会执行否认自动地:

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

因此,如果您的长期进程已在后台运行,则终止其 tcsh 父进程应该可以让它继续运行。该进程现在已与启动终端断开连接。(如果没有,请参阅上面的“坏消息”。)

不幸的是,它不是屏幕,所以没有真正的重新连接。你可以用 gdb 来模拟它(再次从第一个链接开始):

[...] 通过一些肮脏的黑客手段,重新打开一个进程的 stdout/stderr/stdin 并非不可能。

所以您仍然可以创建一个空白屏幕窗口(例如运行睡眠的窗口)。

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

进程的输出将进入屏幕。它不会附加到该屏幕终端,因此例如 [原文如此] 将终止“睡眠”命令,而不是进程,但这对于 OP 来说已经足够了。

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

答案2

这些问题涉及一个名为 Cryopid 的程序,它可能会对您有所帮助。但是,我没有用过它。

在主机之间移动进程

在 X 会话之间移动 xterm

Nohup 和 screen 进程

相关内容