выполнение оболочки каждую минуту с помощью cron

Я хочу запускать этот код bash каждую минуту, используя cron. Я сохранил его на /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

разрешение установлено -rwxrwxrwx 1 root root 278 May 27 01:27 activate.sh

, затем внутри моего crontab -e я поместил это

* * * * * root sh /root/activate.sh

[ 1110] скрипт не выполняется, и я получаю эту ошибку журнала

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
задан 26 May 2013 в 22:01

2 ответа

При использовании crontab -e вы не можете указать имя пользователя. Формат:

m h  dom mon dow   command

Таким образом, вы должны поместить это в crontab -e:

* * * * * /root/activate.sh

Вам не нужно использовать sh, потому что файл имеет разрешение на выполнение и линия Шебанга (#! / bin / bash).

0
ответ дан 26 May 2013 в 22:01

Прежде всего, почему вы просто не используете функцию watch-dir трансмиссии?

Запись в crontab неверна, она должна быть * * * * * /root/activate.sh, когда вы добавляете ее с помощью crontab -e. /etc/crontab и /etc/cron.d/* занимают дополнительное поле имени пользователя, но специфичные для пользователя crontabs, которые вы устанавливаете с помощью команды crontab, не имеют поля имени пользователя; задания выполняются от имени пользователя, запустившего crontab.

Кроме того, поскольку этот скрипт работает с файлами в домашнем каталоге пользователя, я бы запустил задание от имени этого пользователя. В этом сценарии нет ничего, что требовало бы root-прав, кроме записи в этот файл журнала, но вместо этого вы можете просто изменить владельца этого файла журнала.

Что касается скрипта, я бы немного его изменил:

#!/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

Наконец, вам следует избегать добавления расширений для скриптов и особенно не использовать .sh, когда скрипт является скриптом bash, не сценарий sh.

0
ответ дан 26 May 2013 в 22:01

Другие вопросы по тегам:

Похожие вопросы: