Почему помещение скрипта в /etc/cron.hourly не работает?

Я положил исполняемый скрипт в /etc/cron.hourly, но этот скрипт не запускается каждый час, на самом деле он никогда не запускается вообще.

Вот сценарий (Часовой звук), который я сделал:

#! / Bin / Баш
mplayer ~/Music/sfx_msg-highlight.wv &> /dev/null &
spd-say -r -50 -p 50 -t male3  "Время сейчас составляет $(дата +"%l %p")"
notify-send "It's: " "$(date +"%l %p") сейчас." -i ~/ Картинки /"first tee.png" -t 5000

Мой crontab это:

DISPLAY=":0.0"
XAUTHORITY="/home/naruto/.Xauthority"
XDG_RUNTIME_DIR="/run/user/1000"

0 * * * * /home/naruto/Hour-sound.sh

В то время как mplayer а также spd-say Команды выполняются правильно, notify-send не является. Я также попытался перенаправить ошибку в файл:

0 * * * * /home/naruto/Hour-sound.sh 2>/tmp/error

Но это не показало результатов. Что я делаю неправильно?

5 ответов

Как вы, вероятно, видели в комментариях к вашему вопросу, cronjobs в /etc/cron.hourly (и другие, подобные каталоги) выполняются run-parts, run-parts немного требователен к именам файлов. По умолчанию он не выполняет файлы, имена файлов которых содержат что-либо кроме (все из ASCII)

  • заглавные буквы
  • строчные буквы
  • цифры
  • подчёркивания
  • тире ("минус")

Так что если у вашего скрипта есть имя файла, например "myscript.sh", он просто игнорируется, потому что run-parts не нравится точка.

Одна проблема в том, что вы пытаетесь запустить графическое приложение (notify-send) из хрон. Это требует небольшой настройки. Вам нужно установить XAUTHORITY а также DISPLAY переменные в crontab, чтобы он мог подключиться к запущенному сеансу X, и вам нужно установить XDG_RUNTIME_DIR так что он может подключиться к вашей сессии импульса. К сожалению, они должны быть установлены в самом crontab, поэтому вы не можете использовать /etc/cron.hourly, Вместо этого беги crontab -e и добавьте эти строки:

DISPLAY=":0.0"
XAUTHORITY="/home/YOURUSERNAME/.Xauthority"
XDG_RUNTIME_DIR="/run/user/1000"

0 * * * * /path/to/script.sh 

Изменить значение XDG_RUNTIME_DIR к тому, что возвращается, когда вы echo их из терминала. В моей системе это:

$ echo $XDG_RUNTIME_DIR
/run/user/1001

Вероятно, будет так же, как у вас, но сначала проверьте. Теперь ваш скрипт будет запускаться каждый час и должен работать как положено.

Скрипт, заканчивающийся на .sh не выполняется в /etc/cron.hourly папка:

https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=308911
Ссылки или двоичные файлы внутри каталога, обрабатываемого run-pars (например, /etc/cron.daily), не будут работать, если точка является частью их имени.

переименовать скрипт

mv /etc/cron.hourly/Hour-sound.sh /etc/cron.hourly/Hour-sound

или поместите скрипт-вызов в

/etc/crontab

что позволяет .sh окончание

Не используйте скрипт с расширением (abc.sh) и добавьте нужное место. (cron.hours).

добавьте ваш код в файл abc и сохраните. (для ваших нужд) (это должна быть команда bash)

использование

sudo chmod +x abc

Команда для создания исполняемого файла.

edit etc/cronrtab file

там есть предопределенные несколько строк.edit из строки минут в часы и сохраните их.

тогда он будет работать правильно.

Дополнение к принятому ответу.

Вы можете протестировать свои скрипты под /etc/cron.*во-первых, чтобы убедиться, что он будет выполнен.

Например, у вас есть этот скрипт: /etc/cron.hourly/sample-script. Выполните приведенную ниже команду, чтобы проверить, принимается ли она run-parts:

      run-parts --test /etc/cron.hourly

Вывод должен быть примерно таким:

      /etc/cron.hourly/sample-script
/etc/cron.hourly/some-other-script
...

Если ваш сценарий указан в выводе, значит, все в порядке.

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