我正在通过SSH(Putty)在Linux机器上工作。 我需要在晚上期间让一个进程一直运行,所以我认为我可以在命令末尾使用&符号将进程放入后台并将stdout重定向到文件中。
令我惊讶的是,这并不起作用。 一旦关闭Putty窗口,进程就会停止。
我该如何防止这种情况发生?
我正在通过SSH(Putty)在Linux机器上工作。 我需要在晚上期间让一个进程一直运行,所以我认为我可以在命令末尾使用&符号将进程放入后台并将stdout重定向到文件中。
令我惊讶的是,这并不起作用。 一旦关闭Putty窗口,进程就会停止。
我该如何防止这种情况发生?
如果您使用screen以root身份运行进程,请注意特权提升攻击的可能性。如果您自己的帐户以某种方式被攻破,将有一种直接方式接管整个服务器。
如果此进程需要定期运行,并且您在服务器上具有足够的访问权限,则更好的选择是使用cron来运行作业。您还可以使用init.d(超级守护程序)在后台启动进程,并且它可以在完成后立即终止。
Nohup允许客户端进程在父进程被杀死时不被终止,例如当您退出时。更好的方法是使用:
nohup /bin/sh -c "echo \$\$ > $pidfile; exec $FOO_BIN $FOO_CONFIG " > /dev/null
Nohup让您启动的进程免受终止影响,即使在您注销时,SSH会话及其子进程也不会被终止。我提供的命令可以为您提供一种方式,您可以将应用程序的pid存储在pid文件中,以便稍后正确地将其终止,并允许进程在您注销后继续运行。
还有一个开源的libslack软件包中的daemon命令。
daemon
非常灵活可配置,会处理所有繁琐的守护进程操作,如自动重启、日志记录或pid文件处理。
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
将此字符串附加到您的命令中:>&- 2>&- <&- &. >&- 表示关闭标准输出。 2>&- 表示关闭标准错误输出。 <&- 表示关闭标准输入。 & 表示在后台运行。 这也适用于通过ssh编程方式启动作业:
$ ssh myhost 'sleep 30 >&- 2>&- <&- &'
# ssh returns right away, and your sleep job is running remotely
$
screen will background your process without losing interactive control to it
顺便提一下,这是一个我从来不会首先问的问题:) ... 我在任何Unix系统中开始做任何事情时都使用screen ... 我几乎从不在Unix/Linux shell中工作而不先启动screen ... 如果我继续下去,就会无休止地介绍screen的好处以及它对你有什么用处...自己查一下,值得一试 ;)
&
(异步执行)是由 1971 年的 Thompson shell 引入的,用于 UNIX 的 第一个 版本... 因此它从一开始就存在了;-) 可惜,我太保守了——实际上已经过去了 41 年。(旁注:请参见 Tmux) - anthonyrisingerhttps://www.rackaid.com/blog/linux-screen-tutorial-and-how-to/#starting