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
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();
}
?>
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.