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

Я поместил исполняемый скрипт в /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

Но это не вывело. Что я делаю не так?

14
задан 27 April 2015 в 17:05

4 ответа

Одна проблема состоит в том, что Вы пытаетесь запустить графическое приложение (notify-send) от крона. Это берет немного тонкой настройки. Необходимо установить 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

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

5
ответ дан 28 April 2015 в 03:05

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

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

Поэтому, если Ваш сценарий имеет имя файла, например, "myscript.sh", это просто проигнорировано, потому что run-parts не любит точку.

21
ответ дан 28 April 2015 в 03:05

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

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

переименуйте сценарий

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

или помещенный вызов сценария в

/etc/crontab

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

3
ответ дан 28 April 2015 в 03:05

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

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

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

sudo chmod +x abc

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

edit etc/cronrtab file

там имеет предопределенные немного lines.edit с Ваших минут к строке часов, и сохраните ее.

затем это будет работать правильно.

1
ответ дан 3 August 2019 в 08:27

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

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