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


16

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

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

#! / Bin / Баш
mplayer ~ / Music / sfx_msg-highlight.wv &> / dev / null &
spd-say -r -50 -p 50 -t male3 "Время сейчас равно $ (date +"% 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

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


просто убедившись, вы сделали сценарий исполняемым? принадлежит рут? что происходит, когда вы запускаете скрипт из терминала или помещаете туда простой скрипт? Имеет ли /etc/crontabимеет run-partsлинию для запуска почасовой cronработы из каталога?
Heemayl

Исполняемый файл: да, запуск сценария проходит нормально, ничего плохого из каталога /etc/cron.hourly, не знаете, как это проверить? Это в автозагрузке приложений? @heemayl
Черный Блок

1
В /etc/crontabфайле есть строка 17 * * * * root cd / && run-parts --report /etc/cron.hourly?
Heemayl


1
Пожалуйста , не размещайте скриншоты текста . Особенно, когда этот текст отображается в прозрачном окне терминала и включает отвлекающие цвета.
Terdon

Ответы:


24

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

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

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


1- Вот мои файлы: mediafire.com/view/rg8r85xb7qw26zs/cron.hourly_017.png 2- Вы пробовали какой-нибудь скрипт в /etc/cron.hourly и работали с вами?
Черный блок

2
Я только что протестировал небольшой скрипт, который просто написал «Hello» в файл в / tmp, и он работал без проблем. На всякий случай, вы знаете, что сценарии в /etc/cron.hourlyне обязательно выполняются "в час"? Если у вашего cronjob in /etc/crontab17 минут, сценарии выполняются в 00:17, 01:17 и так далее. И снова на всякий случай, разрешения скрипта позволяют пользователю root выполнять их?
Хеннинг Кокербек

Да, но мой сценарий никогда не запускается. и о разрешении см. здесь: mediafire.com/view/psnb4bflawdlyly/…
Черный блок

Может быть, это на самом деле проблема с разрешением. Я знаю, что сценарии в более общем /etc/cron.d/смысле не должны иметь разрешения на запись или выполнение для «группы» или «других». «Хозяин» должен иметь разрешение на выполнение, «группа» и «другие» должны иметь только разрешение на чтение. Может быть, это относится и к этому /etc/cron.hourly, хотя я не проверял это.
Хеннинг Кокербек

Хорошо, тогда я изменил разрешение для моего файла mediafire.com/view/s2lq63u7z54ohbo/…, который делает группу, которая является корневой группой, доступной только для чтения, и другие, так что это будет создавать какие-то проблемы?
Черный блок

5

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

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


Это то, что вы имеете в виду mediafire.com/view/ucjpvu8b41n3hue/… . это не сработало для меня.
Черный блок

Я думаю, что если проблема была в уведомлении-отправке, то почему другие команды также не запускались (например, mplayer)?
Черный блок

@ BlackBlock есть несколько проблем. я) notify-sendнуждается XAUTHORITYи DISPLAYпеременные , которые будут установлены и II) mplayerнуждается в XDG_RUNTIME_DIRдолжен быть установлен. Ты попробовал мое предложение? Это должно исправить обе проблемы. У вас, вероятно, также были проблемы с именами из-за того, run-partsкак объяснено в другом ответе.
тердон

Тогда почему это не сработало для меня? Я сойду с ума! см. мое изображение в 1-м комментарии к вашему ответу
черный блок

@ Чёрный Блок нет! Вы редактируете /etc/crontab, не делайте этого. Вы хотите, чтобы он запускался от имени пользователя, а не от имени пользователя root, и этот файл в любом случае имеет другой формат. Просто сделайте то, что я сказал в своем ответе, запустите crontab -eи добавьте туда строки.
тердон

3

Скрипт, заканчивающийся на .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окончание


1

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

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

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

sudo chmod +x abc

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

edit etc/cronrtab file

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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.