Linux下面让程序保持后台运行

发布时间 2023-05-05 17:30:56作者: oneinmore

我们远程登录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 &