我有一个init.d
脚本,我希望它在后台运行,即使我退出终端也是如此。但是我尝试过让它在后台运行,但nohup
“没有希望”,因为当我退出时,通过查看,pstree
我可以看到 PID 消失了,因此nohup
停止了工作。
问:除了nohup
将在前台运行的脚本推送到后台,甚至在退出终端后,还有其他方法吗?
答案1
好的,所以有几个选择:
disown
您可以结合使用disown
并将&
脚本推送到后台
$ disown [your_script] &
[your_script]
可以通过命令检查jobs
。输入后你会看到:
$ jobs
[1]+ Running [your_script]
可以通过 来终止kill %1
,1
指的是上面看到的作业编号。这是 的更好替代方案,nohup
因为它不会让nohup.out
文件散落在文件系统中。
screen
是一个“虚拟”终端,您可以从“真实”终端运行它(实际上,当今的所有终端都是“虚拟”的,但这是另一天的主题)。Screen
即使您的 ssh 会话断开连接,它仍将继续运行。您在会话中启动的任何进程都screen
将与该屏幕会话一起继续运行。当您重新连接到服务器时,您可以重新连接到屏幕会话,除了时间流逝之外,一切都会像什么都没发生一样。
优秀来源:畅谈 UNIX:Screen 助您活力十足”。
答案2
我不能完全理解你的问题但是......
就我而言,我使用它screen
来完成这种长时间运行的后台作业。它提供虚拟终端,可随时连接/断开。因此,我可以从原始会话中注销而无需关闭虚拟会话,并随时恢复该会话。
无论如何,这不适用于 init.d 风格的脚本。
答案3
&
在脚本中的命令后使用如下:
your command here > /dev/null 2>&1 &
exit
答案4
nohup your_command_here > /dev/null 2>&1 &
你需要:
- 使用 nohup 防止进程在退出时被终止
- 将 stdout 和 stderror 从终端的输出流中重定向(否则当终端的输出流在终端退出时被终止时,您的进程将会关闭)
- 将进程置于后台(即尾部的 & 符号)