web-dev-qa-db-ja.com

自動アイドルプロセスキルスクリプトの作成

アイドル状態のユーザーがリソースを拘束する一般的な問題の特定のインスタンスに対するソリューションを実装したいと思います。ユーザーリストはwで、関連するPIDはpsで、最後のステップはkillで取得できることを知っています。ただし、1時間以上アイドル状態になっているユーザーのために、このプロセスを自動化したいと思います。

アイデアは、wの出力を行ごとに読み取り、正規表現[0-9]mを含む行を選択することです(アイドル時間が1:00mを超えるユーザーを検索します)。次に、その行に関連付けられたTTYが抽出され、ps -tに送信されます。その出力には、kill -9に送信するPIDのリストが含まれています。これらすべてをつなぎ合わせる方法がわかりません。

最後の警告:rootユーザーに関連するものは何も解釈されません。

2
Jake Brown

wは、ttyのアクセス時間を使用して、誰かがどれだけアイドル状態であるかを判別します。これは、ttyファイルを統計し、現在の時刻からその時刻を差し引くidletime()でカバーされます。 pkillは、ターミナルをフィルターとして使用してプロセスを強制終了できます。

だから、あなたはルートでなく、5分以上アイドル状態にない人を殺したいですか?

for t in `w -h | grep -v '^root' | awk '{print $2}'`; do find /dev/$t -amin +5 -exec pkill -t $t \; ; done

ここで何が起こっているのか:

  • ヘッダーなしでwを使用して、すべてのユーザーを検索します
  • ルートを除外する
  • 2列目であるttyを印刷します
  • 各回線について、アクセス時間を5分以上テストするために検索を実行します
  • そうである場合は、その端末上のすべてのプロセスをpkillで強制終了します
2
Craig Small

これにはシェルタイムアウトを使用する方が良いかもしれません。 bashの場合、TMOUT変数を読み取り専用としてエクスポートします

TMOUT=<seconds>; readonly TMOUT; export TMOUT

tcsh用

set -r autologout <seconds>

/etc/profile.d/のスクリプト内。上記のタイムアウトに達したシェルは終了します。 'w'からの出力は、常に正確であるとは限りません(たとえば、xセッションで時間を報告することはできません)。

ClientAliveIntervalを使用するよりもssh経由でログインしているユーザーがいる場合(sshd_config(5)を参照)。

2
nkms