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.
Alors j’ai heureusement 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 fonctionnerait pas au redémarrage de la machine. (ça marche bien si je l'invoque depuis la ligne de commande, donc ce n'est pas un problème d'autorisations)
Qu'est-ce que je rate?
Mise à jour pour répondre aux questions de @ Anthon:
- Version Oracle-linux: 5.8 (uname: 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? - À l’heure actuelle,
myscript.sh
seul un message texte est envoyé à un fichier dans/home/me
.
/home
une partition montée? Quel est le contenu de votre/home/me/myscript.sh
?@reboot
. oss.oracle.com/pipermail/el-errata/2012-March/002655.htmlmyscript.sh
exécutable?chmod +x myscript.sh
.Réponses:
Cela peut être un sujet déroutant car il existe différentes implémentations de cron. De plus, plusieurs bogues ont cassé cette fonctionnalité, et il y a aussi des cas d'utilisation où cela ne fonctionne tout simplement pas, en particulier si vous effectuez un arrêt / un démarrage par rapport à un redémarrage.
Bogues
point de donnée n ° 1
Un de ces bogues dans Debian est couvert ici, intitulé: cron: les travaux @reboot ne sont pas exécutés . Cela semble également avoir fait son chemin dans Ubuntu, ce que je ne peux pas confirmer directement.
point de donnée n ° 2
La preuve du bogue dans Ubuntu semblerait être confirmée ici dans ce SO Q & A intitulé: @reboot cronjob ne s'exécutant pas .
extrait
La réponse acceptée dans ce Q & A avait également ce commentaire:
Preuves supplémentaires
point de donnée n ° 3
Comme preuve supplémentaire, il y avait ce fil conducteur que quelqu'un tentait exactement la même chose et devenait frustré que cela ne fonctionne pas. Il s'intitule: Thread: Cron - Les travaux @reboot ne fonctionnent pas .
extrait
Une fois que cet utilisateur ci-dessus a découvert son problème, il était capable de
@reboot
travailler avec l'entrée crontab d'un utilisateur.Je ne suis pas tout à fait sûr de la version de cron utilisée sur Ubuntu, mais cela semblerait indiquer que l'utilisateur peut
@reboot
également l' utiliser , ou que le bogue a été corrigé à un moment donné dans les versions ultérieures de cron.point de donnée n ° 4
J'ai testé sur CentOS 6 ce qui suit et cela a fonctionné.
Exemple
J'ai ensuite redémarré le système.
Après le redémarrage.
À emporter
Pour en savoir plus sur le fonctionnement du mécanisme actuel,
@reboot
je suis tombé sur ce billet de blog qui traite des entrailles. Il s'intitule: @reboot - explique la simple magie cron .Debugging Crond
Vous pouvez augmenter la verbosité de
crond
en ajoutant les éléments suivants à ce fichier de configuration sur les distributions basées sur RHEL / CentOS / Fedora.Les niveaux valides sont 0, 1 ou 2. Pour rétablir le niveau de consignation par défaut de ce fichier, supprimez simplement le
"-L 2"
moment où vous avez terminé de déboguer la situation.la source
@reboot
est acceptable dans certains cas et apparemment défectueux dans d'autres. D'où la confusion.@reboot
a fonctionné une fois que vous avez réalisé qu’il essayait d’accéder à un lecteur chiffré, qui n’avait pas encore été monté.@reboot sleep 60; <your command>
. Pour citer le fil, "je suppose que la directive @reboot de cron est trop avancée dans le processus de démarrage"J'ai découvert que sur ma machine Ubuntu, je n'ai pas encore accès aux services DNS, à l'heure de @reboot. Cela m'a empêché de monter des volumes distants. Cette solution simple mais simple a fonctionné:
@reboot sleep 60 && /home/me/bin/mount.sh 2>&1 >> /home/me/reboot.log
(dans root cron; dernières parties uniquement pour le débogage)
la source
J'ai aussi mac osx et j'ai eu le même problème où mon script ne fonctionnait pas. mais quand j'ai corrigé mon script pour aimer
cela a bien fonctionné pour moi. assurez-vous de rendre votre fichier shell exécutable en exécutant la commande
la source
Je ne sais pas si vous avez déjà résolu ce problème ou si l'une des solutions ci-dessus était la solution dont vous aviez besoin, mais une autre possibilité est la suivante:
Si votre répertoire / home est crypté, il peut ne pas être disponible tant que vous n'êtes pas connecté, c'est-à-dire qu'il n'est pas disponible au redémarrage.
dans ce scénario, vous pouvez déplacer vos scripts vers un autre emplacement, tel que / srv ou / opt ou / usr / local / bin / etc.
la source
Prenez une nouvelle installation de Ubuntu Gnome 13.10 (utilisateur par défaut dans mon cas: avanderneut).
Et voyez qu'après le redémarrage, le fichier
/var/tmp/xxx
est là bien qu'il ne soit pas là avant le redémarrage.Cela a été fait avec la version 3.0 de cron.
Vous devez vous assurer qu'aucun disque de service, etc., n'est utilisé et pourrait ne pas être disponible au moment de l'exécution du script. Commencez avec quelque chose de simple comme ci-dessus et assurez-vous qu'il n'a pas de sortie de terminal, car le courrier électronique n'est probablement pas opérationnel.
Vous pourriez également avoir besoin d’un cron plus récent (ou d’une mise à jour d’oracle-linux) si cela ne fonctionnait pas pour vous et si vous aviez besoin de cette fonctionnalité.
la source
/dev/mapper/VolGroup00-LogVol01
partition pouvant être montée.cron
. IMHO devrait suivre un chemin différent de celui de crontab & @reboot pour exécuter quelque chose une fois au démarrage en tant qu'utilisateur.Je dirais oui pour la question. Je viens de rencontrer des difficultés pour exécuter cron au redémarrage (Debian 3.10.70) et j'ai réussi à résoudre avec:
@reboot root /usr/bin/python3 /path/to/script
Et un caractère de nouvelle ligne '\ n' à la fin
Ceci est le contenu du fichier:
Enfin, je pense qu’il est intéressant de noter un résumé de
man 5 crontab
la source
Tout d’abord, vous devez vous connecter en tant que root:
Puis ouvrez crontab:
Après cela, ajoutez votre script à la crontab en tant que root, comme ci-dessous:
En conséquence, j'ai vu que mon script fonctionnait correctement.
Remarque: Si vous modifiez crontab avec votre utilisateur actuel, le redémarrage ne peut pas appeler votre script correctement.
la source
prueba:
usuario @ ubuntu: ~ $ touch script.sh usuario @ ubuntu: ~ $ chmod + x script.sh
usuario @ ubuntu: ~ $ $ crontrab -e
@reboot /home/usuario/script.sh
enregistrer et redémarrer votre pc
la source