J'ai un script Shell très simple dont j'ai besoin pour fonctionner en tant que travail cron, mais je ne parviens même pas à exécuter les scripts de test. Voici un exemple de script:
/home/myUser/scripts/test.sh
#!/bin/bash
touch file.txt
crontab:
* * * * * /home/myUser/scripts/test.sh
Le script fonctionne correctement à partir du terminal, mais ne peut pas s'exécuter sous forme de tâche cron. Jusqu'à présent, j'ai essayé ceux-ci dans crontab:
Shell=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
* * * * * /bin/bash /home/myUser/scripts/test.sh
Et ceci dans le fichier script:
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/home/myUser/scripts
D'après ce que j'ai recueilli, la solution pourrait être dans la variable PATH mais je ne peux pas comprendre ce que c'est car ma compréhension est très limitée à ce stade. Ma question est donc la suivante: comment puis-je faire en sorte que mes scripts s’exécutent en tant que cronjobs?
EDIT: le fichier dispose des autorisations rwx pour tous les utilisateurs. Ceci est juste à des fins de test.
EDIT: cronjobs tel que * * * * * touch /home/myUser/scripts/test.txt
fonctionne mais ne lance pas de scripts.
Dans quel répertoire se trouve file.txt? cron exécute des travaux dans votre répertoire personnel. Ainsi, à moins que votre script cd
s soit ailleurs, c'est là qu'il va chercher/créer le fichier.txt.
ÉDITER: lorsque vous faites référence à un fichier sans spécifier son chemin complet (par exemple, file.txt
, par opposition au chemin complet, /home/myUser/scripts/file.txt
) dans Shell, vous faites référence à un fichier de votre répertoire de travail actuel. Lorsque vous exécutez un script (de manière interactive ou via crontab), le répertoire de travail du script n'a aucun lien avec l'emplacement du script lui-même. au lieu de cela, il est hérité de celui qui a exécuté le script.
Ainsi, si vous cd
(changez le répertoire de travail) dans le répertoire dans lequel le script se trouve et que vous l'exécutez, file.txt
fera référence à un fichier situé dans le même répertoire que le script. Mais si vous n'y entrez pas cd
en premier, file.txt
fera référence à un fichier, quel que soit le répertoire dans lequel vous vous trouvez lorsque vous avez exécuté le script. Par exemple, si votre répertoire personnel est/home/myUser, et que vous ouvrez un nouveau shell et exécutez immédiatement le script (en tant que scripts/test.sh
ou /home/myUser/scripts/test.sh
; ./test.sh
ne fonctionnera pas), le fichier/home/myUser/fichier sera touché. txt car/home/myUser est votre répertoire de travail actuel (et donc celui du script).
Lorsque vous exécutez un script à partir de cron
, le processus est essentiellement identique: il est exécuté avec le répertoire de travail défini sur votre répertoire personnel. Ainsi, toutes les références de fichier dans le script sont prises par rapport à votre répertoire personnel, à moins que le script cd
s soit ailleurs ou spécifie un chemin absolu vers le fichier.
Le moyen le plus simple serait d'utiliser une interface graphique:
Pour Gnome, utilisez gnome-schedule (universe)
Sudo apt-get install gnome-schedule
Pour KDE, utilisez kde-config-cron
It should be pre installed on Kubuntu
Mais si vous utilisez un Linux sans tête ou ne voulez pas d’interface graphique, vous pouvez utiliser:
crontab -e
Si vous le tapez dans Terminal, vous obtiendrez une table.
Vous devez insérer vos tâches cron maintenant.
Formatez un travail comme celui-ci:
* * * * * YOURCOMMAND
- - - - -
| | | | |
| | | | +----- Day in Week (0 to 7) (Sunday is 0 and 7)
| | | +------- Month (1 to 12)
| | +--------- Day in Month (1 to 31)
| +----------- Hour (0 to 23)
+------------- Minute (0 to 59)
Il y a aussi quelques courts métrages (si vous ne voulez pas de *):
@reboot --> only once at startup
@daily ---> once a day
@midnight --> once a day at midnight
@hourly --> once a hour
@weekly --> once a week
@monthly --> once a month
@annually --> once a year
@yearly --> once a year
Si vous voulez utiliser le short comme cron (parce qu’il ne marche pas ou peu):
@daily --> 0 0 * * *
@midnight --> 0 0 * * *
@hourly --> 0 * * * *
@weekly --> 0 0 * * 0
@monthly --> 0 0 1 * *
@annually --> 0 0 1 1 *
@yearly --> 0 0 1 1 *
Essayer,
# cat test.sh
#!/bin/bash
/bin/touch file.txt
cron comme:
* * * * * /bin/sh /home/myUser/scripts/test.sh
Et vous pouvez le confirmer par:
# tailf /var/log/cron
Spécifiez le chemin complet et accordez les droits appropriés au fichier de script. J'ai essayé de suivre le fichier script pour exécuter cron:
#!/bin/bash
/bin/mkdir /scratch/ofsaaweb/CHEF_FICHOME/ficdb/bin/crondir
Et la commande crontab est
* * * * * /bin/bash /scratch/ofsaaweb/CHEF_FICHOME/ficdb/bin/test.sh
Cela a fonctionné pour moi.
Il devrait également fonctionner correctement à cron. S'il vous plaît vérifier ci-dessous les choses.
1- Vous éditez le bon fichier pour définir cron.
2- Vous avez donné la permission appropriée (permission d'exécution) au script pour que votre script soit exécutable