アイドル状態のユーザーがリソースを拘束する一般的な問題の特定のインスタンスに対するソリューションを実装したいと思います。ユーザーリストはw
で、関連するPIDはps
で、最後のステップはkill
で取得できることを知っています。ただし、1時間以上アイドル状態になっているユーザーのために、このプロセスを自動化したいと思います。
アイデアは、wの出力を行ごとに読み取り、正規表現[0-9]m
を含む行を選択することです(アイドル時間が1:00mを超えるユーザーを検索します)。次に、その行に関連付けられたTTYが抽出され、ps -t
に送信されます。その出力には、kill -9
に送信するPIDのリストが含まれています。これらすべてをつなぎ合わせる方法がわかりません。
最後の警告:rootユーザーに関連するものは何も解釈されません。
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
ここで何が起こっているのか:
これにはシェルタイムアウトを使用する方が良いかもしれません。 bashの場合、TMOUT変数を読み取り専用としてエクスポートします
TMOUT=<seconds>; readonly TMOUT; export TMOUT
tcsh用
set -r autologout <seconds>
/etc/profile.d/のスクリプト内。上記のタイムアウトに達したシェルは終了します。 'w'からの出力は、常に正確であるとは限りません(たとえば、xセッションで時間を報告することはできません)。
ClientAliveIntervalを使用するよりもssh経由でログインしているユーザーがいる場合(sshd_config(5)を参照)。