linux – 按Ctrl-C会停止bash脚本,但不要停止脚本调用的PHP脚本
发布时间:2020-12-14 02:29:00 所属栏目:Linux 来源:网络整理
导读:我需要每隔几分钟运行一些脚本.这个逻辑是用 PHP制作的,而且效果很好.为了使事情保持在一起,我在下面制作了bash脚本,这也运行良好. #!/bin/bashcalculaDiff() { DIFF=0 while [ "$DIFF" -eq "0" ]; do DIFF=`php calculaDiff.php` done;}# need to calculate
我需要每隔几分钟运行一些脚本.这个逻辑是用
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 } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |