Planifiez-vous une commande pour une exécution ultérieure?

87

Quel est un moyen simple d'exécuter une commande, disons dans 8 heures? Je peux penser de cette façon:

nohup bash -c "sleep 28800 ; ./mycommand.sh" &

Y a-t-il une manière plus "correcte"?

Steve Bennett
la source
Quelque chose ne va pas avec nohup+ sleep? Pourquoi est-ce "impropre"?
cprn

Réponses:

123

Vous pouvez utiliser la atcommande. Les atcommandes à exécuter ultérieurement. L' atutilitaire doit lire les commandes à partir de l'entrée standard et les regrouper en une tâche à exécuter ultérieurement.

Habituellement, il atest installé par défaut dans Ubuntu, mais si votre version ne l’inclut pas, installez-la via:

sudo apt-get install at

Pour plus d'informations, options, exemples et autres, voir le référentiel de pages de manuel Ubuntu.

Exemple:

at now +8 hours -f ~/myscript.sh

Vous pouvez également utiliser des raccourcis pratiques, comme tomorrowou noon, comme dans

echo "tweet fore" | at teatime 

Avertissement: Ceci lancera immédiatement la commande située à gauche du tuyau,mais ne présentera sa sortie que plus tard. L'exemple montre également comment vous pouvez diriger des actions dansat. at -cC’est ainsi que vous pouvez examiner les actions planifiées, que vous pouvez facilement lister avec leur numéro, comme avec:

at -c 3
Mitch
la source
19
Il pourrait être utile d'ajouter un exemple d'utilisation simple qui répond plus spécifiquement à la question de l'affiche originale, par exempleat now +8 hours -f ~/myscript.sh
Steeldriver
6
En outre, il faut at 8:00exécuter la commande à une heure absolue, et batchpour "quand on dirait que l'ordinateur est en veille"
Simon Richter
4
Au cas où quelqu'un se le demanderait, teatimeest à 16 heures. Pour certaines raisons, il n'est pas mentionné dans manpages.ubuntu.com/manpages/raring/man1/at.1posix.html, mais c'est dans man atet ici manpages.ubuntu.com/manpages/raring/en/man1/at.1.html .
Dan
3
Peut-être que nous pouvons mentionner que l'utilitaire "at" n'est pas installé par défaut et si quelqu'un d'autre veut l'obtenir, installez simplement le paquet "at"? Edit: Quoi qu’il en soit, j’ai simplement modifié la réponse (le lien vers la page de manuel a également été corrigé).
heartsmagic
4
Faites attention à ce que la tuyauterie dans exécute la commande immédiatement et ne programme que la sortie. J'ai eu un échec d'impression 3D de 4 heures parce que je voulais planifier gpio write 8 1mais il s'est exécuté immédiatement.
Maciej Swic
8

Oui, vous pouvez définir un travail cron.

Par exemple, si le temps est 14h39:00 et que nous sommes le vendredi 30 août, vous pouvez ajouter le travail cron suivant (à exécuter après 8 heures) dans votre fichier crontab à l'aide de la crontab -ecommande:

39 22 30 8 5  /path/to/mycommand.sh

Plus à propos:

Radu Rădeanu
la source
3
Ok, oui, j'aurais dû mentionner que je connaissais les emplois Cron. Ceci est encore plus compliqué, car il reste indéfiniment dans la crontab, non?
Steve Bennett
4
@ RaduRădeanu: avec cron, faites attention à ce qu'il puisse se rallumer dans quelques années (quand il y aura un autre 30 août survenant un vendredi) ...
Olivier Dulac
2
Ceci est un hack intelligent. Cependant, "à" est un bien meilleur moyen. Que se passerait-il si l'ordinateur était éteint à 14h39?
emory
1
Euh ce n'est toujours pas mon propos. Mon point est que le texte que vous avez entré restera (je pense) littéralement toujours dans votre crontab après l’événement, ce qui créera une autre tâche de nettoyage pour vous.
Steve Bennett
2
@SteveBennett Oui, vous avez raison. La commande restera dans votre crontabjusqu'à ce que vous la supprimiez. Un an plus tard, une fois que vous avez oublié qui l'a mis là et pourquoi, il vous restera à vous gratter la tête et à vous demander quoi faire avec cette commande.
Paddy Landau
8

Utilisez l'interface graphique basée sur Gnome pour cron, atetc.:

L'introduction de CronHowto suggère d'utiliser l' interface graphiquegnome-schedule , ce qui est beaucoup plus pratique que de taper toutes les ordures dans le terminal (en particulier pour les utilisateurs "moyens" d'Ubuntu qui ne sont pas des utilisateurs "puissants" * nix / bsd.)

Exécutez-le à l'aide du tableau de bord Unity (ou d'un autre menu d'applications) pour rechercher des tâches planifiées ou en cours d'exécution gnome-schedule.

Sur les systèmes Ubuntu basés sur Gnome, l'outil Tâches planifiées Gnome (du paquet gnome-schedule) dans Applications -> Outils système fournit une interface graphique avec une invite à utiliser Cron. Le site Web du projet est à l’adresse http://gnome-schedule.sourceforge.net/ ; le logiciel est installable à partir du centre logiciel ou en tapant

sudo apt-get install gnome-schedule

dans un terminal.

En utilisant gnome-schedule, pour un script de votre répertoire personnel, une nouvelle commande "at" serait configurée en utilisant ce type de fenêtre:

entrez la description de l'image ici

utilisateur29020
la source
5

J'ai trouvé un moyen rapide et sale de faire cela avant de découvrir que atc'était une chose.

Supposons que votre script soit exécuté à midi:

until [[ "$(date)" =~ "12:00:" ]]; do
    sleep 10
done
./mycommand.sh

Supposons que vous souhaitiez le lancer demain midi (aujourd'hui, le 24 novembre):

until [[ "$(date)" =~ "25 12:00:" ]]; do 
    sleep 30
done
./mycommand.sh

Mise à jour : méthode légèrement meilleure: testez uniquement les chiffres qui vous intéressent, en utilisant date +FORMAT:

until [[ $(date +%H:%M) == 21:06 ]]; do
    ...
Wjandrea
la source
10
Pour les deux personnes qui ont upvoted cette réponse, utilisez s'il vous plaît at, cronou toute autre application de planificateur réel. La planification des tâches est difficile et vous ne devez pas réinventer une roue.
Dimo414
1
@ dimo414 Quel est le problème avec ma méthode?
Wjandrea
8
Au minimum, il faut attendre, ce qui est une perte de temps. Pire, ce n'est pas garanti d'être correct; il est parfaitement possible (si peu probable) que la condition soit manquée. Baser votre planificateur sur des expressions régulières est également très sujet aux erreurs. Cela pourrait fonctionner assez bien , mais ne présente aucun avantage at.
Dimo414
(À part: je n'ai pas baissé votre réponse, je ne pense pas que les gens devraient l'utiliser)
dimo414
4
Une autre raison à utiliser atest que ses travaux survivront à un redémarrage.
manatwork