私はmysqlに関係するすべてのプロセスを殺そうとしています。私はコマンドをつなぎ合わせていますが、これまでのところ、適切な解決策を考え出していません。もう1つの考慮事項は、最後のプロセスがコマンド 'grepmysql'に対応することです。これは以下のコマンドの一部です。このプロセスは、私がそれを殺そうとするまでにはもう存在しないので、-9を殺そうとするためにパイプされた入力から除外する必要があります。このタスクを達成するための最良の方法は何ですか?これまでのところ、不完全なコマンドがあります。
ps -A | grep mysql | awk '{print $1}'
(この例の目的では、偽の)出力があります
11111
22222
33333 # process id to be excluded
私はそれをxargskill-9にパイプできると思っていました:
ps -A | grep mysql | awk '{print $1}' | xargs kill -9
最後のpidを除外する方法を見つけましたが、私が試したすべてが正しく機能していないようです。
おそらくここで行う最も簡単なことは、grep
をそれ自体のコマンドと一致させないことです。
ps -A | grep [m]ysql | awk '{print $1}' | xargs kill -9
Mを囲む角かっこは、mのみを含む文字セットになります。これは、パターンを変更しませんが、ps
出力では一致しません。これは、この問題を回避するための標準的な方法の一種です。また、pkill
コマンドを使用している場合は、pkill -9 mysql
の実行が少し簡単になることも付け加えておきます。
また、ターゲットプロセスが正常に終了する機会を与えないため、可能な場合はSIGKILL(-9)の使用を避ける必要があることにも注意してください。まだ行っていない場合は、最初にSIGTERM(デフォルト)を試してみてください。
Awkには、直接強制終了できるsystem()コマンドがあります...このようなものです。
ps ¦awk '/[m]ysql/{system( "kill -9 "$1)}'
角括弧の理由は前と同じです。 awkが殺されてパイプが閉じるのを防ぎます。
/ string /は、grepのようなラインマッチングを実行します。
完全を期すために、コマンドpgrep
およびpkill
もお勧めします。
pgrep [-lf] [-u uid] [-other options] pattern
拡張正規表現パターンに一致するプロセスを一覧表示しますpkill [-f] [-t**SIGNAL] pattern
パターンマッチングプロセスを強制終了する示されているように、最も興味深いオプションはおそらく
-f
プロセスの完全なコマンドラインに一致する-u user
特定のユーザープロセス(また、グループ...)にのみ一致します-l
プロセス名/識別子を一覧表示します(pgrepのみ)その他については、細かいマニュアルを参照してください。
全体として、これらはkillall
や上記のより複雑なパイプレシピよりもはるかに用途が広く、便利です(実際に殺したものをチェックできるという点で)。
PIDのリストから最後の1つを削除するには、head -n Nを使用できます。ここで、nは最後のPIDがないPIDの数です。
ps -A | grep mysql | awk '{print $ 1}' |ヘッド-n2 | xargs kill-9
UはgrepからパイプされるPIDの数を知っていると仮定します。
または
killall mysql
コマンドはあなたのためにそれをするかもしれません。 PIDの代わりに名前を使用します。