我有一个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
或等效的,因为可能有多个实例在运行,我只想杀死特定的实例.
/ bin/kill(程序,而不是bash builtin)将负 PID 解释为"杀死进程组",这也将获得所有子进程.
更改
kill %1
至
/bin/kill -- -$$
适合我.