注解:
dump为研发人员开发的程序;
test.sh为测试nohup的脚本,脚本内容见20行-35行。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
<code>[root@ce340 gliver]</code><code># killall dump</code>
<code>[root@ce340 gliver]</code><code># ps -c test.sh</code>
<code> </code><code>pid tty time cmd</code>
<code>15711 pts</code><code>/0</code> <code>00:00:00 </code><code>test</code><code>.sh</code>
<code>[root@ce340 gliver]</code><code># killall test.sh</code>
<code>[1]+ terminated </code><code>nohup</code> <code>.</code><code>/test</code><code>.sh > </code><code>/dev/null</code> <code>2>&1</code>
<code>[root@ce340 gliver]</code><code># nohup ./test.sh >/dev/null 2>&1 &</code>
<code>[1] 18531</code>
<code>18531 pts</code><code>/0</code> <code>00:00:00 </code><code>test</code><code>.sh</code>
<code>19603 pts</code><code>/0</code> <code>00:00:00 </code><code>test</code><code>.sh</code>
<code>[root@ce340 gliver]</code><code># ps -c dump</code>
<code>17722 pts</code><code>/0</code> <code>00:00:05 dump</code>
<code>20837 pts</code><code>/0</code> <code>00:00:00 dump</code>
<code>[root@ce340 gliver]</code><code># cat ./test.sh</code>
<code>#!/bin/bash</code>
<code>while</code> <code>:</code>
<code>do</code>
<code>if</code> <code>[[ ! `</code><code>ps</code> <code>-ef | </code><code>grep</code> <code>dump | </code><code>grep</code> <code>-</code><code>v</code> <code>grep</code><code>` ]]; </code><code>then</code>
<code>echo</code> <code>"down"</code>
<code>#log to file</code>
<code>echo</code> <code>"the deamon down at $(date)"</code> <code>>> </code><code>/home/user/desktop/gliver/dump</code><code>.log</code>
<code>su</code> <code>-l -c </code><code>"nohup /home/user/desktop/gliver/dump rtmp://172.16.172.211/livepkgr/livestream >/dev/null 2>&1 &"</code>
<code># start time</code>
<code>echo</code> <code>"the deamon start at $(date)"</code> <code>>> </code><code>/home/user/desktop/gliver/dump</code><code>.log</code>
<code>fi</code>
<code>usleep 1000</code>
<code>done</code>
<code>[root@ce340 gliver]</code><code>#</code>
总结:
当执行nohup时,并不是创建一个当前进程的父进程,而是nohup能让后面紧跟的命令忽略 hangup 信号,通过忽略hup信号来避免进程中途被中断,正如运行pstree -npu或ps -ef的第三列展示的那样。
其次nohup后面紧跟进程名,如果进程名所指向的进程接受参数,则进程名后面跟着的参数将传入进程名所指向的进程,否则将被丢弃,但重定向似乎是个例外,重定向不仅会作用于nohup本身又能作用于进程名指向的进程。
ps:一旦使用nohup,就不能使用“kill -hup pid”,而是要使用“killall 进程名称”杀死进程。