J'ai un serveur qui est normalement éteint pour des raisons de sécurité. Lorsque je veux y travailler, je l'allume, j'exécute mes tâches et je l'arrête à nouveau. Mes tâches ne prennent généralement pas plus de 15 minutes. Je voudrais mettre en place un mécanisme pour l'arrêter automatiquement après 60 minutes.
J'ai recherché comment faire cela avec cron, mais je ne pense pas que ce soit la bonne façon car cron ne tient pas compte de la dernière mise sous tension du serveur. Je ne peux que définir des modèles périodiques, mais ils ne prennent pas en compte ces données.
Comment pourrais-je faire cette implémentation?
at
(exécution unique).sudo shutdown -h +60
qui lancerait un compte à rebours de 60 minutes pour le processus d'arrêt (-halt). Si vous vouliez l'annuler, vous pourriezsudo shutdown -c
(cela n'utilise pas cron cependant)Réponses:
Si vous exécutez vos tâches en tant que même utilisateur à chaque fois, vous pouvez simplement ajouter la commande d'arrêt, éventuellement avec l'option -P, à votre profil. Le nombre représente le nombre de minutes pendant lesquelles la commande d'arrêt est retardée. Assurez-vous que votre utilisateur a la possibilité d'exécuter la commande d'arrêt via sudo sans mot de passe.
la source
shutdown -k -P 3600
vsshutdown -k -P 60
(-k
imprime le message mural mais n'a pas d'autre effet)Il existe plusieurs options.
Donnez du temps directement à
shutdown -P
:Notez que la
shutdown
page de manuel indique également:Utilisation
at
commande.Créez un fichier d'unité systemd ou un script d'initialisation qui s'exécute
shutdown -P 60
au démarrage.Utilisez cron
@reboot
pour exécuter la commande après le démarrage.Ajouter à (root) crontab:
Pour les deux dernières méthodes, vous pouvez également utiliser
sleep 3600 && shutdown -P now
au lieu d'utiliser l'argument timeshutdown
pour retarder l'arrêt de 60 minutes. De cette façon, les connexions sont possibles jusqu'au dernier moment avant l'arrêt.la source
sleep
commande, vous devez toujours spécifier une heure pourshutdown
- nous voudrions utilisernow
pour cet argument si nous avons déjà fait l'attente (mais notez que vous n'obtiendrez pas beaucoup d'avertissement pour enregistrer votre travail avant disparaît sous vous!).shutdown -P 60
cela fonctionne, ce n'est pas la façon dont la commande doit être invoquée. Selon la page de manuel que vous devez utilisershutdown -P +60
. --- L'arrêt sans argument temporel (dans l'exemplesleep 3600 && shutdown -P
) sera également retardé d'une minute (commeshutdown -P +1
). Comme Toby Speight l'a écrit, vous voudrez probablement l'utilisershutdown -P now
.Cela ressemble à un problème XY .
Si vous arrêtez après 60 minutes, vous courez le risque de rencontrer un problème particulièrement compliqué et de simplement avoir plus de temps. La plupart des solutions précédentes ne permettraient pas de retarder facilement l'arrêt.
Si la tâche n'est pas une tâche interactive, mais plutôt une tâche scriptée qui est automatiquement déclenchée à partir d'une autre machine, @sdkks a donné une excellente solution pour cela; vous devriez vraiment demander à la machine d'exécuter la mise hors tension dès que le script et toutes ses tâches se terminent.
Cependant, si votre tâche est une tâche interactive, je vous suggère de faire une détection d'inactivité à la place.
Si vous effectuez votre tâche dans une interface graphique (X11), vous pouvez détecter les sessions GUI inactives en utilisant l'approche décrite ici: Exécutez une commande lorsque le système est inactif et lorsqu'il est à nouveau actif
Si vous effectuez la tâche via un terminal, vous pouvez détecter les utilisateurs connectés à l'aide de la
who
commande. Vous pouvez configurer un cronjob qui arrête la machine s'ilwho
renvoie un résultat vide. Notez que ce sera une approche assez conservatrice; il n'arrêtera pas le système si vous avez laissé la console connectée, mais inactif.Si vous voulez être un peu plus agressif et déconnecter également les sessions de terminal inactives, vous pouvez combiner l'approche précédente avec la déconnexion automatique des sessions SSH inactives
ClientAliveInterval
etClientAliveCountMax
. Si vous n'avez pas SSH, mais avez une session de terminal locale, une autre approche consiste à utiliser le temps d' inactivité du terminal tel que renvoyé par law
commande.la source
Bien que les réponses précédentes ici satisfassent toutes à la perfection, vous pouvez également mettre votre machine hors tension dès que les tâches sont terminées.
bash
les scripts peuvent êtretrap
ped, ce qui signifie que certains signaux peuvent être interceptés et certaines tâches peuvent être exécutées en cas de besoin.EXIT
est l'un des signaux qui peuvent être piégés.Vous pourrez:
trap
pourEXIT
vos scripts shell automatisés, ce qui signifie la fin de vos tâches automatiséestrap
pour votre.bashrc
EXIT
, ce qui signifie que lorsque vous vous déconnectez de cette machine, éteignez-le.L'option n ° 1 serait le cas idéal, à condition que vos tâches ne nécessitent pas d'inspection ad hoc et de jugement manuel.
L'option # 2 couvrirait les cas où vous oublieriez de quitter le terminal sans éteindre. Il y a cependant une mise en garde; si vous avez plusieurs terminaux ouverts sur la même machine et que vous sortez de l'un d'eux, il éteindra tout de même la machine. (Il peut être scripté pour éviter cela, mais je ne compliquerai pas la solution.)
Cela peut être à la fin de l'
.bashrc
option # 2, quelque part en haut de votre script pour l'option # 1.Pourquoi ne pas utiliser
poweroff
à la fin du script?Je préfère utiliser
set -eo pipefail
en haut de mes scripts. Si une erreur se produit, elle n'échouera pas en silence; il cessera d'exécuter plus de commandes.trap
deEXIT
signal doit couvrir les cas où le script se termine prématurément en raison d'erreurs.Cependant, pour vos tâches, cela peut également signifier que la machine s'arrêtera avant d'être terminée.
J'ai un
bash
modèle simple que j'utilise pour faciliter le débogage des scripts; cela pourrait peut-être être utile. S'il vous plaît voir cet essentiel .la source
.bashrc
je préférerais le bas au cas où quelque chose d'autre le remplacerait. Votre préoccupation ne semble pas claire, pouvez-vous partager un exemple d'extrait sur repl.it peut-être?En élaborant sur le commentaire @dirkt, vous pouvez insérer une
at
commande sur votre.bashrc
ou.profile
ou tout autre fichier votre shell utilise sur connexion pour programmer un arrêt automatique 60 minutes après votre connexion.Quelque chose comme:
la source
at
. Vous pouvez également voir lesat
tâches dans/var/spool/
at
dans ce contexte car il survit aux redémarrages. Si OP devait se connecter, s'arrêter manuellement, puis se reconnecter en l'espace d'une heure, il serait expulsé avant qu'une heure ne se soit écoulée après sa dernière connexion lors du premier processus d'arrêt programmé.Ce qui suit s'exécute
command
avec des paramètres et s'il se termine avec succès, il désactivera la boîte immédiatement, en supposant que l'utilisateur peut s'exécuterpoweroff
. Il peut être nécessaire de l'utilisersudo poweroff
.Alors que le suivant s'exécute simplement
poweroff
immédiatement à la fin de la commande:Si vous pensez que la commande a besoin de repos après exécution, exécutez
Si vous pensez que la commande peut s'exécuter en heures supplémentaires, vous pouvez la limiter à une heure:
timeout
fait partie ducoreutils
package, vous l'avez probablement déjà.la source
Si vous êtes vraiment préoccupé par la sécurité, utilisez une minuterie de prise mécanique sur la source d'alimentation. Réglez-le simplement à l'heure à laquelle vous souhaitez qu'il s'arrête. De cette façon, personne ne peut se connecter à distance et désactiver l'arrêt. Vous auriez besoin d'un accès physique.
la source
Si vous êtes dans une
systemd
machine, vous pouvez utiliser une minuterie monotoneL'unité de minuterie
/etc/systemd/system/shutdown_after_an_hour.timer
L'unité de minuterie
/etc/systemd/system/shutdown_after_an_hour.service
:Il est activé via
Son état (en particulier le temps restant avant l'arrêt) est disponible via
Cela fonctionnera au prochain redémarrage, il n'est pas utile de
systemctl start
lors de la session lors de sa création car il ne fonctionnera pas (car il n'a pas été déclenché lors du redémarrage) ou arrêtera la machine tout de suite si passé une heure. Je ne sais pas lequel se passera en fait, je n'ai jamais testé ce cas spécifique.la source
Essayez de mettre le script (
sudo shutdown -P 3600
) dans le/etc/init.d
répertoire pour l'exécuter automatiquement au démarrage.Ou essayez d'utiliser
anacron
, en ajoutant la commande dans le/etc/anacrontab
fichier. Je suggère également d'utilisernohup
devant la commande pour être sûr que la commande fonctionne toujours après la déconnexion.la source
Tirez parti du fichier de déconnexion de votre shell
Si vous n'avez besoin du serveur que pour des tâches interactives ou non interactives démarrées par votre UID, pensez à placer vos commandes d'arrêt dans votre fichier ~ / .bash_logout . Le manuel GNU Bash dit:
Ainsi, l'ajout de "sudo poweroff" ou similaire à votre fichier de déconnexion mettrait le serveur hors tension dès que vous vous déconnectez de votre session en cours, ou lorsqu'une session Bash non interactive appelle
exit
. Vous pouvez également choisir d'utiliser à ou passer un temps de retard à l' arrêt si vous préférez reporter l'arrêt.Pour une approche plus interactive de cela, vous pouvez mettre les bashismes suivants dans votre fichier de déconnexion:
Avertissements
Il y a quelques mises en garde que vous devez garder à l'esprit à propos de cette solution:
startx
ou similaire.exit
, vous pouvez rencontrer des arrêts vous ne vous attendiez pas.NOPASSWD
pour les commandes d'arrêt, ou si vous n'avez pas appelésudo -v
avant d'exécuter votre commande d'arrêt.En bref, vous voudrez peut-être déterminer si cette approche répond à vos besoins réels, ou si une approche complètement différente telle que la surveillance de l'absence d'utilisateurs connectés ou une autre alternative est un meilleur pari. Votre kilométrage variera certainement.
la source