je veux exécuter ce code bash chaque minute en utilisant cron. Je l'ai sauvegardé sur /root/activate.sh
#!/bin/bash
for file in /home/user/torrents/*.torrent
do
if [ "$file" != "/home/user/torrents/*.torrent" ]; then
echo [`date`] "$file" added to queue. >> /var/log/torrentwatch.log
/usr/bin/transmission-remote localhost:9091 -a "$file"
mv "$file" "$file".added
sleep 1
fi
done
l'autorisation est définie -rwxrwxrwx 1 root root 278 May 27 01:27 activate.sh
puis à l'intérieur de mon crontab -e
j'ai placé ce
* * * * * root sh /root/activate.sh
le script ne s'exécute pas et j'obtiens cette erreur de journal
May 27 01:40:02 media CRON[3556]: (root) CMD (root sh /root/activate.sh)
May 27 01:40:02 media CRON[3555]: (CRON) info (No MTA installed, discarding output)
---after a minute---
May 27 01:41:01 media CRON[3582]: (root) CMD (root sh /root/activate.sh)
May 27 01:41:01 media CRON[3581]: (CRON) info (No MTA installed, discarding output)
Tout d'abord, pourquoi n'utilisez-vous pas simplement la fonction watch-dir de transmission?
L'entrée de la crontab est incorrecte, elle devrait être * * * * * /root/activate.sh
lorsque vous l'ajoutez avec crontab -e
. /etc/crontab
et /etc/cron.d/*
prend un champ de nom d'utilisateur supplémentaire, mais les variables de contrôle propres à l'utilisateur que vous définissez avec la commande crontab
ne possèdent pas de champ de nom d'utilisateur. les travaux sont exécutés sous le nom d'utilisateur ayant exécuté crontab
.
De plus, étant donné que ce script opère sur des fichiers du répertoire de l'utilisateur, j'aurais exécuté le travail en tant qu'utilisateur. Rien dans ce script ne nécessite des autorisations root, à part peut-être l'écriture dans ce fichier journal, mais vous pouvez simplement changer la propriété de ce fichier journal.
Quant au script, je le modifierais un peu:
#!/bin/bash
for file in ~user/torrents/*.torrent; do
[[ -f "$file" ]] || continue
transmission-remote -a "$file" && mv "$file" "$file.added" || continue
printf '[%s] %s added to queue\n' "$(date)" "$file"
sleep 1
done >> /var/log/torrentwatch.log
Enfin, évitez d’ajouter des extensions pour les scripts et n’utilisez surtout pas .sh
lorsque le script est un script bash, pas un script sh.
Lorsque vous utilisez crontab -e
, vous ne pouvez pas spécifier de nom d'utilisateur. Le format est:
m h dom mon dow command
Donc, vous devriez mettre ceci dans crontab -e
:
* * * * * /root/activate.sh
Vous n'êtes pas obligé d'utiliser sh
car le fichier a une autorisation d'exécution et une ligne Shebang (#!/Bin/bash).