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

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

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


当前回答

对于大多数进程,您可以使用这个旧的Linux命令行技巧进行伪守护:

# ((mycommand &)&)

例如:

# ((sleep 30 &)&)
# exit

然后启动一个新的终端窗口,然后:

# ps aux | grep sleep

将显示睡眠30仍在运行。

您所做的是将该进程作为子进程的子进程启动,当您退出时,通常会触发该进程退出的nohup命令不会级联到子进程,使其成为一个孤儿进程,仍在运行。

我更喜欢这种“设置好就忘记”的方法,不需要处理nohup、screen、tmux、I/o重定向或任何类似的东西。

其他回答

接受的回答建议使用nohup。我建议用pm2。使用pm2而不是nohup有很多优点,比如保持应用程序处于活动状态,维护应用程序的日志文件以及许多其他特性。要了解更多细节,请查看这个。

安装pm2需要下载npm。基于Debian的系统

sudo apt-get install npm

还有红帽公司

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运行。你得修改一下杰森的档案。将“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

看看“nohup”程序。

我建议使用GNU屏幕。它允许您在所有进程继续运行时断开与服务器的连接。在我知道它存在之前,我不知道没有它是怎么生活的。

使用屏幕。它使用起来非常简单,就像终端的vnc一样。 http://www.bangmoney.org/presentations/screen.html

nohup blah &

用您的进程名替换blah!