我正在通过SSH (Putty)在Linux机器上工作。我需要让一个进程在夜间运行,因此我认为可以通过在后台启动该进程(在命令末尾使用&号)并将stdout重定向到一个文件来实现这一点。
令我惊讶的是,这行不通。只要我关闭Putty窗口,进程就会停止。
我怎样才能防止这种情况发生?
我正在通过SSH (Putty)在Linux机器上工作。我需要让一个进程在夜间运行,因此我认为可以通过在后台启动该进程(在命令末尾使用&号)并将stdout重定向到一个文件来实现这一点。
令我惊讶的是,这行不通。只要我关闭Putty窗口,进程就会停止。
我怎样才能防止这种情况发生?
当前回答
如果您想将详细信息记录到一个文件中,Nohup非常有用。但当它进入后台时,如果你的脚本要求,你无法给它一个密码。我想你一定要试一下屏幕。它是一个实用工具,你可以使用yum安装在你的linux发行版上,例如在CentOS上yum安装屏幕,然后通过putty或其他软件在你的shell类型屏幕上访问你的服务器。它将打开屏幕[0]在腻子。做好你的工作。你可以在同一个putty会话中创建更多的screen[1], screen[2]等。
你需要知道的基本命令:
启动屏幕
屏幕
创建下一个屏幕
ctrl + a + c
移动到您创建的下一个屏幕
ctrl + a + n
要分离
ctrl + a + d
在工作期间关闭腻子。下次当你登录通过putty类型
屏幕- r
重新连接到屏幕,您可以看到您的进程仍在屏幕上运行。要退出屏幕,输入#exit。
欲了解更多细节,请参阅男子界面。
其他回答
正如其他人所指出的,要在后台运行进程以便与SSH会话断开连接,您需要让后台进程正确地与它的控制终端断开关联——这是SSH会话使用的伪tty。
您可以在Stevens的“高级网络程序,第1卷,第3版”或Rochkind的“高级Unix编程”等书籍中找到有关守护进程的信息。
最近(在过去的几年里),我不得不处理一个不听话的程序,它没有正确地守护自己。最后,我创建了一个通用的daemonizing程序来解决这个问题——类似于nohup,但是有更多的控件。
Usage: daemonize [-abchptxV][-d dir][-e err][-i in][-o out][-s sigs][-k fds][-m umask] -- command [args...]
-V print version and exit
-a output files in append mode (O_APPEND)
-b both output and error go to output file
-c create output files (O_CREAT)
-d dir change to given directory
-e file error file (standard error - /dev/null)
-h print help and exit
-i file input file (standard input - /dev/null)
-k fd-list keep file descriptors listed open
-m umask set umask (octal)
-o file output file (standard output - /dev/null)
-s sig-list ignore signal numbers
-t truncate output files (O_TRUNC)
-p print daemon PID on original stdout
-x output files must be new (O_EXCL)
在没有使用GNU getopt()函数的系统上,双破折号是可选的;这在Linux等环境中是必要的(或者你必须在环境中指定POSIXLY_CORRECT)。由于双破折号在任何地方都适用,所以最好使用它。
如果你想要daemon的源代码,你仍然可以联系我(firstname . lastname at gmail . com)。
然而,代码现在(终于)在GitHub上我的SOQ(堆栈)中可用 溢出问题)存储库为文件daemonize-1.10。TGZ在 包 子目录。
接受的回答建议使用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处理。
如果您想将详细信息记录到一个文件中,Nohup非常有用。但当它进入后台时,如果你的脚本要求,你无法给它一个密码。我想你一定要试一下屏幕。它是一个实用工具,你可以使用yum安装在你的linux发行版上,例如在CentOS上yum安装屏幕,然后通过putty或其他软件在你的shell类型屏幕上访问你的服务器。它将打开屏幕[0]在腻子。做好你的工作。你可以在同一个putty会话中创建更多的screen[1], screen[2]等。
你需要知道的基本命令:
启动屏幕
屏幕
创建下一个屏幕
ctrl + a + c
移动到您创建的下一个屏幕
ctrl + a + n
要分离
ctrl + a + d
在工作期间关闭腻子。下次当你登录通过putty类型
屏幕- r
重新连接到屏幕,您可以看到您的进程仍在屏幕上运行。要退出屏幕,输入#exit。
欲了解更多细节,请参阅男子界面。
在systemd/Linux上,systemd-run是一个很好的工具,可以启动与会话无关的进程。