LINUX.ORG.RU

Crontab ... да, опять

 , , , ,


0

1

Создал в папке пользователя скрипт bash следующего содержания:

#!/bin/bash

firefox

Затем забил в планировщик пользователя такую строчку:

* * * * * /home/username/crontask.sh

То есть, по идее, каждую минуту должен запускаться браузер Firefox. Сам скрипт bash рабочий, запускал через терминал под пользователем - браузер открывается. Жду уже 10 минут появления Firefox. Тишина. ЧЯДНТ?

То есть, по идее, каждую минуту должен запускаться браузер Firefox.

Где он должен запускаться? crontab ничего не знает о графической сессии, переменная DISPLAY там по умолчанию пуста, её нужно назначать вручную в скрипте либо в самом crontab.

Сам скрипт bash рабочий, запускал через терминал под пользователем - браузер открывается.

У пользователя в интерактивной сессии совсем другие переменные. В crontab даже PATH может оказаться куцым.

mord0d ★★★ ()
Ответ на: комментарий от mord0d
username@username-net:~$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
username@username-net:~$ echo $DISPLAY
:0
username@username-net:~$

То есть, если в PATH добавить папку пользователя /home/username, и указывать дисплей :0 в скрипте bash, то сработает?

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

На самом деле в crontab толкать DISPLAY — не лучшая идея.

Единственная переменная, которую я там прописал — PATH, чтобы иметь возможность толкать только имя скрипта, а не полный путь, который у меня аж 28 символов до имени файла для пользовательских скриптов или 35 до кронтабовских.

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

echo $PATH

Почему ты тестируешь в интерактивной сессии пользователя? Ещё раз повторяю — cron не использует окружение, которое у тебя в интерактивной сессии, у него переменные назначены по-своему.

То есть, если в PATH добавить папку пользователя /home/username

Нет, тебе нужно прописать в crontab (перед обозначением правил, например в самом начале):

PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin

Но так как скрипт лежит не в PATH, его придётся прописывать полными путями (зато с путями firefox возиться не придётся).

и указывать дисплей :0 в скрипте bash

#!/bin/sh

export DISPLAY=:0

firefox

Это всё, что нужно.

Ну и bash для запуска совершенно не нужен.

Можно даже обойтись crontab-строчкой:

* * * * * DISPLAY=:0 firefox
mord0d ★★★ ()
Ответ на: комментарий от mord0d

Я заметил, даже разный синтаксис везде пишут: кто пишет, что нужно указывать в кроне пользователя, кто не указывает вообще. Здесь не указывают. Кто в лес, кто по дрова)). Я заметил, у многих проблемы с кроном. Много тем. Но у всех обычно скрипты «скопировать лог, добавить лог и т.п.», а у меня запуск браузера, но всё равно … в чём сложность?

Desmond_Hume ★★★★★ ()
Последнее исправление: Desmond_Hume (всего исправлений: 1)
Ответ на: комментарий от Desmond_Hume

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

В системном crontab указывать пользователя крайне желательно, но вроде как не обязательно (я не пробовал без). В пользовательском указывать юзера не нужно совсем (по очевидным причинам).

Я заметил, у многих проблемы с кроном. Много тем.

Щито поделать, синтаксис конца семидесятых. ☺

Но у всех обычно скрипты «скопировать лог, добавить лог и т.п.», а у меня запуск браузера, но всё равно … в чём сложность?

В том, что ты пытаешься делать то, под что cron не приспособлен.

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

Почему ты тестируешь в интерактивной сессии пользователя? Ещё раз повторяю — cron не использует окружение

А как узнать переменные окружения cron?

Desmond_Hume ★★★★★ ()
Последнее исправление: Desmond_Hume (всего исправлений: 1)
Ответ на: комментарий от mord0d

Щито поделать, синтаксис конца семидесятых. ☺

Да ладно синтаксис вроде понятный, даже очень. Все эти звёздочки, числа … просто я думал, крон - демон, который живёт вместе с текущим юзером в его среде и питается его средой, делает все задачи в его среде, используя его экран, в том числе. А тут получается демону нужно указать, какой экран использовать (даже это!).

Desmond_Hume ★★★★★ ()
Последнее исправление: Desmond_Hume (всего исправлений: 1)
Ответ на: комментарий от Desmond_Hume

кто пишет, что нужно указывать в кроне пользователя, кто не указывает вообще

Пользака нужно указывать в /etc/crontab т.к. это глобальный общесистемный запускальщик.

А то, что пишется в crontab -e т.е. в файле конкретного пользователя уже не требует указывать пользака, ведь ты и так в его файле команды пишешь.

Возможно, и даже скорее всего, можно указать запуск от другого пользака даже в crontab -e, но это будет какой-то изврат.

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

просто я думал, крон - демон, который живёт вместе с юзером в его среде и питается его средой, делает в его среде

И поэтому запускается системным демоном, кронтабы живут вне хомяка и никак не зависят от графической сессии. ☺

cron даже не предназначен для запуска от имени пользователя (можно, но это как забивать гвоздь отвёрткой).

А тут получается демон-шпион

Шпион, который слеп, глух и вообще инвалид? ☺

Почитай, как работают демоны cron (даже самая древняя статья середины восьмидесятых подойдёт — с тех пор ничего не поменялось).

даже это!

А это не его задача.

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

Возможно, и даже скорее всего, можно указать запуск от другого пользака даже в crontab -e, но это будет какой-то изврат.

Разве что в crontab рута (но и это я тоже не пробовал).

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

В том, что ты пытаешься делать то, под что cron не приспособлен

Чтобы два раза не вставать:

Вот у нас есть бинарь, который проверяется скриптом по крону ежеминутно (конечно интервал настраивается). Проверки комплексные, не только на наличие самого процесса, но и его поведение (память, отклик и другие специфичные проявления его жизни) на основании которого принимается решение, кильнуть его и перезапустить или пусть живёт дальше.

Как сделать еже-N-ную чекалку процесса без крона?

З.Ы. (бывает, что системды нет)

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

От обычного пользователя username. Не, эта часть понятна, под каким юзером выполняется crontab -e, под таким юзером и будут выполнены команды. Для меня указание экрана было открытием Америки просто.

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

Разве что в crontab рута

Да я тоже такой изврат не пробовал.

Но нет, например, пусть будет некий абстрактный апач, который должен слушать порт 80. Так, открытие сокета на 80 порту возможно только от рута. Т.е. порт выше 1024 (вроде бы) не сможет открыть пользак не будучи рутом.

Короче, только после открытия сокета происходит понижение привилегий процесса, запущеного от рута. Таким образом, процесс, требующий запускаться от рута, например, по указаным причинам, может быть запущен и не от рута, но, не сможет открыть порт и понизить првилегии самостоятельно — прав на это не хватит.

И, повторю, скорее всего, даже кронтабе пользака пожно указать другого пользака, но, это не сработает, или сработает, но не полноценно.

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

О! А тут я даже поспорю!

В бздях так его и трогают. Это во первых. Во вторых. Что лучше? Разбрызгивать дрисню по всем пользакам или сделать аккуратную обозримую кучку в одном месте? Ну а кронтаб -е пусть сам пользак лично пользует, вот только он — его его загончик. И только при условии что у него нет привилегий кроме этих.

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

А теперь создал скрипт bash в файле ~/crontask.sh:

#!/bin/sh

mkdir /home/username/FILE111

В crontab -e указал такую строчку (время заранее, за 2-3 минуты ставлю): 49 21 4 5 1 bash /home/username/crontask.sh

Папка FILE111 не создалась.

Команда bash /home/username/crontask.sh работает, проверял в терминале - папка создаётся.

Desmond_Hume ★★★★★ ()
Последнее исправление: Desmond_Hume (всего исправлений: 2)
Ответ на: комментарий от deep-purple

З.Ы. (бывает, что системды нет)

Не бывает, чтобы systemd есть:

 % uname -srm
FreeBSD 12.1-RELEASE-p3 amd64

есть бинарь

Проверки комплексные, не только на наличие самого процесса, но и его поведение (память, отклик и другие специфичные проявления его жизни) на основании которого принимается решение, кильнуть его и перезапустить или пусть живёт дальше.

Бинарь, или процесс?

Как сделать еже-N-ную чекалку процесса без крона?

Не вижу смысла заниматься подобной фигнёй. В FreeBSD прекрасно работает OOM Killer. А в Linux он до сих пор так и остаётся сказкой-страшилкой, которую не боятся даже самые пугливые процессы? ☺

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

Не трогай /etc/crontab!

Правильно, тыщщу лет уже есть /etc/cron.d/

Юзеру и там делать нечего. Эта дира для автоматизации, докинутой админом (в Linux туда могут докинуть что-нибудь пакеты).

У юзера свой загон, свой crontab и не нужно ему никуда вылезать, а то что-нибудь сломает.

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

Бинарь, или процесс?

А какая разница? Запускаемый бинарь «превращается» в процесс

Не вижу смысла, OOM Killer

Потому, что не видишь что проверки комплексные (оставляю то что ООМ не понимает):

отклик и другие специфичные проявления жизни

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

Это задача init/rc

Да? И как оно? Проверяет не только наличие процесса и не только занимаемую память, но и многое другое в «постоянном» режиме?

Вижу, у тебя сейчас вечер пятницы

Да. Но...

deep-purple ★★★★★ ()
Последнее исправление: deep-purple (всего исправлений: 1)
Ответ на: комментарий от deep-purple

В бздях так его и трогают. Это во первых.

Только админы. Юзеру туда лезть не нужно.

Разбрызгивать дрисню по всем пользакам или сделать аккуратную обозримую кучку в одном месте?

Очень зависит от поставленной задачи.

Если что-то нужно только пользователю (и это не общесистемная задача, когда юзером может быть operator), то оно должно жить у пользователя (и если админ замечает трэш в процессах пользователя, он может отредактировать или просто грохнуть crontab пользователя, а то и вовсе запретить ему пользоваться cron).

Если задача общесистемная, то надо писать periodic.

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

