Почему помещение скрипта в /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
...
Если ваш сценарий указан в выводе, значит, все в порядке.