如何通過命令行確定 httpd 是否正在執行?
我正在為我的伺服器開發一個小型控制面板。我需要一個命令來說明
httpd
是執行還是停止。可能也會對其他服務使用相同的程式碼。
大多數人通過 init 系統執行他們的 httpd(Apache、Nginx 等)。如果您是從軟體包安裝的,那幾乎肯定是這種情況。幾乎所有這些初始化系統都有一個方法可以解決它是否正在執行。在我的例子中,我使用的是 nginx,它提供了一個 SysV 風格的初始化腳本並接受一個
status
參數,如下所示:$ /etc/init.d/nginx status * nginx is running
顯然,如果您執行的是不同的 httpd、腳本或 init 系統,您的語法會略有不同,但除非您自己手動啟動 httpd(這感覺是世界上最糟糕的主意),否則您將可能使用一個不錯的託管啟動腳本,它允許您查詢狀態。
slm 的答案有更多關於這種初始化查詢的資訊,但信任的問題是它只會真正告訴你程序是否仍在執行。您的 httpd 的主程序可能正在執行,但在某種程度上陷入僵局。跳過簡單的初始化測試並繼續進行行為測試是很有意義的。
我們對 httpds 了解的一件事是它們會傾聽。通常在 port 上
*:80
,但如果你沒有,你可以修改程式碼後面的程式碼。在這裡,我只是在查看它是否在正確的埠上偵聽awk
的輸出。netstat
$ sudo netstat -ntlp | awk '$4=="0.0.0.0:80"' tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 2079/nginx
我們還可以檢查哪個程序也在執行,以確保正確的httpd 正在執行。我們可以做各種各樣的檢查。取決於你想成為多麼偏執:)
但即便如此,這也只是 httpd 的反映。想要真正測試它嗎?好吧,讓我們測試一下。
$ wget --spider -S "http://localhost" 2>&1 | awk '/HTTP\// {print $2}' 200
我只是在查看響應程式碼(200 表示“A-Okay!”),但同樣,我們可以深入研究並實際測試輸出以確保其生成正確。
但即使這樣也不是那麼徹底。你在檢查
localhost
,它報告 200,沒有錯嗎?如果海狸通過提供 httpd(而不是系統的其餘部分)的網路電纜咀嚼怎麼辦?然後呢?!當您實際停機時,您正在報告正常執行時間。沒有什麼比不正確的狀態數據看起來更不專業了。因此,讓我們與外部伺服器交談(理想情況下,在完全不同的連接上,在另一個遙遠的星系中)並要求它查詢我們的伺服器:
$ ssh tank 'wget --spider -S "http://bert" 2>&1' | awk '/HTTP\// {print $2}' 200
到目前為止,報告的任何問題要麼是應用內問題(可以有自己的錯誤處理和報告,或者它們在客戶端)。
這些測試的組合也可以幫助確定問題所在。