如何判斷一個進程是否正在運行並用它來製作條件shell腳本?

如何判斷一個進程是否正在運行並用它來製作條件shell腳本?

如何確定進程是否正在運行,然後讓 bash 腳本根據該條件執行一些操作?

例如:

  • 如果進程abc正在運行,則執行此操作

  • 如果它沒有運行,請執行此操作。

答案1

執行類似操作的 bash 腳本如下所示:

#!/bin/bash

# Check if gedit is running
# -x flag only match processes whose name (or command line if -f is
# specified) exactly match the pattern. 

if pgrep -x "gedit" > /dev/null
then
    echo "Running"
else
    echo "Stopped"
fi

該腳本只是檢查程式“gedit”是否正在運行。

或者你只能檢查程式是否沒有運行,如下所示:

if ! pgrep -x "gedit" > /dev/null
then
    echo "Stopped"
fi

答案2

任何使用類似ps aux | grep abc或類似內容的解決方案pgrep abc都是有缺陷的。

為什麼?

因為您沒有檢查特定進程是否正在運行,所以您正在檢查是否有任何正在運行的進程恰好匹配abc。任何使用者都可以輕鬆建立並運行名為abc(或abc在其名稱或參數中包含某處)的可執行文件,從而導致測試誤報。您可以應用多種選項psgrep縮小pgrep搜尋範圍,但您仍然無法獲得可靠的測試。

那麼如何可靠地測試某個正在運行的進程呢?

這取決於您需要測試的目的。

我想確保服務ABC正在運行,如果沒有,則啟動它

這就是 systemd 的用途。它可以自動啟動服務並追蹤它,並且可以在服務終止時做出反應。

如何檢查我的遊戲伺服器是否仍在運行...以獲得其他解決方案。

ABC是我的劇本。我需要確保我的腳本只有一個實例正在運行。

在這種情況下,請使用鎖定檔案或鎖定目錄。例如

#!/usr/bin/env bash

if ! mkdir /tmp/abc.lock; then
    printf "Failed to acquire lock.\n" >&2
    exit 1
fi
trap 'rm -rf /tmp/abc.lock' EXIT  # remove the lockdir on exit

# rest of script ...

Bash 常見問題 45用於其他鎖定方式。

答案3

這就是我使用的:

#!/bin/bash

#check if abc is running
if pgrep abc >/dev/null 2>&1
  then
     # abc is running
  else
     # abc is not running
fi

用簡單的英文來說:如果 'pgrep' 傳回 0,則進程正在運行,否則不是。


相關閱讀:

Bash 腳本::字串比較

Ubuntu 手冊正規表示式

答案4

借鑒 @rommel-cid 的想法,您可以pidof與 || 一起使用(||) 如果進程不存在則運行命令, && 如果進程存在則運行某些內容,從而創建快速的 if/then/else 條件。例如,這是一個正在運行的進程(我的 chrome 瀏覽器,其進程名稱為「chrome」)和一個測試不存在的進程的進程。我使用 1>/dev/null 抑制標準輸出,以便它不會列印:

$ (pidof chrome 1>/dev/null && echo "its running? ok, so am i then" ) || echo "it's not running? ok i'll run instea\
d"
its running? ok, so am i then
$ (pidof nosuchprocess 1>/dev/null && echo "its running? ok, so am i then" ) || echo "it's not running? ok i'll run\
 instead"
it's not running? ok i'll run instead
$

相關內容