如何在Linux中关闭SSH客户端后防止后台进程被停止

308

我正在通过SSH(Putty)在Linux机器上工作。 我需要在晚上期间让一个进程一直运行,所以我认为我可以在命令末尾使用&符号将进程放入后台并将stdout重定向到文件中。

令我惊讶的是,这并不起作用。 一旦关闭Putty窗口,进程就会停止。

我该如何防止这种情况发生?


如果您想强制会话保持打开状态,请参阅https://dev59.com/4F8f5IYBdhLWcg3wD_Av - tripleee
20个回答

5

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

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


5

Nohup允许客户端进程在父进程被杀死时不被终止,例如当您退出时。更好的方法是使用:

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

Nohup让您启动的进程免受终止影响,即使在您注销时,SSH会话及其子进程也不会被终止。我提供的命令可以为您提供一种方式,您可以将应用程序的pid存储在pid文件中,以便稍后正确地将其终止,并允许进程在您注销后继续运行。


3

还有一个开源的libslack软件包中的daemon命令。

daemon非常灵活可配置,会处理所有繁琐的守护进程操作,如自动重启、日志记录或pid文件处理。


这非常有用,因为它甚至让你做一些坏事情,其他命令不会让你这样做(因为它们不给你输入密码的机会):sudo daemon xed - mmortal03

3

3
接受的答案建议使用nohup。我更倾向于建议使用pm2。使用pm2比使用nohup有很多优点,如保持应用程序的活动状态、维护应用程序的日志文件以及许多其他功能。要了解更多详细信息,请查看这里
要安装pm2,您需要下载npm。对于基于Debian的系统:
sudo apt-get install npm

对于Redhat

sudo yum install npm

您可以按照这些说明进行操作。 安装npm后,使用它来安装pm2

npm install pm2@latest -g

完成后,您可以通过 开始运行您的应用程序。
$ pm2 start app.js              # Start, Daemonize and auto-restart application (Node)
$ pm2 start app.py              # Start, Daemonize and auto-restart application (Python)

用以下命令进行进程监控:

$ pm2 list                      # List all processes started with PM2
$ pm2 monit                     # Display memory and cpu usage of each app
$ pm2 show [app-name]           # Show all informations about application

使用应用程序名称或进程ID管理进程,或同时管理所有进程:

$ pm2 stop     <app_name|id|'all'|json_conf>
$ pm2 restart  <app_name|id|'all'|json_conf>
$ pm2 delete   <app_name|id|'all'|json_conf>

日志文件可以在以下位置找到

$HOME/.pm2/logs #contain all applications logs

二进制可执行文件也可以使用pm2运行。您需要修改jason文件。将 "exec_interpreter" : "node" 改为 "exec_interpreter" : "none". (请参见属性部分)。

#include <stdio.h>
#include <unistd.h>  //No standard C library
int main(void)
{
    printf("Hello World\n");
    sleep (100);
    printf("Hello World\n");

    return 0;
}

编译上述代码。
gcc -o hello hello.c  

并在后台使用np2运行它

pm2 start ./hello

这个能用来运行二进制可执行文件吗? - GetFree
@GetFree;是的,你可以。 - haccks
请添加一个示例。目前的答案似乎只适用于脚本文件。 - GetFree
@GetFree;已添加示例。如果您有任何问题,请告诉我。 - haccks

2

将此字符串附加到您的命令中:>&- 2>&- <&- &. >&- 表示关闭标准输出。 2>&- 表示关闭标准错误输出。 <&- 表示关闭标准输入。 & 表示在后台运行。 这也适用于通过ssh编程方式启动作业:

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

2
如果您愿意运行X应用程序,可以使用xpra和"screen"一起使用。

2
我还会使用screen程序(我知道有人已经回答了screen,但这是为了完整性)。
不仅 &、ctrl+z bg disown、nohup等命令可能会在您注销后终止进程(我不知道为什么,但这确实发生过,虽然我并不介意使用screen解决此问题,但我猜Anthonyrisinger的解决方案双重fork也可以解决此问题),而且screen相比仅仅在后台运行有一个主要优势:
screen will background your process without losing interactive control to it

顺便提一下,这是一个我从来不会首先问的问题:) ... 我在任何Unix系统中开始做任何事情时都使用screen ... 我几乎从不在Unix/Linux shell中工作而不先启动screen ... 如果我继续下去,就会无休止地介绍screen的好处以及它对你有什么用处...自己查一下,值得一试 ;)


PS anthonyrisinger,你很厉害,我承认,但是...30年?我敢打赌那是在&、bg、nohup或screen还没有出现的时候使用的解决方案,无意冒犯,我欣赏你的知识,但这太复杂了,不好用 :) - THESorcerer
2
尽管这远在我之前 [1987],但 &(异步执行)是由 1971 年的 Thompson shell 引入的,用于 UNIX 的 第一个 版本... 因此它从一开始就存在了;-) 可惜,我太保守了——实际上已经过去了 41 年。(旁注:请参见 Tmux) - anthonyrisinger

1

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

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