我正在通过SSH (Putty)在Linux机器上工作。我需要让一个进程在夜间运行,因此我认为可以通过在后台启动该进程(在命令末尾使用&号)并将stdout重定向到一个文件来实现这一点。
令我惊讶的是,这行不通。只要我关闭Putty窗口,进程就会停止。
我怎样才能防止这种情况发生?
我正在通过SSH (Putty)在Linux机器上工作。我需要让一个进程在夜间运行,因此我认为可以通过在后台启动该进程(在命令末尾使用&号)并将stdout重定向到一个文件来实现这一点。
令我惊讶的是,这行不通。只要我关闭Putty窗口,进程就会停止。
我怎样才能防止这种情况发生?
当前回答
我建议使用GNU屏幕。它允许您在所有进程继续运行时断开与服务器的连接。在我知道它存在之前,我不知道没有它是怎么生活的。
其他回答
使用屏幕。它使用起来非常简单,就像终端的vnc一样。 http://www.bangmoney.org/presentations/screen.html
就我个人而言,我喜欢“batch”命令。
$ batch
> mycommand -x arg1 -y arg2 -z arg3
> ^D
这将把它塞到后台,然后将结果邮寄给你。这是cron的一部分。
在systemd/Linux上,systemd-run是一个很好的工具,可以启动与会话无关的进程。
将此字符串附加到您的命令:>&- 2>&- <&- &。>&-表示关闭标准输出。2>&-表示关闭stderr。<&-表示关闭stdin。&意味着在后台运行。这也可以通过ssh以编程方式启动作业:
$ ssh myhost 'sleep 30 >&- 2>&- <&- &'
# ssh returns right away, and your sleep job is running remotely
$
对于大多数进程,您可以使用这个旧的Linux命令行技巧进行伪守护:
# ((mycommand &)&)
例如:
# ((sleep 30 &)&)
# exit
然后启动一个新的终端窗口,然后:
# ps aux | grep sleep
将显示睡眠30仍在运行。
您所做的是将该进程作为子进程的子进程启动,当您退出时,通常会触发该进程退出的nohup命令不会级联到子进程,使其成为一个孤儿进程,仍在运行。
我更喜欢这种“设置好就忘记”的方法,不需要处理nohup、screen、tmux、I/o重定向或任何类似的东西。