当另一个进程在Linux中结束时,终止后台进程

时间:2017-08-03 14:59:43

标签: linux bash shell scripting hostname

我有一个小问题,我希望有人可以帮助我,因为我找不到合适的解决方案。

我想解析一个主机名;在等待结果时,如果使用shell脚本命令(最好是内置命令或无处不在的系统命令)需要超过30秒,我想打印一个通知。

我有一个后台进程,它会休眠,然后打印一条消息;在休眠时,进程运行ping,但我无法弄清楚如何在ping完成后终止后台进程,即使ping在30秒时间限制之前结束,消息也会继续打印,因为这是部分更大的脚本,需要一些时间来运行。

以下是我一直在使用的代码:

((sleep 30; echo "Querying the DNS server takes more than 30 seconds.") & ping -q -c 1 localhost >/dev/null)

我非常感谢任何帮助。也欢迎其他解决方案;我只想告诉用户DNS太慢,这将影响进一步的执行。我试过ping -w或-W但这不是测量分辨率的时间。我试图从ping中捕获结果。我试图使用相同的GPID杀死所有进程,但它也会杀死控制台。我不是最好的脚本,也许这就是为什么这需要我这么多时间。提前谢谢。

1 个答案:

答案 0 :(得分:1)

我希望这种方法可以帮到你。我认为除了“bc”之外,一切都非常便携。如果你需要,我可以给你一个“无bc”版本。祝你好运!

 #!/bin/bash

timeout=10; ## This is how long to wait before doing some batshit!
printed=1; ## this is how many times you want the message displayed (For  #instance, you might want a message EVERY X seconds)                        
starttime="$( date +%F ) $( date +%T.%3N )"

################### HERE GOES YOUR BACKGROUND PROCESS
sleep 30 &
#######################################################
processId=$!  ## And here we got the procees Id
#######################################################

while [ ! -z "$( ps -ef | grep $processId | grep -v grep )" ]
do
    endtime="$( date +%F ) $( date +%T.%3N )";
    timeelapsed=$( echo " $(date -d "$endtime" "+%s" ) - $(date -d "$starttime" "+%s" ) " | bc );
    if [[ ($timeelapsed -gt $timeout) && ($printed -ne 0) ]]
    then
            echo "This is taking more than $timeout seconds";
            printed=$(( printed - 1 ));
            starttime="$( date +%F ) $( date +%T.%3N )"
      fi
done


  ### Do something once everything finished
  echo "The background process ended!!"