Je suis un novice Linux relatif. J'essaie d'apprendre à utiliser at
afin de pouvoir planifier des tâches pour commencer plus tard, sans utiliser sleep
. J'ai regardé cette question précédente pour obtenir de l'aide.
Ma question est, dans l'exemple de script bash suivant que j'ai créé, pourquoi "Running" n'est jamais - autant que je sache - imprimé sur la sortie standard (c'est-à-dire ma console bash)?
#!/bin/bash
echo "Started"
at now + 1 minutes <<EOF
echo "Running"
EOF
echo "Finished"
La seule sortie que je vois est, par exemple:
Started warning: commands will be executed using /bin/sh job 3 at Fri Jul 12 17:31:00 2013 Finished
La réponse à ma question se trouve-t-elle dans l'avertissement? Si oui, en quoi /bin/sh
diffère- t -il de la sortie standard?
sleep 3m; echo Running
Réponses:
Car
at
n'exécute pas de commandes dans le contexte de votre session utilisateur connectée. L'idée est que vous pouvez planifier l'exécution d'une commande à une heure arbitraire, puis vous déconnecter et le système se chargera d'exécuter la commande à l'heure spécifiée.Notez que la page de manuel
at(1)
indique spécifiquement (je souligne):Vous devez donc vérifier votre spouleur de messagerie locale ou, à défaut, les journaux de messagerie du système local. / var / spool / mail / $ USER est probablement un bon point de départ.
Notez également que le "Démarré" et le "Terminé" proviennent du script externe et n'ont rien à voir avec eux-mêmes
at
. Vous pouvez les retirer ou l'at
invocation et vous obtiendrez essentiellement le même résultat.la source
Comme @ MichaelKjörling l'a expliqué, toute sortie produite par votre
at
travail sera capturée et envoyée par e-mail. Si vous n'avez pas d' agent de transfert de courrier MTA en cours d'exécution sur votre boîte, l'e-mail peut être dans les limbes et vous ne saurezat
même pas qu'il tente de le faire.Un MTA est un programme tel que
sendmail
oupostfix
qui peut "livrer" des e-mails à une destination appropriée. Dans ce cas, il va le remettre dans une file d'attente de messagerie (un fichier sous le répertoire/var/spool/mail
) sur votre système local. Chaque utilisateur du système peut avoir une file d'attente dans ce répertoire.Sur mon système Fedora si je démarre,
sendmail
la livraison du courrier local peut avoir lieu. Je l'ai généralement éteint cependant.Maintenant, nous pouvons voir que ma file d'attente de messagerie pour mon compte d'utilisateur
saml
est vide:Alors maintenant, nous exécutons le
at
travail:Nous pouvons voir que le travail attend de s'exécuter avec
atq
:En l'exécutant à nouveau après quelques minutes, nous pouvons voir que le
at
travail est terminé:Par ailleurs, avec mon MTA en cours d'exécution, je reçois maintenant ce message dans mon terminal:
Vérifions donc:
Oui, nous avons du courrier, alors vérifions-le en utilisant
mutt
:Nous avons ceci dans la "boîte de réception" de notre file d'attente de courrier:
Voyons cet e-mail:
Et ça a marché.
la source
J'utilise Debian 8.1 (jessie)
Vous pouvez demander à la sortie «at» d'aller sur un terminal en utilisant tty.
Une minute plus tard, 'ZZZZZ' apparaîtra dans votre terminal ...
la source
Les réponses ci-dessus sont la manière standard / "correcte" de le faire.
Une autre approche plus simple d'un point de vue plus «utilisateur final» consiste à faire en sorte que toute tâche planifiée ou en arrière-plan écrive sa sortie dans un fichier «journal». Le fichier peut se trouver n'importe où sur votre système, mais si la tâche s'exécute en tant que root (à partir de
cron
, etc.), alors quelque part sous/var/log
est un bon endroit pour le mettre.J'ai créé le
/var/log/maint
répertoire et l' ai rendu lisible par tout le monde et j'ai un fichier lisible sous celui appelé "sauvegarde" où je journalise la sortie de mes scripts de sauvegarde.J'ai créé mon propre répertoire afin que mes fichiers ne soient pas mélangés avec les éléments générés par le système.
Pour y mettre des trucs (en bash):
Le
>>
fait que les messages sont ajoutés au fichier au lieu de le remplacer à chaque fois.Si mon script a beaucoup de sortie, j'utilise un script ou une fonction pour la sortie afin que tout soit fait de la même manière. Ci-dessous est ma version actuelle (overkill): (le truc VERBOSE est là lorsque j'exécute le script à partir d'un terminal et que je veux voir ce qui se passe à des fins de débogage.)
Edit:
at
exemple simpliste qui écrit dans un fichier utilisateurJe n'ai pas utilisé cela depuis toujours, donc je l'ai compris avec quelques scripts simples.
Le premier script planifie simplement l'événement en utilisant
at
. La commande elle-même pourrait simplement être tapée dans un terminal, mais je suis paresseux - surtout quand je dois le faire plusieurs fois tout en le testant sans tromper avec l'historique des commandes.Le deuxième script est celui qui doit s'exécuter
J'ai créé les deux scripts dans un éditeur de texte, les ai enregistrés, puis les ai rendus exécutables à l'aide de
chmod 700 script-file-name
. Je les mets tous les deux dans mon$HOME/bin
annuaire pour plus de commodité, mais ils peuvent se trouver partout où mon utilisateur a un accès complet. J'utilise700
pour n'importe quel script uniquement pour les tests, mais sur un système mono-utilisateur, il pourrait tout aussi bien l'être755
.J'ai déjà un répertoire appelé
/home/bigbird/log
pour enregistrer la sortie demytest_at_script
. Cela peut également se faire partout où votre utilisateur a un accès complet. Assurez-vous simplement qu'il existe avant l'exécution du script ou que le script le crée.Pour l'exécuter, je me suis juste assuré que l'heure de la
at
commandemytest_at_run
était un peu dans le futur, puis je l'ai exécutée à partir d'un terminal. J'ai ensuite attendu qu'il s'exécute et j'ai examiné le contenu de$HOME/log/at.log
.Quelques notes:
Même si je cours
at
depuis mon utilisateur, il ne connaît pas mon environnement tel que monPATH
et mon répertoire personnel, donc je ne le suppose pas. J'utilise des chemins complets comme je le ferais pour n'importe quelcron
travail. Et si jamais je veux en faire uncron
travail, je n'aurai rien à changer juste pour le faire fonctionner.Je
>>
enmytest_at_script
la sortie append dans le fichier journal au lieu de ce>
qui aurait remplacé sur chaque course. Utilisez celui qui convient le mieux à votre application.la source
at
pour écrire dans un fichier. Il semble que vous ayez récupéré la séquence d'appel dans votre exemple. Je ne sais pas très bienat
quand exécuter le travail, alors je viens de coder en dur une heure dans un avenir très proche.