我写了一个简单的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
使用22880
向kill -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
进程继续运行,我需要做什么?
答案 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`