Bash

Bash腳本自動關閉給定程序名稱的程序

  • October 25, 2022

正如您可能已經從標題中猜到的那樣,我正在嘗試編寫一個 bash 腳本來關閉給定程序名稱的所有程序,但這樣做的經驗接近 0。我發現的是:

ps -aux | grep $processToClose

我可以使用名稱獲取所有程序,但是為了殺死它們我只是手動使用:

kill -9 $processPID

關於如何自動化程序終止部分的任何想法?

(如果你想知道我為什麼要做這樣的事情:我在我的工作筆記型電腦和日常 PC 上使用 anydesk,所以我只能使用一個,但有時(基本上每天)anydesk 選擇不工作,所以我有使用我上面寫的命令關閉它)

pkill就是為了。

pkill regexp

殺死(與 SIGTERM 類似kill,您通常不想使用 SIGKILL (9))名稱(由psor報告ps -o comm)與正則表達式匹配的程序。

pkill -f regexp

對於那些由ps -f(或ps -o comm或您的 BSD 樣式ps aux)報告的 arglist(假設他們或他們的祖先之一已執行命令)與擴展的正則表達式匹配的人。

添加正-x則表達式的選項以匹配整個名稱/參數列表。例如,這樣會pkill -x xterm殺死正在執行的程序,xterm而不是正在執行lxtermxterminator程序pkill xterm

因此,要殺死名稱儲存$processToClose並假設$processToClose不包含正則表達式運算符(\|$^*()+[]{}.?)的程序:

pkill -x -- "$processToClose"

如果它包含或可能包含正則表達式運算符,則需要使用以下命令對其進行轉義\

LC_ALL=C pkill -x -- "$(
 printf '%s\n' "$processToClose" |
   LC_ALL=C sed 's/[][\\|$^*()+{}.?]/\\&/g')"

這裡還將兩者的語言環境設置為 C,pkillsed允許在使用者語言環境中不一定形成有效文本的程序名稱。

要查看哪些程序pkill會殺死,您可以替換pkillpgrep -l.

pgrep/pkill不是標準命令,但很常見。

ps是標準的,但非常不便攜。選項列表和輸出格式因實現而異。特別是,您ps -aux可能只會使用(通常在基於 Linux 的系統上找到的)的procps實現。ps那是 BSD 風格,但前面ps aux有一個雜散。-

POSIX 指定的選項列表非常有限。

ps -A -o pid= -o comm= |
 NAME=$processToClose awk '
   NF == 2 && $2 "" == ENVIRON["NAME"] {print $1}' |
 xargs kill

假設$processToClose和程序名稱不包含空格將是一種標準方法。

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