Shell-Script
創建自動空閒程序終止腳本
我想為空閒使用者佔用資源的一般問題的特定實例實施解決方案。我知道可以使用 檢索使用者列表,使用 檢索
w
關聯的 PID,使用 檢索ps
最後一步kill
。但是,我想為那些空閒了一個多小時的使用者自動化這個過程。這個想法是逐行讀取 w 的輸出,選擇那些包含正則表達式的行
[0-9]m
(查找空閒時間大於 1:00m 的使用者)。然後,提取與該行關聯的 TTY 並將其發送到ps -t
,其輸出包含要發送到的 PID 列表kill -9
。我只是不確定如何將所有這些串在一起。最後一個警告:與 root 使用者相關的任何內容都不會被解釋。
w 使用 tty 的訪問時間來確定某人有多空閒,這包含在 idletime() 中,它統計 tty 文件並從目前時間中減去它的 atime。pkill 可以使用終端作為過濾器來殺死程序。
那麼,你想殺死任何不是 root 並且空閒超過 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 殺死該終端上的所有程序
為此使用外殼超時可能會更好。對於 bash 將 TMOUT 變數導出為只讀
TMOUT=<seconds>; readonly TMOUT; export TMOUT
供 tcsh 使用
set -r autologout <seconds>
在 /etc/profile.d/ 的腳本中。達到上述超時的 shell 將終止。‘w’ 的輸出並不總是準確的(例如,它無法報告 x 個會話中的時間)。
如果您有使用者通過 ssh 登錄而不是使用 ClientAliveInterval(請參閱 sshd_config(5))。