Отримання виводу з роботи cron на терміналі


15

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

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

syslog повідомляє про наступне:

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

Що я пропускаю?


Робочі завдання cron не повинні писати в термінал - можливо, їх немає.
guntbert

Відповіді:


14

Брудним способом може бути перенаправлення виводу вашої програми на файл pts вже існуючого терміналу.

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

~$ tty
/dev/pts/4

тоді ваш кронтаб буде:

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

якщо дисплей відсутній, ви отримаєте помилку, зареєстровану системою syslog.


6

Cron надсилає вам електронний лист із результатами вашого сценарію. На жаль, Ubuntu не встановлює локальну пошту за замовчуванням , саме тому Cron повідомляє вам у журналах “No 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 посилає вихід на пошту. Якщо ви хочете бачити вихід у терміналі, тоді ви можете увійти до файлу та використовувати хвіст -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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.