bash:睡眠过程没有被杀死

时间:2015-12-23 14:48:43

标签: bash shell signals sleep

我写了一个简单的bash脚本,除了睡觉之外什么都不做。

#!/bin/bash

echo "Sleeping..."
sleep 180s

我在运行脚本后看到我的系统上运行了两个进程:

user 22880  0.0  0.0  12428  1412 pts/28   S+   20:12   0:00 /bin/bash ./sleep.sh
user 22881  0.0  0.0   7196   356 pts/28   S+   20:12   0:00 sleep 180s

我使用SIGTERM使用22880kill -15 22880的流程提供user 22881 0.0 0.0 7196 356 pts/28 S 20:12 0:00 sleep 180s ,从而终止流程。但是,在此之后,我仍然看到运行的sleep命令在180秒后退出。

sleep 180s

为什么会这样?如果不让var CollectionArray = {}; var objects = [ 'family1' , 'family2' , 'family3' ]; var familyObject; for ( var i = 0 ; i < objects.length ; i++ ) { familyObject = objects[i]; $( '.' + familyObject + ' input[type="checkbox"]:checked' ).each( function () { !CollectionArray[ familyObject ] && ( CollectionArray[ familyObject ] = [] ); CollectionArray[ familyObject ].push( this.value ); } ); } // CollectionArray.family1 is an array 进程继续运行,我需要做什么?

2 个答案:

答案 0 :(得分:6)

kill -15 22880将向执行脚本的shell发送信号,但不向sleep命令发送信号。要将信号发送到流程中的每个流程,您应该能够指定否定流程ID。

kill -15 -22880

或者,确保脚本在退出之前杀死其子项。

trap 'kill $(jobs -p)' EXIT
echo "Sleeping..."
sleep 180s & wait

如果在接收到信号时将sleep留在前台,则shell必须等到它退出才能运行陷阱; sleep不可中断。解决方法是在后台运行它,然后在wait上运行它。作为内置shell的wait可以被中断,以便陷阱立即运行并杀死仍在进行中的任何后台进程。

答案 1 :(得分:1)

您还可以使用 killall sleep kill -9/15 $(pidof sleep)

9用于终止进程,15用于终止进程

bash$ ps -ef|grep sleep
pratik   24775  2695  0 23:44 pts/0    00:00:00 sleep 600
pratik   24778 24690  0 23:44 pts/29   00:00:00 grep --color=auto sleep
bash$ killall sleep 
bash$ ps -ef|grep sleep
pratik   24792 24690  0 23:44 pts/29   00:00:00 grep --color=auto sleep
bash$
bash$ ps -ef|grep sleep
pratik   24978  2695  0 23:52 pts/0    00:00:00 sleep 600
pratik   24981 24690  0 23:52 pts/29   00:00:00 grep --color=auto sleep
bash$ kill -15 $(pidof sleep)
bash$ ps -ef|grep sleep
pratik   24986 24690  0 23:52 pts/29   00:00:00 grep --color=auto sleep`