Если запрещено, то почему же Firefox запускался, лог писался? Вот именно когда в определённое время запускается, какие-то проблемы. Грешу на локальное время, но date выводит актуальное время.

/var/log/syslog выводит каждую минуту, когда поставил на кажду минуту, вот это:

May  4 22:22:01 username-net CRON[71576]: (username) CMD (bash /home/username/crontask.sh)
May  4 22:22:01 username-net CRON[71575]: (CRON) info (No MTA installed, discarding output)
Desmond_Hume ★★★★★ ()
Последнее исправление: Desmond_Hume (всего исправлений: 2)
Ответ на: комментарий от deep-purple

Бинарь, или процесс?

А какая разница?

А такая, либо мы работаем с одним файлом (бинарём), либо с кучей (stdin, stdout, stderr и прочие дескрипторы, терминал (если выделен), PID, PPID) данных.

Первая задача тривиальна.

(оставляю то что ООМ не понимает):

отклик и другие специфичные проявления жизни

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

Тебе хоть раз приходилось заниматься подобным? Не представляю, где может пригодиться подобное.

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

Это задача init/rc

Да? И как оно? Проверяет не только наличие процесса и не только занимаемую память, но и многое другое в «постоянном» режиме?

Никак.

Но если очень хочется, то можно. ☺

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

Всё! Ошибся в crontab -e. В имени пользователя сделал очепятку! Теперь каждую минуту работает ок. Сейчас попробую на определённое время.

И в определённое время заработало! Фух …

Desmond_Hume ★★★★★ ()
Последнее исправление: Desmond_Hume (всего исправлений: 1)
Ответ на: комментарий от Desmond_Hume

Вот именно когда в определённое время запускается, какие-то проблемы. Грешу на локальное время, но date выводит актуальное время.

А не может твой cron использовать время по UTC?

May 4 22:22:01 username-net CRON[71576]: (username) CMD (bash /home/username/crontask.sh)

chmod a+x $HOME/crontask.sh

May 4 22:22:01 username-net CRON[71575]: (CRON) info (No MTA installed, discarding output)

* * * * * $HOME/crontask.sh >>/tmp/crontask.log 2>&1
mord0d ★★★ ()
Ответ на: комментарий от mord0d

Не, всё, разобрался. Тупо ошибся в имени пользователя, буковку пропустил. Спасибо!

Всё-таки мощная штука эта /var/log/syslog, с watch поставил на отслежку, удобно. По ошибкам понял, что с именем пользователя ошибся. Реальное имя не username.

Desmond_Hume ★★★★★ ()
Последнее исправление: Desmond_Hume (всего исправлений: 1)
Ответ на: комментарий от mord0d

Тебе хоть раз приходилось заниматься подобным? Не представляю, где может пригодиться подобное

Ну я ж написал что у нас есть такой говнопроцесс. Понятно, что этот бинарь надо чинить раз он такой глючный. И его патчат. Кстати, благодаря этим патчам в последние пол года процесс довольно стабилен. Но в этой ситуации действительно помогает только периодическая комплексная чекалка состояния процесса.

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

Норкомания. gdb, strace — не? Обязательно ваять костыли на cron?

Ну и комплексные проверки занимают кучу (в контексте состояния процесса) времени, потому не особо-то аккуратно получается.

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

Норкомания

Да ты тепличный какой-то совсем. Апликуха сложна. Очень.

gdb

Понятно что корки сохраняются. Но речь вообще не о сегфолтах. Нет, о них тоже, но их уже год как вообще нет, в отличии от других проблем.

gdb, strace — не?

Под нагрузкой в бою? Иначе баги не поймать. Во всех тестах всё зелёное и при 20 гигабитах при более 100к коннектов.

Именно благодаря чекалке были найдены проблемные кейсы и затем внесены патчи. Оно же результат проверки нужных параметров в лог пишет.

комплексные проверки занимают кучу времени

Ну не знаю. У нас весь комплекс проверка процесса занимает 1-5 сек.

UPD.: Никакие забиксы и нагиосы не могут и не умеют собирать такой нужный стат.

deep-purple ★★★★★ ()
Последнее исправление: deep-purple (всего исправлений: 1)
Ответ на: комментарий от deep-purple

Да ты тепличный какой-то совсем.

Ну да, не избалован всеми этими смузихлёбскими комбайнами всё-в-одном ради всё-в-одном.

Апликуха сложна. Очень.

Как хорошо, что я не работаю программистом. ☺

Под нагрузкой в бою? Иначе баги не поймать.

Ну не в проде ж вы тестируете.

Именно благодаря чекалке были найдены проблемные кейсы и затем внесены патчи. Оно же результат проверки нужных параметров в лог пишет.

А я не говорю что это не работает, я говорю только что это способ надевания штанов через голову. ☺

Ну не знаю. У нас весь комплекс проверка процесса занимает 1-5 сек.

Когда состояние за эти секунды может поменяться до нескольких тысяч раз. К концу проверки уже полученные значения просто не актуальны.

UPD.: Никакие забиксы и нагиосы не могут и не умеют собирать такой нужный стат.

А я и не предлагал. ☺

mord0d ★★★ ()