Автоматическое отключение сервера, если не было активности

Мой сервер должен отключиться после 01:00, если в течение последнего часа не было активности. Допустим, было последнее соединение в 00:43, а затем следует проверить снова в 01:43.

Как написать такой скрипт / как получить время последнего входа в систему? На основе соединения ssh

1
задан 2 December 2012 в 21:37

2 ответа

Это предоставит список пользователей и простоев, по одному пользователю на линию.

w | tr -s " " | cut -d " " -f 1,5 | tail -n +3

Важно: см. Раздел «ЗАМЕЧАНИЯ» на странице руководства для w . Строка выше производит что-то вроде этого:

username1 0.00s
username2 48.08s

Затем используйте cron , чтобы выполнить сценарий, который вы создали, чтобы использовать выходные данные из w . Используйте любой язык сценариев, который вы предпочитаете. Возможно, вас не интересуют имена пользователей, только время простоя?

w | tr -s " " | cut -d " " -f 5 | tail -n +3

Любой результат < 3600 секунд не соответствует требованию простоя в течение одного часа.

Мой сервер должен отключиться после 01:00, если в течение последнего часа не было активности. Допустим, было последнее соединение в 00:43, а затем нужно проверить еще раз в 01:43.

Разве это не требует динамической модификации самого задания cron? Я думаю, что я мог бы быть доволен, чтобы запустить его раз в час; в противном случае мне пришлось бы запускать сценарий каждую минуту, чтобы получить такую ​​точность.

Вот скрипт на PHP, который хорошо работает на Linux Mint 13. Он должен подойти для 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();
}
?>
0
ответ дан 2 December 2012 в 21:37

Что ж, сервер Linux почти никогда не выполнит требования к завершению работы, которые вы заявили. Linux постоянно подключается к себе. Тем не менее, вы, вероятно, могли бы что-то подстроить.

/ var / log / messages будет показывать новые ssh-соединения.

ps aux | grep ssh покажет активные процессы ssh

Вместе вы можете написать какой-нибудь скрипт для проверки / var / log / messages на наличие соединений за последний час, убедитесь, что нет активных соединений и затем выключение.

Эта статья от IBM может помочь.

0
ответ дан 2 December 2012 в 21:37

Другие вопросы по тегам:

Похожие вопросы: