![当一个程序/进程在没有 nohup 的情况下在 bash 中启动时,即使在 shell/终端关闭后,以后是否可以让该程序运行](https://linux22.com/image/200192/%E5%BD%93%E4%B8%80%E4%B8%AA%E7%A8%8B%E5%BA%8F%2F%E8%BF%9B%E7%A8%8B%E5%9C%A8%E6%B2%A1%E6%9C%89%20nohup%20%E7%9A%84%E6%83%85%E5%86%B5%E4%B8%8B%E5%9C%A8%20bash%20%E4%B8%AD%E5%90%AF%E5%8A%A8%E6%97%B6%EF%BC%8C%E5%8D%B3%E4%BD%BF%E5%9C%A8%20shell%2F%E7%BB%88%E7%AB%AF%E5%85%B3%E9%97%AD%E5%90%8E%EF%BC%8C%E4%BB%A5%E5%90%8E%E6%98%AF%E5%90%A6%E5%8F%AF%E4%BB%A5%E8%AE%A9%E8%AF%A5%E7%A8%8B%E5%BA%8F%E8%BF%90%E8%A1%8C.png)
当程序/进程在 bash 中启动时没有 nohup
,以后是否可以(进一步做一些事情)让该程序即使在 shell/终端关闭后也运行。
这里有一个很棒的讨论nohup、disown 和 & 之间的区别如果有人有兴趣参考一下。
在这个问题中,我想分享我对程序何时在没有 nohup 的情况下启动的观察。
编辑 - 请忽略原来的问题。是的,在disown
ing 进程之后,杀死终端/shell 似乎并不重要。该过程似乎正在运行。即使原始终端关闭后,我也ps -ef | grep java
能看到进程正在运行。
答案1
由于您上面描述的限制,不可能有办法在终端关闭后保持进程运行。为什么?尽管有该disown
进程,终端内的 shell 仍然是该java -jar myapp.jar
进程的父进程。虽然disown
告诉 shell 进程不要向 发送 HUP 信号java
,但当您关闭终端时,bash 进程首先被杀死,shell 的父进程然后继承该java
进程。然后,该新父进程将发送一个 HUP tp ,尝试清理其所有继承的进程,并且只有提前java
使用才能阻止进程接收 HUP 信号并对其进行操作。nohup
java
答案2
我认为您询问的原因是您已经直接启动命令并希望在注销后保持它运行,而且您仍然希望能够控制它。
有几个因素可以控制进程的生命周期。最重要的两个方面是父进程(或进程组)和控制终端。
如果您运行任何交互式命令,您可以轻松地将其发送到后台(停止“ctrl+z”并在后台“bg”中继续)。
现在是棘手的部分 - 将进程附加到不同的进程组(和终端)。对于终端,我通常使用“屏幕”并重新连接终端 -https://github.com/nelhage/reptyr
当然,这个工具还有其他替代品。同样重要的是,并非所有进程在此操作后都会正常运行,因此您的里程可能会有所不同。