2016-03-30 40 views
0

這裏我想創建一個Bash腳本,我想知道應用程序是否已經在監聽某個端口,通過使用命令netstatBash腳本如何在10分鐘的時間限制內循環「while」運行條件

如果端口已經被監聽,那麼他會調出結果。

如果不是,腳本將以10分鐘的時間限制重複netstat命令,如果超過10分鐘,命令將不會執行,結果是錯誤。

如果在終端運行手冊netstat命令:

netstat -atn | grep 8779 

結果:

[email protected]:~$ erp-enterprise/bin$ netstat -atn | grep 8779 
tcp6  0  0 :::8779     :::*     LISTEN 

下面把我所造的劇本,接下來會發生什麼?

#!/bin/bash 
NETSTAT=`netstat -ant | grep :::8779` 

echo $NETSTAT 
VAR_ERR="Port APP 8779, not listen !" 
VAR_SUCS="Port APP 8779, LISTEN" 

while [[ "$NETSTAT" = "" ]] ; 
do 
    echo $NETSTAT 
    if [[ -z "$NETSTAT" ]]; 
    then 
      echo $VAR_ERR 
      NETSTAT=`netstat -ant | grep :::8082` 
    else 
      echo $VAR_SUCS 
      exit 0 
done 
echo $VAR_SUCS 

如果應用程序未在偵聽端口,腳本將繼續循環。

結果:

[email protected]:~$ ./listen_port.sh 
Port APP 8082, not listen ! 

Port APP 8082, not listen ! 

Port APP 8082, not listen ! 

Port APP 8082, not listen ! 

Port APP 8082, not listen ! 

如果該應用程序已在偵聽的端口,腳本會停止並彈出結果。

[email protected]:~$ ./listen_port.sh 
Port APP 8082, not listen ! 

Port APP 8082, not listen ! 

Port APP 8082, not listen ! 

Port APP 8082, not listen ! 

Port APP 8082, not listen ! 

Port APP 8779, LISTEN 

如何爲腳本停止提供時間限制?

+0

不確定*什麼*應該有一個時間限制,但你可以重試一個循環中的東西直到經過一段時間,或者你可以使用['timeout'](http://linux.die.net/man/1/timeout)運行命令。 – Biffen

+0

哦,是的,先生..但我試圖解釋上面,顯示我的bash腳本,以及如何繼續我的腳本?如何添加腳本?所以我的意思是,先生 – Yuday

+0

你想在腳本中有一個超時*還是你想用超時執行它? (請不要叫我'先生'。) – Biffen

回答

4

可以使用timeout命令:

timeout 10m /path/to/your_script.sh 

上面的命令將啓動/path/to/your_script.sh 10分鐘後終止它,如果它沒有在它自己的終止。

進一步閱讀:man timeout

2

我喜歡@ hek2mgl的解決方案,但如果你想你的腳本中做到這一點,你可以使用的SECONDS變量,看看有多少時間已經過去了。所以,你的循環可以在條件更改爲類似

while [[ "$NETSTAT" = "" ]] && [[ $SECONDS -lt 600 ]]; 

while [[ -z "$NETSTAT" ]] && [[ $SECONDS -lt 600 ]]; 

使用內置的測試字符串是否爲空

0

您可以從bash腳本內不做依靠其他工具:

#! /bin/bash 

trap 'echo "error after retrying for $secs"; exit 1' USR1 

secs=600 

{ sleep $secs; kill -s USR1 0; } & 

while : 
do 
    netstat -ant | grep -q :::8082 && exit 0 
    sleep 1 
done