如何檢查正在運行的進程的狀態位元?

如何檢查正在運行的進程的狀態位元?

好吧,這是我的困境,我在 Dell PowerEdge T710 伺服器上運行無頭 Ubuntu 伺服器 18.04.3 LTS,並且我正在編寫 bash 腳本,以便我可以輕鬆更改 Apache PHP Mod 版本,而無需手動使用: -

a2dismod php<version>
a2enmod php<version>
systemctl restart apache2

腳本的開頭使用 if 條件來檢查使用者是否以使用者帳戶或根帳戶身份登錄,並使用 UID 的狀態位,即:-

if ((UID)); then
something here
elif ((!UID)); then
something here
fi

使用 ((UID)) 檢查該位元是否為真,並使用 ((!UID) 檢查該位元是否為假,但這就是問題,我想添加更多檢查以確保 apache 實際上處於運行狀態,我寧願使用布林true 或false,也不願使用以下內容:-

systemctl status apache2

這給出了大量的輸出。 apache 有狀態位嗎?然後我可以在繼續 phpmod 版本更改之前進行檢查以確保 apache 確實正在運行。

這是我到目前為止的腳本:https://pastebin.com/HyCjbn59

IT 不僅需要檢查 apache 是否正在運行,還需要檢查各種 apache PHP 模組,以確保在嘗試啟用正確的模組之前確實安裝了它們,如果沒有,則腳本將執行:-

apt install libapache2-mod-php<version>

答案1

您可以使用is-activeunit命令,systemctl其中「如果至少有一個[unit]處於活動狀態,則[r]返回退出代碼0,否則返回非零」:

if systemctl is-active --quiet apache2; then
  echo running
else
  echo not running
fi

如果您想使用$?保存最後一個命令的退出代碼的參數,您可以簡單地測試它0

systemctl is-active --quiet apache2
if [ $? -eq 0 ]; then
  echo running
else
  echo not running
fi

進一步閱讀

答案2

定義自己的退出代碼仍然使用與 @Dessert 在他的答案中描述的相同邏輯。

#!/bin/bash

systemctl is-active -q apache2 && status=TRUE || status=FALSE

case $status in
  TRUE)
    echo do something ;;
  FALSE)
    echo do sothing else ;;
esac

相關內容