Мой сервер должен отключиться после 01:00, если в течение последнего часа не было активности. Допустим, было последнее соединение в 00:43, а затем следует проверить снова в 01:43.
Как написать такой скрипт / как получить время последнего входа в систему? На основе соединения ssh
Это предоставит список пользователей и простоев, по одному пользователю на линию.
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.
blockquote>Разве это не требует динамической модификации самого задания 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(); } ?>
Что ж, сервер Linux почти никогда не выполнит требования к завершению работы, которые вы заявили. Linux постоянно подключается к себе. Тем не менее, вы, вероятно, могли бы что-то подстроить.
/ var / log / messages будет показывать новые ssh-соединения.
ps aux | grep ssh
покажет активные процессы ssh
Вместе вы можете написать какой-нибудь скрипт для проверки / var / log / messages на наличие соединений за последний час, убедитесь, что нет активных соединений и затем выключение.
Эта статья от IBM может помочь.