Получение вывода из задания cron на терминале


15

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

$ crontab -l
0 07-17 * * * /home/dat/scripts/cron.out

Системный журнал сообщает следующее:

(dat) CMD (/home/dat/scripts/cron.exe)
Jun 18 12:02:01 picard CRON[10848]: (CRON) info (No MTA installed, discarding output)

Что мне не хватает?


Задания cron не должны записываться в терминал - их может не быть.
Гюнтберт

Ответы:


14

Грязным способом может быть перенаправление вывода вашей программы в файл pts уже существующего терминала.

Чтобы узнать файл pts, просто введите ttyкоманду

~$ tty
/dev/pts/4

тогда ваш crontab будет:

0 07-17 * * * /home/dat/scripts/cron.out > /dev/pts/4

Другим способом может быть запуск программы в качестве аргумента терминала:

xfce4-terminal --command=/home/dat/scripts/cron.out --display=:0.0 -H

где displayX-дисплей, на котором вы хотите показать терминал, -Hозначает, чтобы терминал оставался открытым после завершения команды. Это создаст каждый раз новый терминал.

кронтаб:

0 07-17 * * * /usr/bin/xfce4-terminal --display=:0.0 -H --command=/home/dat/scripts/cron.out

если дисплей отсутствует, вы увидите ошибку, зарегистрированную в syslog.


6

Cron отправляет вам по электронной почте вывод вашего скрипта. К сожалению, Ubuntu по умолчанию не устанавливает локальную почту , поэтому Cron сообщает вам в журналах « MTA не установлен, отбрасывая вывод».

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

Если вы хотите, чтобы ваша работа cron выводилась на терминал, вам придется перенаправить ее вывод на терминал. Часть перенаправления проста -

0 07-17 * * * /home/dat/scripts/cron.out >/dev/pts/42 2>&1

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

Для типичных применений уведомление GUI было бы более подходящим. Вы можете использовать notify-send. Вам нужно будет установить DISPLAYпеременную среды .

0 07-17 * * * DISPLAY=:0 notify-send "$(/home/dat/scripts/cron.out)"

2

Cron отправляет вывод по почте. Если вы хотите увидеть выходные данные в терминале, вы можете войти в файл и использовать tail -f для просмотра выходных данных в терминале, который вы хотите увидеть в выходных данных.


Вход в файл

  • Самый простой ответ - войти прямо в файл с записью в crontab, например:

0 07-17 * * * /home/dat/scripts/cron.out > /path/to/log.txt 2> /path/to/error.txt

Альтернативные способы входа:

  • Если ваша программа представляет собой сценарий, в который можно писать, вы можете изменить его, чтобы перенаправить вывод в файл журнала с помощью. echo output > log.txtИли вы можете использовать скрипт- обертку, описанный ниже.
  • Если ваша программа является бинарной или недоступной для записи другим способом, вы должны написать скрипт- обертку, чтобы записать вывод в файл.

Пример программы и сценария оболочки:

$ cat program.sh wrapper.sh 
#!/bin/bash
# sample program
echo "arg 1=$1 arg2=$2 arg3=$3"
echo "sample error" >&2 

#!/bin/bash
# sample wrapper
exec ./program.sh "$@" >log.txt 2> error.txt

Пример прогона 1:

$ ./wrapper.sh 1 2 3 ; cat error.txt  log.txt 
sample error
arg 1=1 arg2=2 arg3=3

Пример прогона 2:

$ ./wrapper.sh "A B C" D E ; cat error.txt log.txt 
sample error
arg 1=A B C arg2=D arg3=E

Просмотр вывода в терминале:

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

$ tail -f log.txt  error.txt
==> log.txt <==
arg 1=1 arg2=2 arg3=3

==> error.txt <==
sample error

Регистрация файлов, добавленных впоследствии:

Если позднее log.txt или error.txt добавляются из вашей программы или из другого терминала, например $ echo "more output" >> log.txt, вывод отображается на работающем терминале$ tail -f log.txt error.txt

==> log.txt <==
more output

Кроме того, в $ echo code red >> error.txtрезультате:

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