我们远程登录linux服务器,希望退出终端后,启动的命令仍然在后台运行。
首先要说明的是,让程序以daemon方式运行,应该要求更复杂一点,参见 https://en.wikipedia.org/wiki/Daemon_(computing)。
我们的简单要求,希望退出终端后命令仍然运行,实际上是希望消除终端退出对命令进程的影响。就我所知,这主要是消除SIGHUP信号和终端设备失效对启动的命令进程的影响。第二个影响主要是终端启动命令后,命令的标准输出和标准错误都是打开为终端设备,比如/dev/pts/1(标准也是如此),比如:
# ll /proc/3443/fd
总用量 0
lrwx------ 1 root root 64 5月 5 17:07 0 -> /dev/pts/1
lrwx------ 1 root root 64 5月 5 17:07 1 -> /dev/pts/1
lrwx------ 1 root root 64 5月 5 17:07 2 -> /dev/pts/1
1. 消除SIGHUP的影响
使用nohup命令或者将要启动的命令放到一个脚本中,然后给脚本执行权限后,执行脚本。如果没有指定重定向的,nohup也会将标准输出和标准错误重定向到nohup.out文件。
2. 消除设备失效的影响
当所用终端退出后,设备比如/dev/pts/1就会失效,会变成如下所示状态:
# ll /proc/3443/fd
总用量 0
lrwx------ 1 root root 64 5月 5 17:07 0 -> /dev/pts/1 (deleted)
lrwx------ 1 root root 64 5月 5 17:07 1 -> /dev/pts/1 (deleted)
lrwx------ 1 root root 64 5月 5 17:07 2 -> /dev/pts/1 (deleted)
此时进程还不会退出,直到进程真正通过这些文件描述进行io的时候,才会出错退出——所以如果进程确实没有任何输入输出,那么不做重定向在终端退出后也可以后台长时间运行。
如何消除呢?主要通过重定向将相关文件描述符和终端设备脱离。 & 表示后台运行,刚好就会将 标准输入,即0重定向到/dev/null,nohup刚才也说了也会执行重定向;如果是在脚本中启动命令就需要自己进行重定向。
总结:
使用下面命令形式基本可以保证命令在后台运行,不会因为终端退出而终止。
1. 终端启动命令
nohup cmd &
nohup cmd 1>file1 2>fil2 &
nohup cmd &>file &
2. 脚本中启动命令
cmd 1>file1 2>fil2 &
cmd &>file &