天天看點

shell腳本執行逾時怎麼辦?

在shell裡會有一種不太常見的情況,就是腳本有時候會出現逾時的現象。一般來說遇到這種問題,我們都會簡單粗暴的采用下面這種腳本來當“逾時看門狗“:

1

2

3

4

<code>#!/bin/bash</code>

<code>./$1 &amp;    </code><code>#這裡設定背景運作的第一個參數</code>

<code>pid = $!    </code><code>#最後一個運作的process的PID值</code>

<code>sleep</code> <code>$2 &amp;&amp; </code><code>kill</code> <code>-9 $pid &amp;    </code><code>#如果超過了$2的值的話,就會把那個PID幹掉</code>

這個腳本搭配兩個變量使用的話,監控一點小代碼還算OK,但是它的邏輯還是比較粗糙,比如如果在這個腳本執行的時候,又有了一個新的process在背景啟動,那麼kill掉的就是新的process,而本應該停止的腳本還是在背景肆無忌憚的跑着。

為了不濫殺無辜,是以遇到這種情況,就要使用timeout指令,具體的用法請自行#man timeout,這個指令在centos 6裡就是自帶的。

假設我們要ping www.baidu.com ,同時要求“若超過了5秒沒有反應,就停止這個任務”。那麼就是用指令:#timeout 5s ping www.baidu.com,效果如圖:

<a href="https://s1.51cto.com/wyfs02/M01/9C/C4/wKioL1l1veSDGXk0AABEEUKVgSU170.png" target="_blank"></a>

從26秒到31秒,的确達到了5秒就跳出的效果。

首先,我們先運作一下看看這個MQ看門狗腳本需要運作的時間:

<a href="https://s2.51cto.com/wyfs02/M01/9C/C6/wKiom1l10GmgzuPZAACB1mHT1eU721.png" target="_blank"></a>

從上面可見整個腳本運作大約需要13秒,那麼我們考慮到其他因素設定逾時時間為20秒,執行效果如圖:

<a href="https://s2.51cto.com/wyfs02/M02/9C/C6/wKiom1l10vuibFHcAABu6EDeCCg218.png" target="_blank"></a>

傳回碼是0,那麼再看看如果因為逾時而停止的傳回碼是多少呢?

<a href="https://s5.51cto.com/oss/201710/23/66f765f19b3b4af96bacd0e4e77bebe8.png" target="_blank"></a>

可見由于逾時停止的傳回碼是124(ctrl+c手動退出的傳回碼是130),那麼整個腳本就很好寫了,如下:

5

6

7

8

9

<code>mailContent=</code><code>"檢測RMSMQ腳本出現執行逾時現象,請登入伺服器上檢視"</code>

<code>timeout 20s python checkRMSMQ.py</code>

<code>if</code> <code>[[ $? == 124 ]] ; </code><code>then</code>

<code>        </code><code>echo</code> <code>"看門狗沒有在正常時間範圍内執行完畢。"</code>

<code>        </code><code>echo</code> <code>$mailContent | mail -s </code><code>"RMSMQ看門狗腳本執行逾時!"</code>  <code>郵箱位址@163.com</code>

<code>else</code><code>; </code>

<code>        </code><code>echo</code> <code>"看門狗腳本在正常時間範圍内執行完畢。"</code>

<code>fi</code>

然後在crontab裡直接執行這個腳本就好了。

補充說明之二,在shell腳本裡,timeout後面若跟函數的話是無效的!

最後的最後,如果您覺得本文對您升職加薪有幫助,那麼請不吝贊助之手,刷一下下面的二維碼,贊助本人繼續寫更多的博文!

 本文轉自 蘇幕遮618 51CTO部落格,原文連結:http://blog.51cto.com/chenx1242/1950570