特定のユーザーがX時間以上費やすすべてのプロセスを終了する方法

特定のユーザーがX時間以上費やすすべてのプロセスを終了する方法

プロセスを一覧表示すると、ps auxf一部のプロセスが中断され、手動で終了する必要があることがよくあります。 1つのコマンドでこれをどのように実行できますか?

ps結果の例:

$ ps auxf
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME     COMMAND
tommass   7971 62.3  1.1 316428 45844 ?        R    Aug08 29133:14  xxxxxxxx
tommass   7978  0.0  2.6 455072 105964 ?       S    Aug08   8:56    xxxxxxxx
tommass   7979  0.0  2.6 454436 105360 ?       S    Aug08   8:57    xxxxxxxx
tommass  15034 67.8  1.1  51828 43760 ?        R    Aug14 26411:38  xxxxxxxx
tommass   7982  0.0  2.6 455012 105904 ?       S    Aug08   8:28    xxxxxxxx
  1. 特定のユーザー「tommass」が1時間以上かかるすべてのプロセスを終了する方法
  2. STAT "R"を使用してそのユーザー "tommass"のすべてのプロセスを終了する方法

答え1

この問題を解決する方法はいくつかあります。

  1. pam_limits.soを使用して、ユーザープロセスのCPUタイムアウトを設定します/etc/secrity/limits.conf。これにより、CPU時間クォータを超えるプロセスがXCPU信号を受信し、XCPU信号を具体的にブロック/無視/処理しないと終了します。

  2. 使用自動Niceデーモン( andDebian/Ubuntu パッケージ)。あまりにも多くのCPU時間を使用するプロセスを再起動または終了します。

  3. ps(1)目的のフィールド(CPU時間、ユーザー名、pidなど)のみを印刷するには、型文字列パラメータで呼び出されたスクリプトをハックし、シェルスクリプトを使用してその出力(たとえば)を処理できる必要がありますgrep -f file-with-one-username-per-line | while read cputime username pid; do [ "$cputime" -gt max-cpu-time ] && kill -9 $pid; doneが、これは再発明です。自動ナイスデーモン。

答え2

1)に答えるには、まず

ps -u tomass -o pid,time 

(状況に応じて時間(CPU時間)、etime(経過時間)を選択できます。)

答え2)試してみてください

ps -u tomass -o state,pid | awk '$1 == "R" { printf "kill %d\n",$2 ;}' | ksh

実行中のプロセスを本当に終了しますか?

関連情報