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

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

问题描述:

我有一个小问题,我希望有人能帮助我,因为我找不到合适的解决方案。当Linux中的另一个进程结束时终止后台进程

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

我有一个后台进程,睡觉,然后打印一条消息;在进入睡眠状态时,进程运行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的所有进程,但它也正在杀死控制台。我不是最好的脚本,也许这就是为什么这需要我很多时间。先谢谢你。

+0

这看起来像一个问题https://superuser.com/ – Veltro

+0

我不明白你有什么问题。你为什么要谈论“解决一些主机名”,然后你谈论“ping”。 – Jdamian

+0

当您执行ping某个主机时,在ping本身之前主机解析为某个IP。我使用ping命令而不是dig或host(它们不是核心软件包的一部分)来衡量分辨率有多慢。 –

我希望这种方法可以帮助你。我认为一切都非常便携,除了“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!!" 
+1

非常感谢。我会尽快检查它。看来它会做这项工作。 –

+1

肯定的兄弟。只要记住要突出它是正确的,如果它稍后用于你。 (竖起大拇指) –