LINUX.ORG.RU

Необычное поведение crontab и cron

 , ,


0

1

Имеется такой вот скрипт, для теста:

#!/usr/bin/bash

notify-send "Hi there!"

Давно не пользовался cron. Как-то не сложилась у меня с ним судьба — уже создавал когда-то тему с подобной проблемой, но так и не отложилась логика поведения, нет чёткого понимания до сих пор. Есть вещи, которые понятны как дважды-два, а есть … как кот Шрёдингера — то ли живым считать, то ли мёртвым, не поймёшь: ведь, по идее, он мёртв, потому что живой, когда умер, будучи ещё живым.

Если бы не старая тема, бился бы ещё долго головой об интернет, чтобы понять, в чём проблема. Хорошо, понятно, что нужно было добавить глобальную переменную $DISPLAY в cron-запись:

50 11 * * * DISPLAY=:0 /home/pushistiq/Desktop/my-cron.job

Без этой переменной, скрипт не отрабатывается, уведомление «Hi there!» не появляется. Это первая странность, которую я хотя бы как-то могу ещё объяснить тем, что, якобы, скрипт запускается от другого пользователя, с другим графическим окружением, несмотря на то, что и пользователя указывал:

50 11 * * * pushistiq /home/pushistiq/Desktop/my-cron.job)

— так тоже не работает, пока не добавишь DISPLAY. Пришла мысль: а может под текущим пользователем другой $DISPLAY? Но нет, если в терминале набрать команду «echo $DISPLAY» - показывает тот же :0

Это первая странность.

Вторая странность. Разный внешний вид уведомлений. Если запускать скрипт из терминала, то появляется уведомление вверху посередине такого вида. А если срабатывает cron (c указанием DISPLAY, естественно), то уведомление появляется такого вида с правого края экрана.

Почему это всё странно? Потому что куча страниц по настройке cron через crontab заявляют, что всё работает без DISPLAY. Я ни одного руководства не увидел с указанием DISPLAY. Может это только для уведомлений? Не знаю. Но всё это так неочевидно. Да ещё этот разный вид уведомлений … мистика.

★★★★★

Последнее исправление: Desmond_Hume (всего исправлений: 3)

Переменные окружения при запуске из cron и в интерактивной сессии пользователя не обязаны быть одними и теми же, отсюда и первый совет - при запуске скрипта из cron использовать полные пути до исполняемых файлов и самостоятельно устанавливать необходимые переменные окружения.

vvn_black ★★★★★
()
Ответ на: комментарий от cobold

Да, сильно отличается. DESKTOP там даже не указан). Спасибо за наводку. А ведь про env я у других читал, но что-то так сразу и не понял, к чему они клонят … тему закрываю. Суть стала ясна.

Desmond_Hume ★★★★★
() автор топика

Это первая странность

Это не странность.

которую я хотя бы как-то могу ещё объяснить тем, что, якобы, скрипт запускается от другого пользователя, с другим графическим окружением

Даже у того же пользователя окружение может быть разным. Залогинься в tty и посмотри что тебе покажет команда env. А теперь выполни её в crontab от своего пользователя (перенаправь в файл, например) и удивись, что там нет и десятой части того, что есть в терминале в графической сессии.

и пользователя указывал

Это работает только в системном crontab (/etc/crontab, даже в crontab -e от рута это работать уже не должно).

Пришла мысль: а может под текущим пользователем другой $DISPLAY? Но нет, если в терминале набрать команду «echo $DISPLAY» - показывает тот же :0

Ты вообще не понимаешь концепции переменных окружения?

Разный внешний вид уведомлений. Если запускать скрипт из терминала, то появляется уведомление вверху посередине такого вида. А если срабатывает cron (c указанием DISPLAY, естественно), то уведомление появляется такого вида с правого края экрана.

Потому что конфиги оно тоже не подхватывает. И это очевидно: конфиги лежат в XDG_CONFIG_HOME… которая тоже не назначена в кронджобе.

Почему это всё странно? Потому что куча страниц по настройке cron через crontab заявляют, что всё работает без DISPLAY.

Мне больше видится странным твоё желание использовать инструмент не по назначению. ☺

Но всё это так неочевидно.

Это всё было бы гораздо очевиднее, если бы ты изучил принципы работы UNIX-like. ^_~

mord0d ★★★★★
()
Ответ на: комментарий от mord0d

Мне больше видится странным твоё желание использовать инструмент не по назначению. ☺

Что значит «не по назначению»? «cron - daemon to execute scheduled commands (Vixie Cron)» А почему бы и не использовать его как таймер для каких-то рутинных команд, например? Если не по назначению, для чего же тогда создан cron как сервис??

Desmond_Hume ★★★★★
() автор топика
Ответ на: комментарий от Desmond_Hume

Настоящий линуксоид должен ощущать себя на десктопе как на сервере, а на сервере — как на десктопе.

Вот поэтому этот ваш Linux и катится в бездну такими темпами, что даже Windows завидует.

mord0d ★★★★★
()