Dans ce cas particulier, je pense que vous pouvez simplement utiliser le shutdown. avec sudo et les arguments appropriés pour planifier le sommeil à une heure spécifique.
Quelle est la tâche que vous devez faire et pourquoi le sommeil exact de 4 heures?
Thorbjørn Ravn Andersen
Réponses:
46
Utilisez sudopour démarrer un shell racine où vous exécutez les commandes:
sudo bash -c 'sleep 4h; command'
Chaque commande exécutée dans le shell racine s'exécute avec les autorisations root, ce qui sleepne fait pas de mal. Si vous devez exécuter une commande avec des autorisations utilisateur, utilisez sudo -u USERNAME COMMAND, par exemple:
$ sudo bash -c 'sleep 4h; sudo -u dessert whoami; whoami'
dessert # whoami run as user dessert
root # whoami run as root
En supposant que vous ne souhaitiez exécuter le processus qu'une seule fois (pas, par exemple toutes les 4 heures), vous pouvez utiliser atd
Assurez-vous que atd est en cours d'exécution (dans ubuntu c'est /etc/init.d/atd statusou mieux encore systemctl status atd)
Sur un terminal en tant que root, exécutez votre commande comme suit:
# at now + 4 hours
warning: commands will be executed using /bin/sh
at> command
at> CTRL-D
Si vous voulez l'exécuter toutes les 4 heures, vous pouvez également utiliser cron (en tant que root) avec la configuration suivante dans votre crontab
Oui, atest le bon outil pour ce travail, car il prend également en charge la redirection des E / S, ne bloque pas une fenêtre shell et fonctionne même lorsque l'utilisateur s'est déconnecté ou que la machine a été redémarrée depuis.
Simon Richter
4
@SimonRichter: sudo bash -c 'sleep 4h && command' &mettre sudo en arrière-plan est un moyen plus simple de ne pas bloquer une fenêtre / tabulation de shell. Si vous souhaitez que la sortie s'affiche de manière asynchrone pour rappeler que cela s'est produit, c'est plus facile. Cela ne fonctionne pas lors des redémarrages, mais selon vos nohupparamètres, il peut continuer à fonctionner après avoir quitté / déconnecté d'un shell.
Peter Cordes
4
Notez que atla commande est exécutée dès qu'elle le peut lorsque le système est suspendu à l'heure spécifiée, voir ici sur U&L - selon la ou les commandes à exécuter, cela peut ne pas être ce que vous voulez.
dessert le
2
Juste une suggestion, vous pouvez également utiliser systemctl pour vérifier l'état du service au lieu d'appeler directement ce script init.d. Bien que les deux aient apparemment le même résultat, je pense que la manière moderne d'interagir avec les services systemd devrait être préférée:systemctl status atd
Byte Commander
15
Une façon consiste à exécuter via un shellscript avec des sudoautorisations (et donner le mot de passe, lorsque vous démarrez le shellscript), si le shellscript se trouve dans le répertoire en cours,
sudo ./delayer 4h
où delayerpeut être un script avec le contenu
#!/bin/bash
sleep "$1"
command
Rendez-le exécutable avec
chmod +x delayer
et copiez-le ou déplacez-le dans un répertoire PATHsi vous le souhaitez.
Si vous voulez un shellscript plus flexible, où vous pouvez sélectionner la commande [ligne] pour retarder en entrant le (s) paramètre (s), vous pouvez essayer
Eh bien, si c'est la /bin/shsyntaxe, ça ira. Mais si vous avez l'intention d'utiliser des fonctionnalités spécifiques à bash, alors shebang est nécessaire. Moi et le conducteur d'acier en avons discuté quelque part. Aaand Videonauth a supprimé son commentaire avant que je puisse répondre correctement.
Eh
@SergiyKolodyazhnyy, vous avez raison. Donc, dans ce cas, le shebang est là pour rendre le shellscript robuste en cas de fonctionnalités supplémentaires où la syntaxe peut différer.
sudodus
@SergiyKolodyazhnyy Eh bien, c'était juste une suggestion, donc j'ai pensé que laisser le commentaire là n'était pas nécessaire et ne ferait qu'ajouter à l'encombrement. N'hésitez pas à me contacter dans le chat et à indiquer votre point de vue :)
Videonauth
2
Une autre façon serait de démarrer la session interactive sudo avec sudo -s(ne change pas de répertoire) ou sudo -i(change le répertoire courant en répertoire racine) puis entrez vos commandes (sans sudo)
shutdown
. avec sudo et les arguments appropriés pour planifier le sommeil à une heure spécifique.Réponses:
Utilisez
sudo
pour démarrer un shell racine où vous exécutez les commandes:Chaque commande exécutée dans le shell racine s'exécute avec les autorisations root, ce qui
sleep
ne fait pas de mal. Si vous devez exécuter une commande avec des autorisations utilisateur, utilisezsudo -u USERNAME COMMAND
, par exemple:Une autre approche consisterait
sudo visudo
à autoriser l'exécution de la commande sans accès root, voir: Comment autoriser l'exécution sans demander de mot de passe à l'aide de sudo?Notez que selon la commande, cela peut créer une faille de sécurité.
la source
En supposant que vous ne souhaitiez exécuter le processus qu'une seule fois (pas, par exemple toutes les 4 heures), vous pouvez utiliser
atd
/etc/init.d/atd status
ou mieux encoresystemctl status atd
)Sur un terminal en tant que root, exécutez votre commande comme suit:
Si vous voulez l'exécuter toutes les 4 heures, vous pouvez également utiliser cron (en tant que root) avec la configuration suivante dans votre crontab
la source
at
est le bon outil pour ce travail, car il prend également en charge la redirection des E / S, ne bloque pas une fenêtre shell et fonctionne même lorsque l'utilisateur s'est déconnecté ou que la machine a été redémarrée depuis.sudo bash -c 'sleep 4h && command' &
mettre sudo en arrière-plan est un moyen plus simple de ne pas bloquer une fenêtre / tabulation de shell. Si vous souhaitez que la sortie s'affiche de manière asynchrone pour rappeler que cela s'est produit, c'est plus facile. Cela ne fonctionne pas lors des redémarrages, mais selon vosnohup
paramètres, il peut continuer à fonctionner après avoir quitté / déconnecté d'un shell.at
la commande est exécutée dès qu'elle le peut lorsque le système est suspendu à l'heure spécifiée, voir ici sur U&L - selon la ou les commandes à exécuter, cela peut ne pas être ce que vous voulez.systemctl status atd
Une façon consiste à exécuter via un shellscript avec des
sudo
autorisations (et donner le mot de passe, lorsque vous démarrez le shellscript), si le shellscript se trouve dans le répertoire en cours,où
delayer
peut être un script avec le contenuRendez-le exécutable avec
et copiez-le ou déplacez-le dans un répertoire
PATH
si vous le souhaitez.Si vous voulez un shellscript plus flexible, où vous pouvez sélectionner la commande [ligne] pour retarder en entrant le (s) paramètre (s), vous pouvez essayer
Exemple de démonstration (court délai, 5 s, à des fins de démonstration),
la source
/bin/sh
syntaxe, ça ira. Mais si vous avez l'intention d'utiliser des fonctionnalités spécifiques à bash, alors shebang est nécessaire. Moi et le conducteur d'acier en avons discuté quelque part. Aaand Videonauth a supprimé son commentaire avant que je puisse répondre correctement.Une autre façon serait de démarrer la session interactive sudo avec
sudo -s
(ne change pas de répertoire) ousudo -i
(change le répertoire courant en répertoire racine) puis entrez vos commandes (sans sudo)la source