2017-08-03 86 views
-1

我有一個小問題,我希望有人能幫助我,因爲我找不到合適的解決方案。當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(它們不是核心軟件包的一部分)來衡量分辨率有多慢。 –

回答

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!!" 
+1

非常感謝。我會盡快檢查它。看來它會做這項工作。 –

+1

肯定的兄弟。只要記住要突出它是正確的,如果它稍後用於你。 (豎起大拇指) –

相關問題