空闲是指没有前台程序运行,终端正在等待用户输入,但用户没有进行任何输入。
其实我的最终目标是:当所有SSH
会话都空闲并且x-window
也空闲时关闭。
的空闲时间x-window
可以用 确定xprintidle
。所以现在我只需要确定所有 SSH 会话是否空闲。
我在Linux中寻找了很多确定机器是否空闲的方法,但大多数都是基于x-window
桌面是否空闲来确定的。
答案1
在/etc/ssh/sshd_config
# default values
ClientAliveInterval 0
ClientAliveCountMax 3
如果您设置ClientAliveInterval
为 600 {秒} 和ClientAliveCountMax
0,那么这将关闭任何闲置 10 分钟的 SSH 会话。通过使用此机制,您可以进行任何 SSH 会话干净地在您选择的特定超时或空闲期后关闭。然后检查是否存在任何 SSH 会话或进程,如果没有则关闭。
建议您在使用这两个 SSH 参数之前先阅读它们以确保安全,
https://man.openbsd.org/sshd_config
sshd_config 中的选项 `ServerAliveInterval` 和 `ClientAliveInterval` 到底有什么作用?
因为有人不相信我...编辑/etc/ssh/sshd_config
一下ClientAliveInterval 61
,ClientAliveCountMax 0
然后让下面的脚本每分钟通过 crontab 运行一次,然后观察你的机器关闭
#!/bin/bash
# ssh_idle_shutdown.bash
# the first num (a) in file /var/run/sshidleshutdown.txt is 0 or 1 based on if a ssh connection has happened
# if a == 1 and count == 0 then do something
if [ ! -f /var/run/sshidleshutdown.txt ]
then
echo 0 > /var/run/sshidleshutdown.txt
fi
count=`netstat -tnpa | grep 'ESTABLISHED.*sshd' | wc -l`
str=`head /var/run/sshidleshutdown.txt`
astr=${str:0:1}
a=$((astr))
if [ $a -eq 0 ] && [ $count -gt 0 ]
then
echo 1 > /var/run/sshidleshutdown.txt
elif [ $a -eq 1 ] && [ $count -eq 0 ]
then
echo -n "ssh idle condition met system shutdown called at " >> /var/log/sshidleshutdownlog.txt
date >> /var/log/sshidleshutdownlog.txt
rm -f /var/run/sshidleshutdown.txt
# execute /sbin/shutdown
fi
把这个放进去/etc/crontab
1 * * * * * root /path_to/ssh_idle_shutdown.bash
并且还做
chown root.root /path_to/ssh_idle_shutdown.bash
chmod 700 /path_to/ssh_idle_shutdown.bash
这让 SSH 服务器识别哪些是空闲会话,然后 ssh 服务器将关闭它们。一旦我们看到至少一个已建立的 ssh 会话,我们就开始检查,直到通过 netstat 没有留下任何 ssh 会话,因为 ssh 服务器将根据 和 关闭空闲ClientAlive Interval
会话。相应地调整运行频率。ClientAliveCountMax
sshd_config
ClientAliveInterval
/etc/crontab
ssh_idle_shutdown.bash