web-dev-qa-db-fra.com

Serveur d'arrêt automatique en l'absence d'activité

Mon serveur devrait s'arrêter après 01h00, s'il n'y a pas eu d'activité au cours de la dernière heure. Disons qu'il y a eu la dernière connexion à 00:43 alors il devrait vérifier à nouveau à 01:43.

Comment écrire un tel script/comment obtenir la dernière connexion? Basé sur une connexion ssh

1
user45656

Cela fournira une liste d'utilisateurs et de temps d'inactivité, un utilisateur par ligne.

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

Important: Voir la section NOTES dans la page de manuel pour w. La ligne ci-dessus produit quelque chose comme ceci:

username1 0.00s
username2 48.08s

Utilisez ensuite cron pour exécuter le script que vous avez créé pour utiliser la sortie de w. Utilisez le langage de script que vous préférez. Peut-être que vous ne vous souciez pas des noms d'utilisateur, seulement des temps morts?

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

Tout résultat <3600 secondes ne répond pas à l'exigence de temps d'inactivité d'une heure.

Mon serveur devrait s'arrêter après 01h00, s'il n'y a pas eu d'activité au cours de la dernière heure. Disons qu'il y a eu la dernière connexion à 00:43 alors il devrait vérifier à nouveau à 01:43.

Cela ne nécessite-t-il pas une modification dynamique du travail cron lui-même? Je pense que je pourrais être satisfait de l'exécuter une fois par heure; sinon, je devrais exécuter le script toutes les minutes pour acquérir cette précision.

Voici un script en PHP qui fonctionne bien sur Linux Mint 13. Cela devrait convenir à Ubuntu ou à tout autre 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
user8290

Eh bien, un serveur Linux ne respectera presque jamais les conditions d'arrêt que vous avez indiquées. Linux se connecte constamment à lui-même. Cela dit, vous pourriez probablement truquer quelque chose.

/ var/log/messages affichera de nouvelles connexions ssh.

ps aux | grep ssh affichera les processus ssh actifs

Ensemble, vous pouvez écrire une sorte de script pour vérifier les connexions/var/log/messages au cours de la dernière heure, vous assurer qu'il n'y a pas de connexions actives, puis arrêter.

Cet article d'ibm pourrait vous aider.

1
coteyr