如何確定進程是否正在運行,然後讓 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
在其名稱或參數中包含某處)的可執行文件,從而導致測試誤報。您可以應用多種選項ps
來grep
縮小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
答案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
$