プロセス名付きプロセスを自動的に終了する Bash スクリプト

プロセス名付きプロセスを自動的に終了する Bash スクリプト

タイトルから推測できるように、私は特定のプログラム名のすべてのプロセスを終了するbashスクリプトを書こうとしますが、この分野の経験はほとんどありません。私が見つけたものは次のとおりです。

ps -aux | grep $processToClose

その名前を持つすべてのプロセスをインポートできますが、そのプロセスを終了するには、手動で次を使用します。

kill -9 $processPID

プロセスの終了部分を自動化する方法についてのアイデアはありますか?

(私がなぜこのようなことをしたいのか疑問に思うなら、私は仕事用のラップトップと日常のコンピュータでanydeskを使用するので、1つだけを使用する必要がありますが、時々(デフォルトでは毎日)anydeskが機能しないことを選択して上記のコマンドを使用して閉じます)

ベストアンサー1

それがpkill目的です。

pkill regexp

名前(またはによって報告された)が正規表現に一致するプロセスを終了します(SIGTERMに似ており、kill通常SIGKILL(9)を使用しません)。psps -o comm

pkill -f regexp

arglist(それらまたはその祖先のいずれかがコマンドを実行したと仮定)ps -f(またはps -o commBSDフレーバーps aux)が拡張正規表現と一致すると報告する人のためのものです。

-xフルネーム/引数リストと一致する正規表現オプションが追加されました。たとえば、実行中のプロセスや終了したプロセスの代わりにpkill -x xterm実行中のプロセスを終了します。xtermlxtermxterminatorpkill 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 -auxLinuxベースのシステムで一般的に見られる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標準的なアプローチです。

おすすめ記事