当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《如何从bash脚本中终止Cygwinbash中脚本的进程树》经验,为你挑选了1个好方法。

我有一个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或等效的,因为可能有多个实例在运行,我只想杀死特定的实例.



1> andrewdotn..:

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

更改

kill %1

/bin/kill -- -$$

适合我.

推荐阅读
无名有名我无名_593
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有