我正在通过SSH (Putty)在Linux机器上工作。我需要让一个进程在夜间运行,因此我认为可以通过在后台启动该进程(在命令末尾使用&号)并将stdout重定向到一个文件来实现这一点。
令我惊讶的是,这行不通。只要我关闭Putty窗口,进程就会停止。
我怎样才能防止这种情况发生?
我正在通过SSH (Putty)在Linux机器上工作。我需要让一个进程在夜间运行,因此我认为可以通过在后台启动该进程(在命令末尾使用&号)并将stdout重定向到一个文件来实现这一点。
令我惊讶的是,这行不通。只要我关闭Putty窗口,进程就会停止。
我怎样才能防止这种情况发生?
当前回答
我使用屏幕命令。这个链接详细说明了如何做到这一点
https://www.rackaid.com/blog/linux-screen-tutorial-and-how-to/#starting
其他回答
使用屏幕。它使用起来非常简单,就像终端的vnc一样。 http://www.bangmoney.org/presentations/screen.html
如果使用screen作为根用户运行进程,请注意特权提升攻击的可能性。如果你自己的帐户以某种方式被泄露,将有一种直接的方式接管整个服务器。
如果需要定期运行此进程,并且您对服务器有足够的访问权限,那么更好的选择是使用cron来运行该作业。你也可以使用init。D(超级守护进程)在后台启动您的进程,并且它可以在完成后立即终止。
接受的回答建议使用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
还有开源libslack包的daemon命令。
Daemon是相当可配置的,并且关心所有繁琐的守护进程的东西,如自动重启、日志记录或pidfile处理。
如果你想同时运行X个应用程序,可以使用xpra和“screen”。