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