Bagaimana cara memeriksa apakah port tertentu terbuka pada mesin dari skrip shell dan melakukan tindakan berdasarkan itu?


24

Saya menjalankan skrip shell saya di bawah pada mesin yang c ++ server aplikasi berjalan pada port 8080 dan dalam skrip shell saya mengeksekusi URL dan menyimpan respons yang berasal dari URL itu dalam variabel DATA.

Tetapi anggaplah jika server aplikasi yang sama sedang down, maka itu tidak akan dapat mengeksekusi URL dan kemudian akan mencetak Retrying Againdan tidur selama 30 detik dan kemudian jalankan url yang sama lagi.

#!/bin/bash

HOSTNAME=$hostname
DATA=""
RETRY=15

echo $HOSTNAME

while [ $RETRY -gt 0 ]
do
    DATA=$(wget -O - -q -t 1 http://$HOSTNAME:8080/beat)
    if [ $? -eq 0 ]
    then
        break
    else
        echo "Retrying Again" >&2

        # restart the server

        let RETRY-=1
        sleep 30
    fi
done

echo "Server is UP"

Dan HOSTNAMEini adalah nama host lokal dari server tempat saya menjalankan skrip shell saya di atas.

Pernyataan masalah:-

Sekarang yang saya coba lakukan adalah, jika server sedang down, maka akan dicetak Retrying Againjadi setelah itu saya ingin memeriksa apakah port 8080dibuka $HOSTNAMEatau tidak. Jika tidak, maka itu berarti server sedang down jadi saya ingin me-restart server dengan menjalankan perintah ini dan kemudian tidur selama 30 detik seperti yang ditunjukkan di atas dalam skrip shell.

/opt/app/test/start_stop.sh start

Apakah ini mungkin dilakukan di sini di skrip shell saya di atas?

Saya menjalankan skrip shell ini di Ubuntu 12.04.

Jawaban:


23

Program ini lsofmemungkinkan Anda untuk memeriksa proses mana yang menggunakan sumber daya mana, seperti file atau port.

Untuk menunjukkan proses mana yang sedang mendengarkan pada port 8080:

lsof -Pi :8080 -sTCP:LISTEN

Dalam kasus Anda, Anda ingin menguji apakah suatu proses mendengarkan pada 8080 - nilai kembalinya dari perintah ini hanya memberi tahu Anda. Ini juga mencetak pid dari proses.

lsof -Pi :8080 -sTCP:LISTEN -t

Jika Anda hanya perlu tes, tanpa output, arahkan kembali ke /dev/null:

if lsof -Pi :8080 -sTCP:LISTEN -t >/dev/null ; then
    echo "running"
else
    echo "not running"
fi


Jika Anda menggunakan beberapa nama host dengan beberapa alamat IP secara lokal, tentukan juga nama host tersebut
lsof -Pi @someLocalName:8080 -sTCP:LISTEN


Terima kasih Volker. Saya mencoba ini lsof -i :8080 -sTCP:LISTENdan saya tidak mendapatkan apa-apa di konsol tetapi jika saya mencoba ini netstat -tulpn | grep :8080maka saya mendapatkan proses saya yang berjalan pada port 8080 mengapa begitu?
david

Apa output dari netstat -tulpn | grep :8080?
Volker Siegel

Inilah yang saya dapatkan dengan netstat - david@machineA:/home/david$ netstat -tulpn | grep :8080 (Not all processes could be identified, non-owned process info will not be shown, you would have to be root to see it all.) tcp 0 0 0.0.0.0:8080 0.0.0.0:* LISTEN 27530/test_server
david

Aneh, kalau saya coba hal serupa ternyata berhasil. Bisa jadi terkait dengan IPv6 ... hmmm.
Volker Siegel

Apakah ini terdaftar lsof -iTCP -sTCP:LISTEN | grep 8080?
Volker Siegel

16

Cara termudah di bash. Uji apakah port Anda terbuka.

(echo >/dev/tcp/localhost/8080) &>/dev/null && echo "TCP port 8080 open" || echo "TCP port 8080 close"

Ganti gema dengan apa yang Anda inginkan.

Atau Anda bisa menggunakan nc.

nc -vz 127.0.0.1 8080

Pengembalian:

Koneksi ke 127.0.0.1 8080 port [tcp / *] berhasil


1
ncadalah solusi tepat untuk kasus penggunaan saya; terima kasih telah menyarankan
Jon

1

Menguraikan jawaban RJ yang catatannya ncjuga berguna ... Tidak hanya ncberguna untuk kueri baris perintah cepat

 nc -z -v -w5 127.0.0.1 8080
localhost [127.0.0.1] 8080 (http-alt) : Connection refused

tetapi dapat digunakan tanpa -v jika hal yang dapat dibaca manusia bukan yang Anda cari - misalnya, untuk digunakan dalam skrip (kode keluar akan menunjukkan apakah port terbuka atau tertutup).

 nc -z 127.0.0.1 8080

 echo $?             
1
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.