linux中后台常驻运行脚本

&

首先是我们最经常遇到的符号 &,将它附在命令后面可以使进程在后台执行,不会占用前台界面, 它实际上是在会话中开启了一个后台作业,对作业的操作我们后面再说

脚本内容

for ($i = 0; $i < 10000; $i++) {
    sleep(1);
    echo date('Y-m-d H:i:s', time()).PHP_EOL;
}

查看当前terminalppid

[root@iZ2ze0bp6do7s3u6jz6dsfZ ~]# ps -ef|grep `echo $PPID`
root     12638 21212  0 21:21 ?        00:00:00 sshd: root@pts/0
root     12640 12638  0 21:21 pts/0    00:00:00 -bash

后台运行index.php

使用&后台执行php index.php并记录日志到log1.log

[root@iZ2ze0bp6do7s3u6jz6dsfZ ~]# php index.php >> log1.log 2>&1 &
[1] 12687

查看当前terminaljobs

[root@iZ2ze0bp6do7s3u6jz6dsfZ ~]# jobs
[1]+  运行中               php index.php >> log1.log 2>&1 &

ps查看脚本情况

这里我们也看到了父id是12640

[root@iZ2ze0bp6do7s3u6jz6dsfZ ~]# ps -ef | grep index.php
root     12687 12640  0 21:29 pts/0    00:00:00 php index.php
root     12698 12640  0 21:32 pts/0    00:00:00 grep --color=auto index.php

这个时候,我们直接关掉terminal

这里的关掉分两种,一种是主动退出,一种是由于网络原因断开,我这里是command+w直接退出,退出时间是在 2018-04-14 21:33:47

[root@iZ2ze0bp6do7s3u6jz6dsfZ ~]# tail -f log1.log
2018-04-14 21:33:44
2018-04-14 21:33:45
2018-04-14 21:33:46
2018-04-14 21:33:47
2018-04-14 21:33:48
2018-04-14 21:33:49
2018-04-14 21:33:50
2018-04-14 21:33:51
2018-04-14 21:33:52
2018-04-14 21:33:53

这个时候,我们发现了脚本受到了HUB信号的影响,我们本应该后台常驻的脚本退出了

使用exit退出terminal

这个时候情况会和上面不太一样,这时候由于父进程退出了,脚本的ppid会变成1,成了孤魂野鬼,当然,脚本也会在后台一直跑

[root@iZ2ze0bp6do7s3u6jz6dsfZ ~]# ps -ef | grep index.php
root     12725     1  0 21:38 ?        00:00:00 php index.php
root     12746 12729  0 21:38 pts/2    00:00:00 grep --color=auto index.php

这时候,是否要用kill来杀掉进程呢...我也不知道啊..

nohup

nohup 无疑能通过忽略 HUP 信号来使我们的进程避免中途被中断

其他的几种方式,没有研究.以后再补全吧

参考文献

Linux 技巧:让进程在后台可靠运行的几种方法

Linux - 请允许我静静地后台运行