我正在通过SSH (Putty)在Linux机器上工作。我需要让一个进程在夜间运行,因此我认为可以通过在后台启动该进程(在命令末尾使用&号)并将stdout重定向到一个文件来实现这一点。

令我惊讶的是,这行不通。只要我关闭Putty窗口,进程就会停止。

我怎样才能防止这种情况发生?


当前回答

就我个人而言,我喜欢“batch”命令。

$ batch
> mycommand -x arg1 -y arg2 -z arg3
> ^D

这将把它塞到后台,然后将结果邮寄给你。这是cron的一部分。

其他回答

如果父进程被杀死,Nohup允许不杀死客户端进程,以便在注销时进行论证。更好的用法是:

nohup /bin/sh -c "echo \$\$ > $pidfile; exec $FOO_BIN $FOO_CONFIG  " > /dev/null

Nohup使您启动的进程不受终止的影响,当您退出时,SSH会话及其子进程将被终止。我给出的命令提供了一种方法,可以将应用程序的pid存储在pid文件中,以便稍后正确地终止它,并允许进程在注销后运行。

将此字符串附加到您的命令:>&- 2>&- <&- &。>&-表示关闭标准输出。2>&-表示关闭stderr。<&-表示关闭stdin。&意味着在后台运行。这也可以通过ssh以编程方式启动作业:

$ ssh myhost 'sleep 30 >&- 2>&- <&- &'
# ssh returns right away, and your sleep job is running remotely
$

如果使用screen作为根用户运行进程,请注意特权提升攻击的可能性。如果你自己的帐户以某种方式被泄露,将有一种直接的方式接管整个服务器。

如果需要定期运行此进程,并且您对服务器有足够的访问权限,那么更好的选择是使用cron来运行该作业。你也可以使用init。D(超级守护进程)在后台启动您的进程,并且它可以在完成后立即终止。

我使用屏幕命令。这个链接详细说明了如何做到这一点

https://www.rackaid.com/blog/linux-screen-tutorial-and-how-to/#starting

在systemd/Linux上,systemd-run是一个很好的工具,可以启动与会话无关的进程。