通常我们的服务器上一些任务,如邮件发送服务,需要以daemon模式运行。使用nohup和screen都可以实现这个目的,但它们的实现机制是不一样的。

nohup通过让子进程忽略SIGHUP信号实现。screen通过开启一个新会话实现。因为screen的父进程是初始化进程init(pid=1),所以当我们断开服务器连接时,screen中开启的任务不会收到HUP信号,还会继续运行。

下面,我们通过一个具体的例子进行演示:首先,写一个死循环脚本(loop.sh);然后,分别使用nohup和screen实现daemon模式运行;最后,使用命令:ps xafo pid,ppid,command,查看进程的实际运行情况。

loop.sh代码如下:

#!/bin/bash
while true
do
  echo `date`
  sleep 1
done

nohup

启用命令:

$ nohup bash loop.sh &

进程信息:

 6458   678  \_ sshd: vagrant [priv]
 6475  6458  |   \_ sshd: vagrant@pts/1
 6476  6475  |       \_ -bash
11185  6476  |           \_ bash loop.sh

screen

启用命令:

$ screen # <— 开启会话
$ bash loop.sh # <— 运行进程

使用 Ctrl+a d 退出会话。

进程信息:

 9051     1 SCREEN
 9052  9051  \_ /bin/bash
 9110  9052      \_ bash loop.sh
10835  9110          \_ sleep 1

参考信息