Bash

當我啟動 shell 並啟動該程序(如果它尚未執行)時,如何確定程序是否正在執行?

  • March 4, 2017

當我啟動 shell 時,在我的情況下是 bash 和/或 zsh,我需要添加哪些行到 .zshrc 和/或 .bashrc 以檢查程序是否已在執行,以及程序是否尚未執行,啟動它?

範例:我正在啟動一個新的 zsh shell。如果 top 還沒有執行,我想啟動 top 並讓它接管 shell。如果 top 已經在另一個視窗中執行,我希望 .zshrc 繼續載入並給我一個打開的終端。

6-16 更新:

if ! pgrep -U $USER top >/dev/null; then
exec top
fi

上面的腳本滿足了我的要求。-q 標誌對我不起作用,因為 -q 在我的系統上不是一個選項。所以我不得不通過管道將 PID 傳輸到 /dev/null。謝謝 mveroone、Kusalananda 和 Thomas Dickey。

我有一些超出原始問題範圍的功能蠕變。假設我在一個單使用者系統上,無需輸入密碼即可成為 root。如果需要,我將如何以 root 身份自動執行 top?

6-18 好的,以root身份傳遞命令的特性蠕變問題已解決。我正在使用它來啟動幾個

感謝您的所有深思熟慮的答复。

像這樣使用pgrep

if ! pgrep -u $USER top >/dev/null 2>&1; then
   exec top
fi

解釋:

  • pgrep如果可以發現該命令正在執行,該實用程序將以零退出程式碼退出。因此,否定測試。
  • 還使用 將其限制為目前使用者-u $USER,這樣它就不會由於某種原因獲取其他人的程序。$USER是一個標準的 shell 變數。如果由於某種原因未定義,請嘗試使用$LOGNAME,如果失敗,請使用$( id -n -u )(但此時您必須問自己發生了什麼,因為$LOGNAME也是一個標準的 shell 變數)。
  • 我們不需要來自 的輸出pgrep,因此將標準輸出和錯誤流重定向到/dev/null.

如果top(或其他)沒有發現正在執行,exec它會根據 OP 的問題替換 shell。

這應該適用於所有sh兼容的外殼。

編輯:pgrepBSD 系統(OS X、OpenBSD、…)上的實現有一個-q選項可以讓它丟棄任何輸出,但pgrepLinux 上的顯然沒有這個標誌。在 BSD 系統上,使用這個而不是稍微難看的重定向到/dev/null.

引用自:https://unix.stackexchange.com/questions/286881