Bash
當我啟動 shell 並啟動該程序(如果它尚未執行)時,如何確定程序是否正在執行?
當我啟動 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
兼容的外殼。編輯:
pgrep
BSD 系統(OS X、OpenBSD、…)上的實現有一個-q
選項可以讓它丟棄任何輸出,但pgrep
Linux 上的顯然沒有這個標誌。在 BSD 系統上,使用這個而不是稍微難看的重定向到/dev/null
.