如何从bash脚本中终止Cygwin bash中脚本的进程树

Bar*_*lly 3 bash scripting cygwin process terminate

我有一个Cygwin bash脚本,我需要在某些条件下观察和终止 - 特别是在创建某个文件后.但是,我很难确定如何以与Ctrl + C完全相同的完整性来终止脚本.

这是一个简单的脚本(称为test1),只需要等待即可终止.

#!/bin/bash

test -f kill_me && rm kill_me

touch kill_me
tail -f kill_me
Run Code Online (Sandbox Code Playgroud)

如果此脚本在前台运行,则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
Run Code Online (Sandbox Code Playgroud)

如果运行此命令,则后台运行的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
Run Code Online (Sandbox Code Playgroud)

tail 这个脚本运行后仍然在闲逛.

在我的实际情况中,创建文件的过程并不是特别有用,所以我不能让它自行终止; 通过找出它何时创建了一个特定的文件,我可以在那时知道终止它是可以的.不幸的是,我不能使用简单killall或等效的,因为可能有多个实例在运行,我只想杀死特定的实例.

and*_*otn 6

/ bin/kill(程序,而不是bash builtin)将 PID 解释为"杀死进程组",这也将获得所有子进程.

更改

kill %1
Run Code Online (Sandbox Code Playgroud)

/bin/kill -- -$$
Run Code Online (Sandbox Code Playgroud)

适合我.