如果过去一小时内没有任何活动,我的服务器应该会在凌晨 1:00 后关闭。假设最后一次连接是在 00:43,那么它应该在 01:43 再次检查。
如何编写这样的脚本/如何获取上次登录时间?基于 ssh 连接
答案1
这将提供用户和空闲时间的列表,每条线路一个用户。
w | tr -s " " | cut -d " " -f 1,5 | tail -n +3
重要提示:请参阅手册页中的注释部分瓦上面这行代码输出如下内容:
username1 0.00s
username2 48.08s
然后使用计划任务执行您创建的脚本以利用瓦。使用您喜欢的任何脚本语言。也许您不关心用户名,只关心空闲时间?
w | tr -s " " | cut -d " " -f 5 | tail -n +3
任何小于 3600 秒的结果均不符合一小时空闲时间要求。
如果过去一小时内没有任何活动,我的服务器应该会在凌晨 1:00 后关闭。假设最后一次连接是在 00:43,那么它应该在 01:43 再次检查。
这难道不需要动态修改 cron 作业本身吗?我认为每小时运行一次就足够了;否则,我必须每分钟运行一次脚本才能获得这种精度。
这是一个在 Linux Mint 13 上运行良好的 PHP 脚本。它应该适用于 Ubuntu 或任何其他 Linux。
#!/usr/bin/env php
<?php
/* Shutdown Script
*
* If idle times exceed a defined value or if no users are logged in,
* shutdown the computer. If running from cron there should be no "dot"
* in the script file name. Make the script executable.
*
* Caveat: running the script as root in an interactive shell will cause
* immediate shutdown, as though typing 'shutdown -P now'.
* (It should only be run from cron.)
*/
$max_idle_time = 3600; // seconds
$cmd_idle_time = 'w|tr -s " "|cut -d " " -f 5|tail -n +3'; // idle times
$shutdown_now = true; // boolean
function shutdown() {
exec('/sbin/shutdown -P now'); // or -h
}
// Form an array from the output of $cmd_idle_time
$idle_times = explode("\n", shell_exec($cmd_idle_time));
foreach ($idle_times as $idle_time) {
// Are there no users logged on, or did root run this from a shell?
if (empty($idle_time)) {
continue;
}
// Remove trailing "s" from idle time and round to nearest second
$idle_time = round(substr($idle_time, 0 , -2));
// Cancel shutdown if any user's idle time is less than $max_idle_time
if ($idle_time < $max_idle_time) {
$shutdown_now = false;
}
}
// If the $shutdown_now boolean is still true, shutdown.
if ($shutdown_now === true) {
shutdown();
}
?>
答案2
嗯,Linux 服务器几乎永远不会满足您所说的关机要求。Linux 会不断连接到它自己。话虽如此,您可能可以安装一些东西。
/var/log/messages 将显示新的 ssh 连接。
ps aux | grep ssh
将显示活动的 ssh 进程
你们可以一起编写某种脚本来检查 /var/log/messages 中过去一小时内的连接情况,确保没有活动连接,然后关闭。
本文来自 IBM 的可能会有帮助。