大佬教程收集整理的这篇文章主要介绍了linux – 按Ctrl-C会停止bash脚本,但不要停止脚本调用的PHP脚本,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
#!/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秒,@R_948_9447@监控它.
如果我此时调用bash脚本并按下Ctrl C,当它处于休眠状态时,会终止bash脚本,但不会终止被调用的PHP脚本.我知道运行它的过程不同.
那么,有没有办法杀死bash脚本和每个“孩子”?或者我应该采用其他方法来运行这些脚本?
如果你只关心杀死直接的孩子,你应该能够做到
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 }
以上是大佬教程为你收集整理的linux – 按Ctrl-C会停止bash脚本,但不要停止脚本调用的PHP脚本全部内容,希望文章能够帮你解决linux – 按Ctrl-C会停止bash脚本,但不要停止脚本调用的PHP脚本所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。