リモートサーバーのスクリーンセッションでいくつかのプロセスを実行していました。これらすべてのプロセスを次の方法で強制終了しようとしたとき:
pkill -U tim
強制終了したくないプロセス(つまり、画面とssh接続)を含め、すべてのプロセスが強制終了されます。
Screenとssh接続を除くすべてのプロセスを強制終了する方法はありますか?
ちょっとハッカーっぽい:
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
私が知っていることは何も組み込まれていません。次のようなスクリプトを作成できます。
#!/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部分へのエントリ。おそらくそれを処理するためのよりクリーンな方法がありますが、これは機能します。
すべてのprocを大量に殺している場合は、なぜそれを行う必要があるのかを調査する必要があるかもしれません...しかしねえ、これがすべてですnotではなく、物事を行う。
簡単な解決策の1つは、2つのユーザーIDを使用することです。1つは画面とSSH接続用で、もう1つはある時点で強制終了するすべてのプロセス用です。
これは「ハッカー」を超えて単なる「ハック」になりますが、「接続」ユーザーとして実行する他のプログラムが他のプロシージャを強制終了しても強制終了されないという追加の利点があります。これには、エラーログの「テール」や、残したいものなどが含まれる可能性があります。
お役に立てれば!
試してみてください:
ps aux | grep ^$LOGNAME | egrep -v 'ps aux|-bash|sshd' | awk '{ print $2 }' | xargs kill -9; ps aux | grep $LOGNAME
既存の答えに追加するために、次のことが私のために働いた。
--no-run-if-empty
をxargs
オプションに含めると、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
私は@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」を使用しましたが、テールを使用して除外しました。