
(過去、最後の日)私のユーザー名で始まったすべてのプロセスをどのように終了しますか?
答え1
- 1時間もかかっていないプロセスを見つけました。
- PID抽出
- PIDを殺す
プロセスリスト:
$ ps -e -o pid,user,etimes,comm \
| awk -v me=$USER '$2 == me && $3 <= 3600 { print }'
生産
661162 jaroslav 3006 chrome
667859 jaroslav 1711 chrome
669145 jaroslav 1471 chrome
671222 jaroslav 1016 chrome
675278 jaroslav 270 chrome
675578 jaroslav 207 sleep
676094 jaroslav 91 chrome
676102 jaroslav 91 chrome
676528 jaroslav 11 chrome
676529 jaroslav 11 chrome
676553 jaroslav 11 chrome
676602 jaroslav 3 top
676615 jaroslav 0 ps
676616 jaroslav 0 awk
PID抽出:
$ ps -e -o pid,user,etimes,comm \
| awk -v me=$USER '$2 == me && $3 <= 3600 { print $1 }'
PID終了:
$ ps -e -o pid,user,etimes,comm \
| awk -v me=$USER '$2 == me && $3 <= 3600 { print $1 }' \
| xargs -rt kill
xargs の -tr 引数はオプションです。出力が報告されず、実行された各行が報告されると、xargsはスキップされます。
テストすることもでき、kill -0
プロセスは停止しませんが、プロセスが実行されなくなった場合はエラーが報告されます。
$ ps -e -o pid,user,etimes,comm \
| awk -v me=$USER '$2 == me && $3 <= 3600 { print $1 }' \
| xargs -rt kill -0
kill -0 661162 667859 669145 671222 675278 676602 677310 677311 677883 677893 677965 677966 677967 677968
kill: (677966): No such process
kill: (677967): No such process
このパイプライン/スクリプトは、フィードバック後にそれ自体で終了する可能性があることを認識し(上記のプロセスリストのetimes = 0を参照)、最近のプロセスを無視する修正されたバージョンは次のとおりです。
ps -u "$LOGNAME" -o pid,etimes,comm \
| awk '$2 <= 3600 && $2 > 1 { print $1 }' \
| xargs -rt kill -0
これは移植性が悪いかもしれませんが、Linux(最小のubuntu 18)では動作します。これにより、この問題を解決する方法についてのアイデアを得ることができることを願っています。
<mother-mode>
awk と xargs なしで ps コマンドを実行し、まず kill して何が終了するかを確認します。ルートとして実行する場合は注意してください。システムをシャットダウンしたり、最近再起動したいくつかの重要なサービスをシャットダウンしたりできます。
</mother-mode>