web-dev-qa-db-ja.com

Linuxのいくつかを除いて、ユーザーのすべてのプロセスを強制終了します

リモートサーバーのスクリーンセッションでいくつかのプロセスを実行していました。これらすべてのプロセスを次の方法で強制終了しようとしたとき:

pkill -U tim

強制終了したくないプロセス(つまり、画面とssh接続)を含め、すべてのプロセスが強制終了されます。

Screenとssh接続を除くすべてのプロセスを強制終了する方法はありますか?

8
Tim

ちょっとハッカーっぽい:

ps -U tim | egrep -v "ssh|screen" | cut -b11-15 | xargs -t kill

これにより、sshまたはscreenプロセス以外のすべてが強制終了されます。説明されているコマンドは次のとおりです。

  • ps -U tim-明らかに、ユーザーtimからのすべてのプロセスを一覧表示します
  • egrep -v "ssh|screen"-sshまたはscreenプロセスで行を削除します
  • cut -b11-15-列11〜15のデータを切り取ります(通常、ここにPIDが配置されます)
  • xargs -t kill-すべてのプロセスIDをkillコマンドに渡します

慣れている場合は、awkを使用することもできます。

ps -U tim | egrep -v "ssh|screen" | awk '{print $2}' | xargs -t kill
14
Roy Rico

私が知っていることは何も組み込まれていません。次のようなスクリプトを作成できます。

#!/bin/bash
ps ux | sed -e '/bash/d' -e '/screen/d' | awk '{print $2}' | while read process
do 
  kill $process
done

殺害を避けたい他のプロセスがあった場合は、さらに追加する必要があります

-e '/processname/d'

sed部分へのエントリ。おそらくそれを処理するためのよりクリーンな方法がありますが、これは機能します。

2
djhowell

すべてのprocを大量に殺している場合は、なぜそれを行う必要があるのか​​を調査する必要があるかもしれません...しかしねえ、これがすべてですnotではなく、物事を行う。

簡単な解決策の1つは、2つのユーザーIDを使用することです。1つは画面とSSH接続用で、もう1つはある時点で強制終了するすべてのプロセス用です。

これは「ハッカー」を超えて単なる「ハック」になりますが、「接続」ユーザーとして実行する他のプログラムが他のプロシージャを強制終了しても強制終了されないという追加の利点があります。これには、エラーログの「テール」や、残したいものなどが含まれる可能性があります。

お役に立てれば!

1
pbr

試してみてください:

ps aux | grep ^$LOGNAME | egrep -v 'ps aux|-bash|sshd' | awk '{ print $2 }' | xargs kill -9; ps aux | grep $LOGNAME
1
Jack

既存の答えに追加するために、次のことが私のために働いた。

  • PIDは私のマシンの最初の列に表示されるため、b1-6
  • 別のポスターのように、コマンドで使用されるプロセスの名前を含めました。そうしないと、killコマンドで取得される可能性があります。
  • タイトルを削除するには、無視リストにPIDを含めます
  • --no-run-if-emptyxargsオプションに含めると、xargsが空白になった場合、つまり、画面へのヘルプの書き込みが抑制されます。プロセスが見つかりません。
  • これをbashスクリプトに入れる場合は、無視されるコマンドのリストにもbashとbashスクリプトの名前を含めてください。

    ps -U myUserName | egrep -v "ssh|screen|PID|ps|grep|cut|xargs|kill" | cut -b1-6 | xargs -t --no-run-if-empty kill

0
David

私は@RoyRicoのアプローチを使用しました-評判がないためにその投稿にコメントすることはできません-そしてそれを私のシステムに合わせて調整しました。いくつかの異なる構成のため、既製では機能しませんでした。

ps -U myUserName | egrep -v "ssh|screen|grep|bash|systemd|(sd-pam)|ps" | awk '{print $1}' | tail -n +2 | xargs -t kill

さて、私は殺したくないプロセスをさらに除外しました。次に、PIDが最初の列に表示されたため、前の「cut」コマンドの位置が完全に間違っていました(ハッカー的な解決策として、完全に正常で許容できるものとして;))。第三に、grepを実行しているときに、見出しとして「PID」を使用しましたが、テールを使用して除外しました。

0
mkastner