我有一个 Cygwin bash 脚本,我需要在某些条件下监视和终止它 - 特别是在创建某个文件之后。但是,我很难弄清楚如何以与 Ctrl+C 相同的完整性级别来终止脚本。
这是一个简单的脚本(称为test1
),它只是等待被终止。
#!/bin/bash
test -f kill_me && rm kill_me
touch kill_me
tail -f kill_me
如果此脚本在前台运行,Ctrl+C 将终止tail
脚本本身和脚本本身。如果脚本在后台运行,a 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
或等效的,因为可能有多个实例正在运行,我只想杀死特定的实例。