LINUX.ORG.RU

Вопрос по cron

 ,


0

1

Всем доброго. Сразу оговорюсь, с cron’oм только познакомился. Задача такая, чтобы результат работы скрипта выводился в определенную консоль каждые 5 минут (иксов на компе нет). Но не могу добиться результата ни от одного скрипта, пробовал расписать команды в правиле, ничего,работает только echo. Иными словами, правило вида

*/5 * * * * echo bla bla bla > tty1

выводит bla bla bla на первый tty, но правило вида

*/5 * * * * /usr/bin/clear > tty1

и не думает очищать тот же первый tty (скрипт с clear и начинается как раз,но результат аналогичен для любых команд)

Что я делаю не так? Пожалуйста, объясните мне,криворукому

Ах,да. Дистрибутив arch. использую cronie (разницы нет в синтаксисе правил,я так понял?)



# Example of job definition:
#.---------------- minute (0 - 59)
#|  .------------- hour (0 - 23)
#|  |  .---------- day of month (1 - 31)
#|  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
#|  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
#|  |  |  |  |
#*  *  *  *  *   user-name	command to be executed
17  *  *  *  *   root		test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.hourly )
01 05  *  *  *   root		test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
47 05  *  * sun  root		test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
52 05 01  *  *   root		test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )
01 14  *  *  *   root		( cd / && /etc/cron.daily/system_update )

torvn77 ★★★★★
()

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

Для этого можно и нужно использовать локальную почту. Которую даже настраивать не надо (какой-нибудь dma справится).

/usr/bin/clear > tty1

Потому что clear нужны параметры терминала, которых он извне получить не может.

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

Тред-то прочитай. У него нет проблем с форматом, у него проблемы с пониманием взаимодействия.

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

по запросу dma linux гугл находит Direct Memory Access, я читаю,конечно,но не уверен,что это оно. Локальную почту в жизни не использовал, если можешь, ткни носом в какой-нибудь гайд)

Потому что clear нужны параметры терминала, которых он извне получить не может.

А моно ему их как-то передать без настройки почты?

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

у меня cronie, я написал в шапке

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

я по аналогичной таблице и делал, сомневаюсь, что проблема в этой части, echo же отрабатывает

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

по запросу dma linux гугл находит Direct Memory Access

Эм… Я имел в виду DragonFlyBSD Mail Agent.

Но можешь использовать msmtp или любой другой MTA; для локальной почты функциональный MTA не нужен.

Локальную почту в жизни не использовал, если можешь, ткни носом в какой-нибудь гайд)

https://bbs.archlinux.org/viewtopic.php?id=165758

А моно ему их как-то передать без настройки почты?

И с настройкой почты нельзя. Если уж так нужен вывод в tty, выводи из cron в лог, а лог непрерывно читай в tty. А то что ты делаешь — надевание штанов через голову.

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

хм, только что выяснилось, что cal он выводит (календарь). Задача вообще простецкая, мне после man’а cron’а уже пришло в голову, что я тут микроскопом гвозди забиваю) но что делать, если микроскоп нагуглить проще, чем молоток? https://imgur.com/a/TEGYdK3 для наглядности, такое вот инфо-окошко себе сделал, если календарь раз в сутки, без clear, я еще заставил работать, то weather из bash-snippets никак. ну и clear перед cal бы не помешал. я,в общем то,уверен,есть более простой способ заставить эти две команды выполнятся с заданным интервалом, но к сожалению, найти не могу

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

wall это которая на все терминалы сразу выводит? мне такого не надо, как раз задача прямо противоположная, вывести в /dev/ttyX или /dev/pts/X а не везде и всюду) write вроде тоже мне не поможет

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

Я к стати понял в чём твоя проблема: команда /usr/bin/clear > tty1 условно при фантазировании приведёт к появлению на терминале tty1 надписи terminal not found
то же что хочешь ты, если нафантазировать опцию -t будет выглядеть вот так:
/usr/bin/clear -t tty1
Понял в чём дело?

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

если календарь раз в сутки, без clear, я еще заставил работать, то weather из bash-snippets никак.

