2016-04-16 10 views
0

У меня есть программа Баш, которая проверяет, что демон в данном порту работает:Альтернатива в CentOS 7 для «н.д. -z»

nc -z localhost $port > /dev/null 
if [ "$?" != "0" ] 
then 
    echo The server on port $port is not working 
    exit 
fi 

Эта программа прекрасно работает в CentOS 6. Однако, кажется, что CentOS 7 изменила, лежащий в основе реализации для nc команды (CentOS 6, кажется, использует Netcat и CentOS 7 использует другую вещь под названием Ncat) и теперь переключатель -z не работает:

$ nc -z localhost 8080 
nc: invalid option -- 'z' 

Глядя на man nc страницу в CentOS 7 Я не вижу ничего ясного от -z. Любое предложение о том, как я должен исправить мою программу bash, чтобы она работала в CentOS 7?

+0

Что касается близкого флаг, который был поднят, позвольте мне уточнить, что вопрос * есть * о программировании (в частности, программирования bash). – fgalan

+1

Если вам не нужен инструмент, который вы используете, вы, вероятно, можете использовать ответы на http://stackoverflow.com/questions/4922943/test-from-shell-script-if-remote-tcp-port-is -open –

+0

'if [" $? " ! = "0"] 'является антипаттерном; вам нужно просто 'if nc -z localhost $ port>/dev/null' – tripleee

ответ

0

я решил что-то подобное с помощью следующего кода:

# Start command: nohup ./check_server.sh 2>&1 & 
# 
FREQUENCY_CHECK=30 
ENDPOINT=10.11.12.13 
PORT=8080 
# Avoid spamming yourself 
EMAIL_LIMIT=3 


check_server(){ # Start shell function 

checkHTTPcode=$(curl -sLf -m 2 -w "%{http_code}\n" "http://$ENDPOINT:$PORT/" -o /dev/null) 


if [ $checkHTTPcode -ne 200 ] 

    then 
     EMAIL_LIMIT=$((EMAIL_LIMIT-1)) 

     # Let's log. Life's boring 
     echo "$(date) Check Failed " >> /var/log/check_server.log 

    if [ $EMAIL_LIMIT -eq 0 ] 
     then 

     # Send last email.. 
     printf "%s\nCheck failed \n\n Last email to be sent. " | mail -s "Check Failed!" -S smtp=your.smtp.domain.here.com -S from="[email protected]" [email protected] 

     else 

      if [ $EMAIL_LIMIT -ge 0 ] 
       then 
       # Send notification 
       printf "%s\nCheck failed \n\n Notifications left: $EMAIL_LIMIT " | mail -s "Check Failed!" -S smtp=your.smtp.domain.here.com -S from="[email protected]" [email protected] 
      fi 

    fi 

     # Take any corrective measure here if nedded. 
     /sbin/service httpd restart >> /var/log/check_server.log 

else 
    # Let's log. Life's boring 
    echo "$(date) Check OK " >> /var/log/check_server.log 
fi 
} 


while true # infinite check 
do 
# Call function every 30 seconds 
check_server 
sleep $FREQUENCY_CHECK 
done 
+0

Спасибо! Я посмотрю команду 'curl' на' checkHTTPcode', чтобы увидеть, как она работает. – fgalan

2

И с подстриженной вниз версии для того, что вы действительно хотите:

#!/bin/bash 
# Start command: nohup ./check_server.sh 2>&1 & 

check_server(){ # Start shell function 

checkHTTPcode=$(curl -sLf -m 2 -w "%{http_code}\n" "http://10.10.10.10:8080/" -o /dev/null) 

if [ $checkHTTPcode -ne 200 ] 
    then 
     # Check failed. Do something here and take any corrective measure here if nedded like restarting server 
     # /sbin/service httpd restart >> /var/log/check_server.log 
     echo "$(date) Check Failed " >> /var/log/check_server.log 

    else 
     # Everything's OK. Lets move on. 
     echo "$(date) Check OK " >> /var/log/check_server.log 
fi 
} 

while true # infinite check 
do 
# Call function every 30 seconds 
check_server 
sleep 30 

done