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 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. (il fonctionne bien si je l'invoque à partir de la ligne de commande, donc ce n'est pas un problème de permissions)
Qu'est-ce que je rate?
Mise à jour pour répondre aux questions d'Anthon:
/home
est une partition montée. On dirait que c'est le problème. Comment contourner cela?myscript.sh
renvoie uniquement un message texte dans un fichier dans /home/me
.Cela peut être un peu déroutant car il existe différentes implémentations de cron. Il y a également eu plusieurs bogues qui ont cassé cette fonctionnalité, et il y a aussi des cas d'utilisation où cela ne fonctionne tout simplement pas, en particulier si vous faites un arrêt/démarrage par rapport à un redémarrage.
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 avoir également fait son chemin dans Ubuntu, ce que je ne peux pas confirmer directement.
point de données # 2
La preuve du bogue dans Ubuntu semble être confirmée ici dans ce SO Q&A intitulé: @ reboot cronjob not executing .
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 crontab -l -u user
commentaire # 2: ... Ce pourrait être une bonne idée de le configurer comme un script d'initialisation au lieu de compter sur une version spécifique de @reboot de 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? Je vous remercie!
La réponse acceptée dans cette Q&R comportait également ce commentaire:
Il me semble que Lubuntu ne prend pas en charge la syntaxe @Reboot Cron.
point de données # 3
Comme preuve supplémentaire, il y avait ce fil que quelqu'un tentait la même chose et était frustré que cela ne fonctionne pas. Il est intitulé: Thread: Cron - @reboot jobs not working .
extrait
Re: Cron - Les emplois @reboot ne fonctionnent pas
Citation Envoyé par ceallred Voir le message Cela me tue ... J'ai essayé le script wrapper. L'exécution manuelle génère le fichier journal ... 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 n'est pas en cours d'exécution. 15 juil 20:07:45 RavenWing cron [1026]: (CRON) INFO (exécution des travaux @reboot) 15 juil 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 commencer 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/nom d'utilisateur/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 a disparu. J'imagine un crash pour une raison quelconque ... Nouveau fil de discussion à ce sujet.
Merci pour votre aide!
Une fois que cet utilisateur ci-dessus a découvert son problème, il a pu obtenir @reboot
élaboration de l'entrée crontab d'un utilisateur.
Je ne sais pas vraiment 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 les éléments suivants et cela a fonctionné.
$ 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
Pour en savoir plus sur le fonctionnement du mécanisme réel pour @reboot
Je suis tombé sur ce billet de blog qui parle des entrailles. Il est intitulé: @ reboot - expliquant la magie cron simple .
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.
J'ai découvert que sur ma machine Ubuntu, je n'ai pas encore accès aux services DNS, au moment de @reboot. Cela m'a empêché de monter des volumes distants. Cette solution ringarde, mais simple, a fonctionné:
@reboot sleep 60 && /home/me/bin/mount.sh 2>&1 >> /home/me/reboot.log
(en root cron; dernières parties uniquement pour le débogage)
Je ne sais pas si vous avez déjà résolu cela, ou si l'une des solutions ci-dessus était la solution dont vous aviez besoin, mais une autre possibilité est:
si votre répertoire/home est crypté, il peut ne pas être disponible tant que vous ne vous ê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 comme/srv ou/opt ou/usr/local/bin/etc.
J'ai aussi mac osx et j'ai eu le même problème où mon script n'était pas en cours d'exécution. mais quand j'ai corrigé mon script comme
@reboot cd /home/me/ && sh myscript.sh
cela a bien fonctionné pour moi. assurez-vous de rendre votre fichier Shell exécutable en exécutant la commande
chmod +x myscript.sh
Prenez une nouvelle installation d'Ubuntu Gnome 13.10 (utilisateur par défaut dans mon cas: avanderneut).
avanderneut@uggo:~$ crontab -l
no crontab for avanderneut
avanderneut@uggo:~$ crontab -e
no crontab for avanderneut - using an empty one
Select an editor. To change later, run 'select-editor'.
1. /bin/ed
2. /bin/nano <---- easiest
3. /usr/bin/vim.tiny
Choose 1-3 [2]: 3
crontab: installing new crontab
avanderneut@uggo:~$ crontab -l | tail -2
# m h dom mon dow command
@reboot /home/avanderneut/bin/on_reboot
avanderneut@uggo:~$ vi /home/avanderneut/bin/on_reboot
avanderneut@uggo:~$ more !$
more /home/avanderneut/bin/on_reboot
#! /bin/bash
echo "Reboot script" > /var/tmp/xxx
avanderneut@uggo:~$ chmod 755 /home/avanderneut/bin/on_reboot
avanderneut@uggo:~$ ls /var/tmp
avanderneut@uggo:~$ /home/avanderneut/bin/on_reboot
avanderneut@uggo:~$ ls /var/tmp
xxx
avanderneut@uggo:~$ rm /var/tmp/xxx
avanderneut@uggo:~$ Sudo reboot
[Sudo] password for avanderneut:
Et voyez qu'après avoir redémarré le fichier /var/tmp/xxx
est là bien que il n'était pas là avant le redémarrage.
Cela a été fait avec cron version 3.0.
Vous devez vous assurer qu'aucun disque de services, etc. n'est utilisé qui 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 à jour (ou d'une mise à niveau d'Oracle-linux) si cela ne fonctionnait pas pour vous et que vous avez besoin de cette fonctionnalité.
Tout d'abord, vous devez vous connecter en tant que root:
Sudo -i
Ouvrez ensuite crontab:
crontab -e
Après cela, ajoutez votre script à crontab en tant que root comme ci-dessous:
@reboot root/home/user1/Desktop/my_script
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.
Je dirais oui pour la question. J'ai juste eu des difficultés à 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
Voici le contenu du fichier:
/etc/cron.d/runOnReboot
Enfin, je pense qu'il vaut la peine de noter un résumé de man 5 crontab
... Le format d'une commande cron est très similaire à la norme V7, avec un certain nombre d'extensions à compatibilité ascendante. Chaque ligne comporte cinq champs d'heure et de date, suivis d'une commande, suivis d'un caractère de nouvelle ligne ('\ n'). La crontab système (/ etc/crontab) utilise le même format, sauf que le nom d'utilisateur de la commande est spécifié après les champs d'heure et de date et avant la commande. Les champs peuvent être séparés par des espaces ou des tabulations. La longueur maximale autorisée pour le champ de commande est de 998 caractères. ...