Як увійти в Cron роботу?


218

Мені хочеться знати, як я можу точно бачити, що виконують роботи з Cron у кожному виконанні. Де розташовані файли журналів? Або я можу надіслати висновок на свій електронний лист? Я вказав адресу електронної пошти для надсилання журналу, коли робота cron запускається, але я ще нічого не отримав.


Відповіді:


347
* * * * * myjob.sh >> /var/log/myjob.log 2>&1

зафіксує весь вихід із завдання cron на /var/log/myjob.log

Ви можете використовувати mailдля надсилання електронних листів. Більшість систем надсилатиме необроблений cronвихідний робочий лист електронною поштою кореневі або відповідному користувачеві.


78
Опис того, що означає 2>&1: stackoverflow.com/questions/818255/in-the-bash-shell-what-is-21
Yamaneko

5
що може бути проблемою, якщо цей файл файлів ніколи не створюється?
затискач

10
FWIW, Якщо ви хочете і те, stderrі stdoutв журналі, 2>&1має з’явитися після непрямості:myjob.sh >> /var/log/myjob.log 2>&1
Dan Lecocq

2
Як вставити YYYY-MM-DD_hh-mm-secу назву вихідного файлу, щоб кожне ім'я файлу було різним і зберігалося без перезапису?
Данієль

6
@Danijel serverfault.com/a/117365/193377 0 0 * * * /some/path/to/a/file.php> $ HOME / date +\%Y\%m\%d\%H\%M\%S-cron.log 2> & 1
AnneTheAgile

61

За замовчуванням cron журналює в / var / log / syslog, щоб ви могли бачити записи, пов’язані з cron, використовуючи:

grep CRON /var/log/syslog

/ubuntu/56683/where-is-the-cron-crontab-log


2
У ubuntu 12.04 за замовчуванням без .log, тобто / var / log / syslog
tishma

5
використання journalctl | grep cronв системних системах
Microsoft Linux TM

2
/var/log/cronна AWS Linux AMI.
Джонатан

2
абоsudo journalctl -u cron
Джанфранко П.

2
Де саме cronреєструється, дуже залежить від системи. Окрема відповідь із деталями про те, як налаштовані різні пункти призначення журналів у системах Linux (або правильніше, системах, які використовують syslog). В інших системах може бути інший спосіб налаштування цих речей.
трійка

10

Ось мій код:

* * * * * your_script_fullpath >> your_log_path 2>&1

">>" означає додавання даних до файлових прав? що означає "2> & 1", повний вихід з помилкою, правда?
Nullpointer

3
Основні питання щодо переадресації найкраще перевірити в посібнику. Тут також є метричний potrzebie подвійних запитань про ці оператори тут, на Stack Overflow. Але так, приблизно; >>додає і 2>&1каже, щоб надіслати стандартну помилку на те саме місце, що і стандартний вихід.
трійка

10

Існує щонайменше три різних типи лісозаготівлі:

  1. Журнал перед тим, як виконується програма, яка лише реєструє, якщо Cronjob TRIED виконує команду. Цей знаходиться в / var / log / syslog, як уже згадував @Matthew Lock.

  2. Журнал помилок ПІСЛЯ програми намагався виконати, які можна надіслати на електронну пошту чи файл, як згадує @Spliffster. Я вважаю за краще входити у файл, тому що з електронною поштою у вас виникає НОВЕ джерело проблем, а також перевіряється, чи надсилання та отримання електронної пошти працює ідеально. Іноді так, іноді - ні. Наприклад, у звичайній звичайній настільній машині, на якій ви не зацікавлені в налаштуванні smtp, іноді ви віддасте перевагу входу в файл:

     * * * *  COMMAND_ABSOLUTE_PATH > /ABSOLUTE_PATH_TO_LOG 2>&1
    
    • Я також розглядаю можливість перевірки дозволів / ABSOLUTE_PATH_TO_LOG та запускає команду з дозволів цього користувача. Просто для перевірки, проте ви перевіряєте, чи це може бути потенційним джерелом проблем.
  3. Ведення журналу самої програми з власним обробкою помилок та веденням журналів для цілей відстеження.

Існують деякі поширені джерела проблем із кронічними роботами: * АБСОЛЮТНА ПАРТІЯ двійкового файлу, який слід виконати. Якщо ви запускаєте його зі своєї оболонки, це може спрацювати, але, схоже, процес крона використовує інше середовище, а значить, не завжди знаходить бінарні файли, якщо ви не використовуєте абсолютний шлях. * БІБЛІОТЕКИ, якими користується двійковий файл. Це більш-менш той самий попередній пункт, але переконайтеся, що, якщо просто поставити команду NAME команди, має на увазі саме двійковий файл, який використовує ту саму бібліотеку, а ще краще, перевірте, чи бінарний файл ви посилаєтесь на абсолютний шлях це саме те, про що ви посилаєтесь, використовуючи консоль безпосередньо. Бінарні файли можна знайти за допомогою команди locate, наприклад:

$locate python

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

  • Ще одне розповсюджене джерело проблем - синтаксис у кроні. Пам'ятайте, що є спеціальні символи, які ви можете використовувати для списків (коми), для визначення діапазонів (тире -), для визначення збільшення діапазонів (косої риски) тощо. Погляньте: http://www.softpanorama.org/Utilities/ cron.shtml

8

На Ubuntu ви можете включити cron.logфайл, який містить лише записи CRON.

Відменшіть рядок, який згадується cronу /etc/rsyslog.d/50-default.confфайлі:

