タイトルから推測できるように、私は特定のプログラム名のすべてのプロセスを終了するbashスクリプトを書こうとしますが、この分野の経験はほとんどありません。私が見つけたものは次のとおりです。
ps -aux | grep $processToClose
その名前を持つすべてのプロセスをインポートできますが、そのプロセスを終了するには、手動で次を使用します。
kill -9 $processPID
プロセスの終了部分を自動化する方法についてのアイデアはありますか?
(私がなぜこのようなことをしたいのか疑問に思うなら、私は仕事用のラップトップと日常のコンピュータでanydeskを使用するので、1つだけを使用する必要がありますが、時々(デフォルトでは毎日)anydeskが機能しないことを選択して上記のコマンドを使用して閉じます)
ベストアンサー1
それがpkill
目的です。
pkill regexp
名前(またはによって報告された)が正規表現に一致するプロセスを終了します(SIGTERMに似ており、kill
通常SIGKILL(9)を使用しません)。ps
ps -o comm
pkill -f regexp
arglist(それらまたはその祖先のいずれかがコマンドを実行したと仮定)ps -f
(またはps -o comm
BSDフレーバーps aux
)が拡張正規表現と一致すると報告する人のためのものです。
-x
フルネーム/引数リストと一致する正規表現オプションが追加されました。たとえば、実行中のプロセスや終了したプロセスの代わりにpkill -x xterm
実行中のプロセスを終了します。xterm
lxterm
xterminator
pkill xterm
したがって、正規表現演算子()がないと$processToClose
仮定して名前が格納されているプロセスを終了するには、次の手順を実行します。$processToClose
\|$^*()+[]{}.?
pkill -x -- "$processToClose"
正規表現演算子を含めるか含めることができる場合は、次のようにエスケープする必要があります\
。
LC_ALL=C pkill -x -- "$(
printf '%s\n' "$processToClose" |
LC_ALL=C sed 's/[][\\|$^*()+{}.?]/\\&/g')"
これにより、両方のロケールをCに設定し、pkill
プロセスsed
名が必ずしもユーザーロケールで有効なテキストを形成しないようにします。
pkill
どのプロセスが終了するかを確認するには、に置き換えることがpkill
できますpgrep -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
標準的なアプローチです。