Вместо clear можно просто вывести нужное число ньюлайнов, большее или равное числу строк в консоли. n=25; while [ $n -gt 0 ]; do echo ""; let n-=1; done или просто echo -e "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n".

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

Прямо в нужном терминале запускаешь скрипт с содержимым:

#!/bin/bash

n = интервал_в_секундах

while true
  do
    # Здесь запускаются все необходимые команды.
    sleep $n
  done

нашел решение, прописал в конец скрипта после timeout выполнить этот скрипт опять. bash великий и могучий

Решение так себе. Лучше в цикле. А ты рекурсивно вызываешь из скрипта всё новые и новые оболочки до бесконечности, что в конце концов чревато переполнением стека.

Или перед вызовом себя поставь . ./script.sh или source ./script.sh, чтобы не создавать новый вложенный экземпляр bash.

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

да,потому и удали, timeout не то, долго не спал,невнимательно прочитал. спасибо за помощь, проблема окончательно решилась добавлением в конце скрипта строчек

sleep 300

bash /home/user/script

таким образом, скрипт выполняет сам себя еще раз через 300 секунд. оказалось, ответ был на поверхности)

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

боюсь не понял, что делает -t? попробовал, не сработало

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

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

Вот к стати обратите внимание, люди приходящие с винда такие и есть, им решительно наплевать что вы там понаписали в командной строке, в чём принципиальная разница между какими-то презренными символами -t и > ,

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

Так погугли, что такое опция программы и что делает в bash и в общем виде в консоли вообще символ > ( а так же >> << | )

Просто открой описание bash в википедии и прочитай.

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

А ты уверен что у топикстартера тоже vixie-cron? ☺


вопрос не читай, сразу высирай показывай, какой ты умный с такими то усищами же.

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

я знаю, что делает > направляет вывод. подумал, вдруг тут по другому сделано, говорю ж,cron’ом не пользовался,с синтаксисом не знаком,откуда мне знать,вдруг у разрабов нестандартное мышление, они опцию для вывода придумали? что ты сразу виндузятником обзываешься)

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

мне после man’а cron’а уже пришло в голову, что я тут микроскопом гвозди забиваю

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

а нет, cal тоже не нормально он выполняет, сегодняшний день не отображает

Потому что cron (а на самом деле приложение, которое ты им запускаешь) не знает, какие escape-последовательности поддерживает то, куда ты выводишь выхлоп (оно даже не в курсе, является ли цель терминалом, файлом или диском). Оно точно так же не будет работать если ты сделаешь clear > /dev/tty1 в самом tty1.

Это не будет нормально работать. Пиши нормальное приложение и запускай его в нужном tty. На ncurses не обязательно писать на Си, возьми какой-нибудь Python.

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

Так в чёмразница то между перенаправлением вывода и опцией?

И если что, то крон тут не причём, это общий вопрос.

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

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

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

ну это совершенно разные вещи, перенаправление это действие, а опция.ну это опция, она определяет действие. повторяюсь,откуда мне,не знакомому с cron человеку было знать, что разрабы не придумали опцию для вывода результатов в консоль? загуглил «автоматизация linux» везде cron советуют, полез читать,выглядело как что-то, чем можно решить мои задачи. оказалось,оно вообще про другое,но это уже отдельный разговор

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

вопрос не читай

Ты дурачка-то не включай. Многие реализации (в основном старые классические) cron не умеют в текстовые months/weekdays, только числовые; также у vixie-cron есть расширения в виде @reboot и подобных.

Но я так понимаю, вредные советы на ЛОРе — это норма. Сосите лапу, товаrищи!

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

а опция.ну это опция, она определяет действие

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

вот, я тебе даже хорошую статью нашёл https://rtfm.co.ua/bash-funkciya-getopts-ispolzuem-opcii-v-skriptax/

torvn77 ★★★★★
()
Последнее исправление: torvn77 (всего исправлений: 4)
Ответ на: комментарий от d09
sleep 300
bash /home/user/script

