【发布时间】:2010-10-06 03:36:26
【问题描述】:
我有一个 Cygwin bash 脚本,我需要在某些条件下监视和终止它 - 特别是在创建某个文件之后。但是,我很难弄清楚如何以与 Ctrl+C 相同的完整性级别来终止脚本。
这是一个简单的脚本(称为 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 会正常终止,但 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 或等效的,因为可能有多个实例正在运行,我只想杀死特定的实例。
【问题讨论】:
标签: bash process scripting cygwin terminate