首先是情况:
我有一台服务器,我想让它在晚上 (00:00) 自动关闭,但我需要确保没有人通过 ssh 登录。如果是,那么我将允许最多再等待一个小时进行第二次关闭尝试 (01:00),此时服务器无论如何都会关闭。
我想我可以使用 cron 作业来关机(除非有更好的方法来安排关机),但不知道在第一种情况下如何实施检查。
额外的:
有没有办法知道用户是否正在使用其 Samba 共享,在这种情况下,不会完成关机程序。或者更好的办法是,检查是否有足够数量的磁盘 I/O,否则也不会完成关机。
我已经看到了一些可以帮助我的答案,所以我希望具体地知道,完成整个任务的最佳方法是什么,而不需要破解不同的部分。
答案1
您可以使用以下方法检查活动连接:
netstat -an | grep ESTABLISHED | grep ":[portname] " | wc -l
- 端口 22 用于 ssh 连接。
- 端口 445 用于 samba 连接。
因此将其添加到 bash 脚本并将 bash 脚本添加到 cronjob。
创建一个 cronjob:
sudo su crontab -e
插入如下内容,在 24:00 进行检查并在 01:00 强制关机:
# Check for shutdown system at 24:00 every day 00 0 * * * /usr/bin/shutdown_script # Shutdown at 01:00 every day 00 1 * * * /usr/bin/shutdown -h now
创建脚本(仍然以 root 身份;)):
gedit /usr/bin/shutdown_script
并添加您想要检查的命令:
#!/bin/bash users_ssh=`netstat -an | grep ESTABLISHED | grep ':[445] ' | wc -l` users_ssh_alertvalue="0" if [ "$users_ssh" -eq "$users_ssh_alertvalue" ]; then /sbin/shutdown -h now fi
当然,让它可执行。
您可以通过添加更多选项来使它更加完善,if
您需要做的就是找到正确的命令来查找要检查的值。不过,我还没有找到一个不错的 I/O 检查(iostat
看起来iotop
很有希望)。
编辑:在寻找 I/O 检查命令时,我发现了mpstat
。它报告与处理器相关的统计数据(请参阅man mpstat
)。CPU 空闲时间来自mpstat
:
mpstat | grep all | sed -s 's/.* all// ; s/ * / /g' | cut -d ' ' -f10
因此,您可以添加此功能,并在 CPU 空闲时间高于 98% 时关闭。