プロセスを一覧表示すると、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
- 特定のユーザー「tommass」が1時間以上かかるすべてのプロセスを終了する方法
- STAT "R"を使用してそのユーザー "tommass"のすべてのプロセスを終了する方法
答え1
この問題を解決する方法はいくつかあります。
pam_limits.soを使用して、ユーザープロセスのCPUタイムアウトを設定します
/etc/secrity/limits.conf
。これにより、CPU時間クォータを超えるプロセスがXCPU信号を受信し、XCPU信号を具体的にブロック/無視/処理しないと終了します。使用自動Niceデーモン(
and
Debian/Ubuntu パッケージ)。あまりにも多くのCPU時間を使用するプロセスを再起動または終了します。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
実行中のプロセスを本当に終了しますか?