web-dev-qa-db-fra.com

Crontab Exécution du script au démarrage

J'ai un .sh qui exécute une commande. Je veux utiliser crontab -e et entrer dans le fichier @reboot/path/to/command.

Comment exécuter cela dans une commande au lieu d'exécuter séparément crontab -e, puis insérez manuellement la ligne puis enregistrez le fichier.

1
Murda Ralph

Lorsque vous utilisez crontab -e, un fichier est créé à /var/spool/cron/crontabs/ dont le nom correspond à votre nom d'utilisateur.

Il suffit donc de rediriger la ligne souhaitée vers ce fichier:

echo "@reboot /path/to/file.sh" | Sudo tee -a /var/spool/cron/crontabs/$USER
  • en utilisant tee -a nous demandons à tee d’ajouter @reboot /path/to/file.sh à la fin de ce fichier au lieu de l’écraser.
  • si ce n'est pas là, il sera créé.
1
Ravexina

Probablement la manière droite de le faire - comme expliqué dans Comment ajouter par programme un nouveau fichier crontab sans remplacer le précédent - est de dump la crontab existante dans un fichier temporaire, modifiez-la, puis relisez-la. Par exemple:

cmd='@reboot /path/to/file'
tmpfile=$(mktemp) && crontab -l > "$tmpfile"
cmd='@reboot /path/to/command'
grep -Fxq "$cmd" "$tmpfile" || echo "$cmd" >> "$tmpfile"
crontab "$tmpfile" && rm -- "$tmpfile"

Une option "quick'n'dirty" - si vous ne vous souciez pas de vérifier - serait

crontab -l | sed '$a@reboot /path/to/command' | crontab -

en supposant que GNU sed, ce qui permet apend du texte sur une ligne.


Remarque: contrairement à l'écriture dans /var/spool/cron/crontabs directement, cette approche n'a pas besoin de Sudo (car crontab est setuid).

1
steeldriver