web-dev-qa-db-ja.com

-9を殺すためのawkのパイプ出力

私は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を除外する方法を見つけましたが、私が試したすべてが正しく機能していないようです。

5
well actually

おそらくここで行う最も簡単なことは、grepをそれ自体のコマンドと一致させないことです。

ps -A | grep [m]ysql | awk '{print $1}' | xargs kill -9

Mを囲む角かっこは、mのみを含む文字セットになります。これは、パターンを変更しませんが、ps出力では一致しません。これは、この問題を回避するための標準的な方法の一種です。また、pkillコマンドを使用している場合は、pkill -9 mysqlの実行が少し簡単になることも付け加えておきます。

また、ターゲットプロセスが正常に終了する機会を与えないため、可能な場合はSIGKILL(-9)の使用を避ける必要があることにも注意してください。まだ行っていない場合は、最初にSIGTERM(デフォルト)を試してみてください。

17
FatalError

Awkには、直接強制終了できるsystem()コマンドがあります...このようなものです。

ps ¦awk '/[m]ysql/{system( "kill -9 "$1)}'

角括弧の理由は前と同じです。 awkが殺されてパイプが閉じるのを防ぎます。

/ string /は、grepのようなラインマッチングを実行します。

6
technosaurus

完全を期すために、コマンドpgrepおよびpkillもお勧めします。

  • pgrep [-lf] [-u uid] [-other options] pattern拡張正規表現パターンに一致するプロセスを一覧表示します
  • pkill [-f] [-t**SIGNAL] patternパターンマッチングプロセスを強制終了する

示されているように、最も興味深いオプションはおそらく

  • -fプロセスの完全なコマンドラインに一致する
  • -u user特定のユーザープロセス(また、グループ...)にのみ一致します
  • -lプロセス名/識別子を一覧表示します(pgrepのみ)

その他については、細かいマニュアルを参照してください。

全体として、これらはkillallや上記のより複雑なパイプレシピよりもはるかに用途が広く、便利です(実際に殺したものをチェックできるという点で)。

3
Hannes

PIDのリストから最後の1つを削除するには、head -n Nを使用できます。ここで、nは最後のPIDがないPIDの数です。

ps -A | grep mysql | awk '{print $ 1}' |ヘッド-n2 | xargs kill-9

UはgrepからパイプされるPIDの数を知っていると仮定します。

1
Muez

または

killall mysql 

コマンドはあなたのためにそれをするかもしれません。 PIDの代わりに名前を使用します。

0
David