通常我们的服务器上一些任务,如邮件发送服务,需要以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