過去1時間に開始されたすべてのプロセスを終了しますか?

過去1時間に開始されたすべてのプロセスを終了しますか?

(過去、最後の日)私のユーザー名で始まったすべてのプロセスをどのように終了しますか?

ベストアンサー1

  1. 1時間もかかっていないプロセスを見つけました。
  2. PID抽出
  3. 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>

おすすめ記事