Я поместил исполняемый скрипт в /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
Но это не вывело. Что я делаю не так?
Одна проблема состоит в том, что Вы пытаетесь запустить графическое приложение (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
Это, вероятно, будет тем же на Вашем, но проверит сначала. Теперь, Ваш сценарий будет работать каждый час и должен работать как ожидалось.
Как Вы, вероятно, видели в комментариях к Вашему вопросу, cronjobs в /etc/cron.hourly
(и другой, подобные каталоги) выполняются run-parts
. run-parts
немного требовательно в отношении имен файлов. По умолчанию это не выполняет файлы, имена файлов которых содержат что-либо кроме (все те, которые от ASCII)
Поэтому, если Ваш сценарий имеет имя файла, например, "myscript.sh", это просто проигнорировано, потому что run-parts
не любит точку.
Сценарий, заканчивающийся .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
окончание
Не используйте сценарий с расширением (abc.sh) и добавляйте Ваше место потребности. (cron.hours).
добавляют Ваш материал кода к файлу abc и сохраняют. (для Вашей потребности) (это должно быть командой удара)
использование
sudo chmod +x abc
команда для создания исполняемого файла.
edit etc/cronrtab file
там имеет предопределенные немного lines.edit с Ваших минут к строке часов, и сохраните ее.
затем это будет работать правильно.