linux – 按Ctrl-C会停止bash脚本,但不要停止脚本调用的PHP脚本

我需要每隔几分钟运行一些脚本.这个逻辑是用 PHP制作的,而且效果很好.为了使事情保持在一起,我在下面制作了bash脚本,这也运行良好.
#!/bin/bash

calculaDiff() {
    DIFF=0

    while [ "$DIFF" -eq "0" ]; do
        DIFF=`PHP calculaDiff.PHP`
    done;
}

# need to calculate pending diffs
calculaDiff

# main loop
while true; do
    CAPTURA=`PHP capturaRelatorio.PHP`
    if [ "$CAPTURA" -eq "0" ]; then
        calculaDiff
    fi

    VERIFICA=`PHP verificaLimites.PHP`

done

脚本capturaRelatorio.PHP在其中有一个睡眠,因为我每隔N分钟只能处理它.它将打印一条消息,说它正在睡眠S秒,所以我可以监控它.

如果我此时调用bash脚本并按下Ctrl C,当它处于休眠状态时,会终止bash脚本,但不会终止被调用PHP脚本.我知道运行它的过程不同.

那么,有没有办法杀死bash脚本和每个“孩子”?或者我应该采用其他方法来运行这些脚本?

解决方法

从这个回答: bash – How to kill all subprocesses of shell? – Stack Overflow.

如果你只关心杀死直接的孩子,你应该能够做到

pkill -P $$

-P说

-P,--parent ppid,...
      Only match processes whose parent process ID is listed.

而$$表示当前进程的PID.

如果你需要杀死子进程和它们可能启动的任何进程(孙子等等),你应该能够使用对该问题有不同答案的函数

kill_descendant_processes() {
    local pid="$1"
    local and_self="${2:-false}"
    if children="$(pgrep -P "$pid")"; then
        for child in $children; do
            kill_descendant_processes "$child" true
        done
    fi
    if [[ "$and_self" == true ]]; then
        kill "$pid"
    fi
}

像这样

kill_descendant_processes $$true

这将杀死当前进程和所有后代.您可能希望从陷阱处理程序中调用它.也就是说,当您按ctrl c时,您的脚本将被发送SIGINT,您可以捕获该信号并进行处理.例如:

trap cleanup INT

cleanup() {
    kill_descendant_processes $$true
}

相关文章

1、安装Apache。 1)执行如下命令,安装Apache服务及其扩展包...
一、先说一下用ansible批量采集机器信息的实现办法: 1、先把...
安装配置 1. 安装vsftpd 检查是否安装了vsftpd # rpm -qa | ...
如何抑制stable_secret读取关键的“net.ipv6.conf.all.stabl...
1 删除0字节文件 find -type f -size 0 -exec rm -rf {} ...
## 步骤 1:安装必要的软件包 首先,需要确保系统已安装 `dh...