通过进程PID执行nohup命令(类似于AIX的nohup -p)来对已经运行的进程进行处理。

4

我遇到这样一个问题,无法在Linux RHEL 6.6中运行nohup -p <processid>,它会提示此选项不受支持。我阅读了man手册,在Linux中只有--help--version作为选项。

是否有其他替代方法可以使已经运行的进程在退出运行终端后仍能存活?


1
此外,坦率地说,“nohup”通常是相当无用的。将标准输入、标准输出和标准错误重定向到非TTY源;告诉shell设置HUP信号以被丢弃,使用“disown”内置命令从shell的进程表中删除作业,这样就可以完成所有“nohup”本来要做的事情,而不需要使用该命令。 - Charles Duffy
@CharlesDuffy,所以三个步骤可以在一个nohup中完成? - Krzysztof Krasoń
2
啊,但是你的三个步骤强制用户思考他们正在做什么并做出明确的决定,而你的“一个nohup”则有一个完全愚蠢的nohup.out重定向目标默认值。 - Charles Duffy
1个回答

4

其中一部分很容易:要从shell的进程表中删除作业,您可以使用disown命令。

不容易的部分是将stdout和stderr重定向到TTY之外。为此,您可以使用gdb来控制进程并告诉它替换stdin、stdout和stderr(请注意,您需要确保这也适用于其他子进程或线程,它们同样需要在退出操作后继续存在):

# for an instance of /path/to/program with PID 1234

# note that this is intended to be a transcript of content typed at a prompt -- it isn't a
# working shell script, since the commands after "gdb" are to be run *by gdb*, not the
# shell.

gdb /path/to/program
attach 1234
p dup2(open("/dev/null", 1), 0)
p dup2(open("stdout-file", 1), 1)
p dup2(open("stderr-file", 1), 2)
detach
quit

这是一个名为dupx的工具,它已经被自动化了。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接