CentOS7で特定のプロセスを全部消す
お久しぶりでございます。
先日、CentOS7で、ある時間になったら特定のプロセスを全部削除したいというタスクをこなすことになりました。特定のプロセスとは、今回の場合はwgetです。
バックアップ的な理由で毎日wgetをサーバで実行しているのですが、万が一に備えて、朝の業務開始前までに終わっていないプロセスがあったら、それを削除して中断することにしました。
killコマンドで消せることぐらいしか理解できていなかったので、以下のようにpsコマンドでプロセスを探してパイプでつないでkillすることを思いつきました。
するとこんなご指導が。
リプライいただいたように、Linuxにはkillallというありがたいコマンドがあるため、無駄にパイプをつながなくても、 killall プロセス名 で、特定の名前のプロセスをすべて削除できるのでした。
ということで、さっそく実験。しかし、コマンドが無いと言われてしまいました…。
あれ、CentOS7にKillallって無いの…?
こういうのはきっとすでに先人が解決してくれているに違いないと思ってググってみました。
あ、とりあえずデフォでは使えないんですね…?
killallは、psmisc という、プロセスに関するコマンド群の追加パッケージとしてスタメンから左遷されちゃったみたいです。
なので、yum install psmisc をして psmisc をインストールすると使えるようになります。
でもそんなものをインストールしたくなかったり、いろんな理由でインストールが許されない場合はどうするか?
私が思いついたあの長いコマンドを使うという手もあります。
しかし、 pkill というコマンドでも killall のような動作を行わせることができるようなので、そっちのほうが短くて楽かなぁとか思います。
ということで、 pkill -f wget を cron に登録して事なきを得ました。
もっとモダンなタスクスケジュールの仕組みを用意できている場合は、そちらに登録しましょう。
ちなみに、
という点については、systemctl kill は、デーモンにしか使えないため、今回私がkillしたかったwgetプロセスを消すことはできませんでした…。
なので、 pkill を使うのがスマートかもしれません。
@sioazike さん、ディスカッションありがとうございました!
先日、CentOS7で、ある時間になったら特定のプロセスを全部削除したいというタスクをこなすことになりました。特定のプロセスとは、今回の場合はwgetです。
バックアップ的な理由で毎日wgetをサーバで実行しているのですが、万が一に備えて、朝の業務開始前までに終わっていないプロセスがあったら、それを削除して中断することにしました。
killコマンドで消せることぐらいしか理解できていなかったので、以下のようにpsコマンドでプロセスを探してパイプでつないでkillすることを思いつきました。
ps -e | grep 任意のコマンド | awk '{system(kill -9 $1)}'
便利だなー
— TearTheSky (@TearTheSky) 2015, 3月 23
するとこんなご指導が。
@TearTheSky その使い方でしたらkillallが使えませんでしょうか
— 塩味 プリン (@sioazike) 2015, 3月 23
"killall 任意のコマンド" だけでいいのか
— TearTheSky (@TearTheSky) 2015, 3月 23
リプライいただいたように、Linuxにはkillallというありがたいコマンドがあるため、無駄にパイプをつながなくても、 killall プロセス名 で、特定の名前のプロセスをすべて削除できるのでした。
ということで、さっそく実験。しかし、コマンドが無いと言われてしまいました…。
あれ、CentOS7にKillallって無いの…?
こういうのはきっとすでに先人が解決してくれているに違いないと思ってググってみました。
Centos 7, Where is killall? : CentOS http://t.co/WhlGCoJCEt あれ、CentOS7にkillallって無い?
— TearTheSky (@TearTheSky) 2015, 3月 23
あ、とりあえずデフォでは使えないんですね…?
killallは、psmisc という、プロセスに関するコマンド群の追加パッケージとしてスタメンから左遷されちゃったみたいです。
なので、yum install psmisc をして psmisc をインストールすると使えるようになります。
でもそんなものをインストールしたくなかったり、いろんな理由でインストールが許されない場合はどうするか?
私が思いついたあの長いコマンドを使うという手もあります。
しかし、 pkill というコマンドでも killall のような動作を行わせることができるようなので、そっちのほうが短くて楽かなぁとか思います。
pgrep, pkill を使用してプロセスを殺す - 技術メモ帳 http://t.co/qsuWVDxiQC なるほどねー
— TearTheSky (@TearTheSky) 2015, 3月 23
ということで、 pkill -f wget を cron に登録して事なきを得ました。
もっとモダンなタスクスケジュールの仕組みを用意できている場合は、そちらに登録しましょう。
ちなみに、
@TearTheSky CentOS7でしたらsystemctl killを使うのが正しいかもしれません。不勉強で申し訳ないです。
— 塩味 プリン (@sioazike) 2015, 3月 23
という点については、systemctl kill は、デーモンにしか使えないため、今回私がkillしたかったwgetプロセスを消すことはできませんでした…。
なので、 pkill を使うのがスマートかもしれません。
@sioazike さん、ディスカッションありがとうございました!
コメント
コメントを投稿