Будучи произведенным от задания крона на терминале

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

$ 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)

Что я пропускаю?

16
задан 4 June 2014 в 21:35

3 ответа

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)"
6
ответ дан 4 June 2014 в 21:35

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 -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
2
ответ дан 4 June 2014 в 21:35

Грязным способом может быть перенаправление вывода вашей программы в файл 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

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

crontab:

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

, если дисплей не отображается, системный журнал регистрирует ошибку.

15
ответ дан 4 June 2014 в 21:35

Другие вопросы по тегам:

Похожие вопросы: