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

10

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

Вот сценарий (Hour-sound), который я сделал:

#!/bin/bash
mplayer ~/Music/sfx_msg-highlight.wv &> /dev/null &
spd-say -r -50 -p 50 -t male3  "The time now is $(date +"%l %p")"
notify-send "It's: " "$(date +"%l %p") now." -i ~/Pictures/"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

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

    
задан Black Block 19.04.2015 в 17:15
источник

3 ответа

13

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

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

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

    
ответ дан Henning Kockerbeck 19.04.2015 в 22:05
3

Одна из проблем заключается в том, что вы пытаетесь запустить графическое приложение ( notify-send ) из cron. Это требует небольшой настройки. Вам нужно установить XAUTHORITY и DISPLAY переменных в crontab, чтобы он мог подключиться к вашему X сеансу работы, и вам нужно установить XDG_RUNTIME_DIR , чтобы он мог подключиться к сеансу pulseaudio. К сожалению, они должны быть установлены в самом 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

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

    
ответ дан terdon 21.04.2015 в 10:28
1

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

  

Ссылка
  Ссылки или двоичные файлы внутри каталога, обрабатываемые параметрами run-pars (например,   /etc/cron.daily) не будет работать, если период является частью их имени.

переименуйте скрипт

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

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

/etc/crontab

, который разрешает окончание .sh

    
ответ дан rubo77 29.09.2015 в 18:49