天天看点

深入了解nohup

注解:

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 &gt; </code><code>/dev/null</code> <code>2&gt;&amp;1</code>

<code>[root@ce340 gliver]</code><code># nohup ./test.sh &gt;/dev/null 2&gt;&amp;1 &amp;</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>&gt;&gt; </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 &gt;/dev/null 2&gt;&amp;1 &amp;"</code>

<code># start time</code>

<code>echo</code> <code>"the deamon start at  $(date)"</code> <code>&gt;&gt; </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 进程名称”杀死进程。