如果没有活动则自动关闭服务器

如果没有活动则自动关闭服务器

如果过去一小时内没有任何活动,我的服务器应该会在凌晨 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 的可能会有帮助。

相关内容