我有一个Cygwin bash脚本,我需要在特定条件下观察并终止 - 具体来说,在创建某个文件后。不过,我很难理解如何以与Ctrl + C完全相同的级别终止脚本。如何从bash脚本中终止脚本的Cygwin bash中的进程树
这是一个简单的脚本(称为test1
),只是等待被终止。
#!/bin/bash
test -f kill_me && rm kill_me
touch kill_me
tail -f kill_me
如果这个脚本在前台运行,按Ctrl + C将终止两个tail
和脚本本身。如果脚本在后台运行,kill %1
(假设它是作业1)也将终止tail
和脚本。
但是,当我尝试从脚本执行相同的操作时,我发现只有运行脚本的bash
进程终止,而tail
挂起时与其父级断开连接。这里有一种方法我试过(test2
):
#!/bin/bash
test -f kill_me && rm kill_me
(
touch kill_me
tail -f kill_me
) &
while true; do
sleep 1
test -f kill_me && {
kill %1
exit
}
done
如果这样运行,在bash在后台运行的子shell终止OK,但仍tail
周围挂起。
如果我使用一个显式单独的脚本,这样,它仍然不起作用(test3
):
#!/bin/bash
test -f kill_me && rm kill_me
# assuming test1 above is included in the same directory
./test1 &
while true; do
sleep 1
test -f kill_me && {
kill %1
exit
}
done
tail
运行此脚本后,仍挂在。
在我的实际案例中,创建文件的过程并不是特别可操作的,所以我无法自己终止它;通过查明它何时创建了一个特定的文件,我可以在那一刻知道终止它是可以的。不幸的是,我不能使用一个简单的killall
或等价物,因为可能有多个实例在运行,而我只想杀死特定的实例。
谢谢!奇怪的是,这并没有在Cygwin kill man页面中记录。但是,它确实与Cygwin版本的kill相配合。 – 2009-02-09 10:15:06