Нет, так ты рекурсивно вызываешь ещё одну оболочку bash, которой передаётся копия твоего окружения. А из неё - ещё одну. И т. д. Прежние же оболочки остаются в памяти до тех пор, пока всё это безобразие не завершится. А оно не завершится никогда. Поэтому если комп с таким скриптом долго не перезагружать, то скрипт в конце концов засрёт всю имеющуюся оперативную память, после чего вылетит. Но до того, как он вылетит, тебе долго будет не хватать памяти, и всё будет дико тормозить, если ты не догадаешься вырубить его сам. Особенно если имеется своп. Поэтому писать надо так:

# Твои команды

sleep 300
. /home/user/script

или

# Твои команды

sleep 300
source /home/user/script

Команды . и source - суть одно и то же, но . короче. Команду bash внутри скрипта перед или после source писать не надо, т. к. ты вызываешь скрипт в той же оболочке, а не создаёшь новую.

Либо через цикл:

while true
  do
    # Твои команды
    sleep 300
  done
aureliano15 ★★
()
Последнее исправление: aureliano15 (всего исправлений: 1)
Ответ на: комментарий от d09

Вижу что ты неразумно отверг мою мудрость, ну ладно, держи так:
agetty -nl /usr/bin/clear tty1
А теперь уходи, видеть тебя нехочу.

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

кажется,я понял. getopts, agetty и echo вообще не команды,а встроенные в баш функции, а та же clear - программа в /usr/bin, поэтому нормально и не работает т.к. cron выполнял их не в окружении пользователя. ты об этом говорил?

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

agetty это отдельная программа, запускает указанную программу в указанном ей терминале.

ты об этом говорил?

Нет, не о этом.

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

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

Ну тут я себе позволил вольность, потому что понятие переменной несколько шире чем понятие операнд_ и применять слово операнд как имеющий смысл переменная неправильно, но так я надеюсь тебе было понятнее.
В общем далее говорим не операнд, а как правильно переменная.

Так вот, опция -t tty1 означает что если этой опции внутри программы сопоставленна переменная И эта переменная строкового типа то ей будет присвоено значение tty1.

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

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

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

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

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

Вот, и тут мы подходим к тому, что из приведённого мной прототипа следует то, что изменять надо состояние самой программы, а не место, куда она будет писать свои вывод или сообщения.

Сделать это опцией нельзя, просто потому что автор такую опцию у clear не предусмотрел.
(тут я залезаю в терминал и на всякий случай это проверяю clear --help и man clear)

Далее так как опция отсутствует, то может тоже самое делается через переменную окружения?
/usr/bin/env
Тоже таких переменных не выводит.

Но ведь echo GGG >/dev/tty1 приводит к записи в консоль, то есть эта запись таки возможна. И ведь clear очищает не случайную консоль, а именно ту в которой она запущена.
То есть clear знает что очищать( через /dev/console я полагаю) С другой стороны bash или sh запускаются в определённых tty, как они это делают?
После изучения вопроса приходим к системам инициализации ОС и файлу /etc/inittab и в нём строки:

1:2345:respawn:/sbin/getty -a root_tty1 38400 tty1
2:2345:respawn:/sbin/getty -a root_tty2 38400 tty2
3:2345:respawn:/sbin/getty -a root_tty3 38400 tty3
4:2345:respawn:/sbin/getty -a root_tty4 38400 tty4
5:2345:respawn:/sbin/getty -a root_tty5 38400 tty5
6:2345:respawn:/sbin/getty -a root_tty6 38400 tty6

Далее надо изучить что это за getty, в манах к этой утилите есть упоминание и других утилит, ну вот почитав мануальник к agetty мне пришло в голову agetty -nl /usr/bin/clear tty1, тест показал что под рутом это работает. И не ленись, прочитай в мануальнике что делают опции -n и -l.
Ты прочтёшь для себя нечто удивительное.

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

Спасибо за разъяснения, это интересно и наверняка мне в будущем еще пригодится. Хотя на данный момент решение нашлось банальное, sleep в скрипте. К слову,

cat: /etc/inittab: Нет такого файла или каталога

Как говориться, спасибо Леннарту за это

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

в теории так можно запускать любую программу на любой из 65535, но на практике это запрещено политиками безопасности и надо переписывать конфиги, какие вообще говоря не знаю.

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

torvn77 ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.