web-dev-qa-db-fra.com

exécuter un shell chaque minute en utilisant cron

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)
2
user1666411

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.

4
geirha

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).

2
Eric Carvalho