man 5 crontab
est assez clair sur la façon d'utiliser crontab pour exécuter un script au démarrage :
These special time specification "nicknames" are supported, which replace the 5 initial time and date
fields, and are prefixed by the `@` character:
@reboot : Run once after reboot.
J'ai donc joyeusement ajouté une seule ligne à ma crontab (sous mon compte utilisateur, pas root):
@reboot /home/me/myscript.sh
Mais pour une raison quelconque, myscript.sh ne s'exécuterait pas au redémarrage de la machine.
(il fonctionne correctement si je l'invoque depuis la ligne de commande, ce n'est donc pas un problème d'autorisations)
Qu'est-ce que je rate ?
Mise à jour pour répondre aux questions d'@Anthon :
- Version Oracle-linux : 5.8 (nom :2.6.32-300.39.2.el5uek #1 SMP)
- Version Cron :vixie-cron-4.1-81.el5.x86_64
- Oui,
/home
est une partition montée. On dirait que c'est le problème. Comment puis-je contourner ce problème ? - Actuellement,
myscript.sh
renvoie uniquement un message texte dans un fichier dans/home/me
.
Réponse acceptée :
Cela peut être un sujet un peu déroutant car il existe différentes implémentations de cron. De plus, plusieurs bogues ont interrompu cette fonctionnalité, et il existe également des cas d'utilisation où cela ne fonctionnera tout simplement pas, en particulier si vous effectuez un arrêt/démarrage plutôt qu'un redémarrage.
Bogues
point de données 1
Un de ces bogues dans Debian est couvert ici, intitulé :cron :les tâches @reboot ne sont pas exécutées. Cela semble également avoir fait son chemin dans Ubuntu, ce que je ne peux pas confirmer directement.
point de données 2
La preuve du bogue dans Ubuntu semblerait être confirmée ici dans ce SO Q&A intitulé :@reboot cronjob not running.
extrait
commentaire #1 :…. 3) votre version de crond peut ne pas prendre en charge @reboot utilisez-vous le crond de vix ? … afficher les résultats de l'utilisateur crontab -l -u
commentaire n° 2 : Cron
commentaire #3 :… @MarkRoberts a supprimé le redémarrage et modifié le 1 * * * * , en */1 * * * * , le problème est résolu ! Où dois-je envoyer le représentant pts Mark ? Merci !
La réponse acceptée dans cette Q&A contenait également ce commentaire :
Il me semble que Lubuntu ne prend pas en charge la syntaxe @Reboot Cron.
Preuve supplémentaire
point de données #3
Comme preuve supplémentaire, il y avait ce fil que quelqu'un tentait exactement la même chose et était frustré que cela ne fonctionne pas. Il s'intitule :Thread :Cron - Les tâches @reboot ne fonctionnent pas.
extrait
Re :Cron - Les tâches @reboot ne fonctionnent pas
Citation Envoyé à l'origine par ceallred Voir le message
Cela me tue… J'ai essayé le script wrapper. L'exécution manuelle génère le fichier journal... le redémarrage et le travail ne s'exécute pas ou ne crée pas de fichier journal.Syslog montre que CRON a exécuté le travail… mais encore une fois, aucune sortie et le processus ne s'exécute pas. /> 15 juillet 20:07:45 RavenWing CRON[1053] :(ceallred) CMD (/home/ceallred/Scripts/run_spideroak.sh> /home/ceallred/Scripts/SpiderOak.log 2>&1 &)
Il semble que cron n'aime pas la commande @reboot…. D'autres idées ?
D'accord… Partiellement résolu. Je vais marquer celui-ci comme résolu et démarrer un nouveau fil avec le nouveau problème…..
Je pense que la réponse était que mon répertoire personnel chiffré n'était pas monté lorsque CRON essayait d'exécuter le script (stocké dans /home/username/scripts). Déplacé vers /usr/scripts et le travail s'exécute comme prévu.
Alors maintenant, cela semble être un problème de spideroak. Le processus démarre, mais au moment où le processus de démarrage est terminé, il est parti. Je suppose un accident pour une raison quelconque…. Nouveau fil pour poser des questions à ce sujet.
Merci pour toute l'aide !
Une fois que cet utilisateur ci-dessus a compris son problème, il a pu obtenir @reboot
élaboration de l'entrée crontab d'un utilisateur.
Je ne sais pas exactement quelle version de cron est utilisée sur Ubuntu, mais cela semblerait indiquer que l'utilisateur peut utiliser @reboot
aussi, ou que le bogue a été corrigé à un moment donné dans les versions ultérieures de cron.
point de données #4
J'ai testé sur CentOS 6 ce qui suit et cela a fonctionné.
Exemple
$ crontab -l
@reboot echo "hi" > /home/sam/reboot.txt 2>&1
J'ai ensuite redémarré le système.
$ sudo reboot
Après le redémarrage.
$ cat reboot.txt
hi
À emporter
- Cette fonctionnalité semble être prise en charge pour les entrées crontab système et utilisateur.
- Vous devez vous assurer qu'il est pris en charge/fonctionne dans votre distribution et/ou version particulière du package cron.
Pour en savoir plus sur le fonctionnement du mécanisme réel pour @reboot
Je suis tombé sur ce billet de blog qui traite des entrailles. Il s'intitule :@reboot - expliquer la magie cron simple.
Crond de débogage
Vous pouvez augmenter la verbosité de crond
en ajoutant ce qui suit à ce fichier de configuration sur les distributions basées sur RHEL/CentOS/Fedora.
$ more crond
# Settings for the CRON daemon.
# CRONDARGS= : any extra command-line startup arguments for crond
CRONDARGS="-L 2"
Les niveaux valides sont 0, 1 ou 2. Pour rétablir ce fichier à son niveau de journalisation par défaut, supprimez simplement le "-L 2"
lorsque vous avez terminé de déboguer la situation.