#  Default rules for rsyslog.
#

#                       For more information see rsyslog.conf(5) and /etc/rsyslog.conf

#
# First some standard log files.  Log by facility.
#
auth,authpriv.*                 /var/log/auth.log
*.*;auth,authpriv.none          -/var/log/syslog
#cron.*                          /var/log/cron.log

Збережіть і закрийте файл, а потім перезапустіть rsyslogпослугу:

sudo systemctl restart rsyslog

Тепер ви можете бачити записи журналу cron у власному файлі:

sudo tail -f /var/log/cron.log

Приклади виходів:

Jul 18 07:05:01 machine-host-name CRON[13638]: (root) CMD (command -v debian-sa1 > /dev/null && debian-sa1 1 1)

Тим НЕ менше, ви не побачите більше інформації про те, які сценарії були на самому справі виконуються всередині /etc/cron.dailyабо /etc/cron.hourly, якщо ці сценарії прямий вихід до cron.log (або , можливо , в якій - то інший файл журналу).

Якщо ви хочете перевірити, чи працює crontab, і не потрібно шукати його в cron.logабо syslog, створіть crontab, який перенаправляє вихід у файл журналу на ваш вибір - щось на зразок:

# For more information see the manual pages of crontab(5) and cron(8)
#
# m h  dom mon dow   command
30 2 * * 1 /usr/local/sbin/certbot-auto renew >> /var/log/le-renew.log 2>&1

Кроки, зроблені з: https://www.cyberciti.biz/faq/howto-create-cron-log-file-to-log-crontab-logs-in-ubuntu-linux/


Ubuntu 16.04 не показав журналу хронів, і ця інформація зробила свою справу.
pojda

5

cron вже надсилає власникові завдання cron стандартний вихід і стандартну помилку кожної роботи, яку він виконує поштою.

Ви можете використовувати MAILTO=recipientу crontabфайлі електронні листи, які надсилаються до іншого облікового запису.

Щоб це працювало, потрібно, щоб пошта працювала належним чином. Доставлення до місцевої поштової скриньки, як правило, не є проблемою (насправді, шанси ls -l "$MAIL"виявлять, що ви вже отримували деякі), але для отримання її з коробки та виходу в Інтернет потрібно MTA (Postfix, Sendmail, що у вас є) бути належним чином настроєним для підключення до світу.

Якщо виходу немає, електронна пошта не буде генерована.

Звичайна домовленість полягає у перенаправці виводу у файл, і в такому випадку демон cron не побачить, щоб робота повертала жоден вихід. Варіант - перенаправити стандартний висновок у файл (або записати сценарій, щоб він ніколи нічого не друкував - можливо, він замість цього зберігає базу даних або виконує завдання технічного обслуговування, які просто нічого не виводять?) І отримувати електронний лист лише за наявності - повідомлення про помилку.

Для перенаправлення обох вихідних потоків синтаксис є

42 17 * * * script >>stdout.log 2>>stderr.log

Зверніть увагу, як ми додаємо (подвійно >>) замість перезапису, щоб результат будь-якого попереднього завдання не був замінений на наступний.

Як запропоновано в багатьох відповідях тут, ви можете надсилати обидва вихідні потоки до одного файлу; замініть друге перенаправлення 2>&1на те, щоб сказати "стандартна помилка повинна йти туди, куди йде стандартний вихід". (Але я не особливо схвалюю цю практику. Це в основному має сенс, якщо ви насправді нічого не очікуєте на стандартному виході, але, можливо, щось не помітили, можливо, виходить із зовнішнього інструменту, який викликається з вашого сценарію.)

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

Поширений антипатерн - це перенаправити все на /dev/null(а потім попросити Stack Overflow допомогти вам зрозуміти, що пішло не так, коли щось не працює; але ми також не можемо побачити втрачений вихід!)

Зсередини сценарію слідкуйте за тим, щоб регулярно виводити результати (фактичні результати, в ідеалі в машиночитаному вигляді) та діагностику (як правило, відформатовану для людського читача) окремо. У сценарії оболонки,

echo "$results"  # regular results go to stdout
echo "$0: something went wrong" >&2

Деякі платформи (і, наприклад, GNU Awk) дозволяють використовувати ім'я файлу /dev/stderrдля повідомлень про помилки, але це не належно переноситься; у Perl warnта dieдрукуйте до стандартної помилки; в Python, записувати sys.stderrабо використовувати logging; в Рубі, спробуйте $stderr.puts. Зверніть увагу також на те, як повідомлення про помилки повинні містити ім'я сценарію, який видав діагностичне повідомлення.


1

Якщо ви виконуєте якусь команду з sudo, це не дозволить. Судо потребує десятки.


4
Це також залежить від sudoконфігурації. Речі, які потрібно запускати без способу введення пароля, повинні бути налаштовані NOPASSWD:у вашій sudoersконфігурації.
tripleee

0

Якщо ви все ще хочете перевірити свої завдання cron, вам слід надати дійсний обліковий запис електронної пошти, встановлюючи завдання Cron у cPanel.

Коли ви вкажете дійсну електронну пошту, ви отримаєте висновок виконуваного завдання cron. Таким чином ви зможете перевірити це і переконатися, що все було виконано правильно. Зауважте, що ви не отримаєте електронний лист, якщо не буде результату команди cron task.

Будь ласка, майте на увазі, що ви отримаєте електронний лист для кожного із виконаних завдань cron. Це може затопити папку "Вхідні", якщо ваші крони надто часто працюють

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.