Як перенаправити вихід у файл зсередини cron?


105

У мене є резервний скрипт, який мені потрібно запускати в певний час доби, тому я використовую cronдля цього завдання, і зсередини cron я також намагаюся перенаправити вихід резервного скрипту на a logfile.

crontab -e

*/1 * * * * /home/ranveer/backup.sh &>> /home/ranveer/backup.log

У вищевказаному записі cron я перенаправляю обидва stderr and stdoutфайли журналу.

Вищезазначене завдання cron виконує штраф відповідно до цього, syslog і воно виконує завдання, зазначене у backup.shфайлі, але нічого не записує у файл журналу.

/var/log/syslog

Oct 19 20:26:01 ranveer CRON[15214]: (ranveer) CMD (/home/ranveer/backup.sh &>> /home/ranveer/backup.log)

Коли я запускаю скрипт із cli, він працює як потрібно, а вихід записується у файл журналу

ranveer@ranveer:~$ ./backup.sh &>> backup.log 
ranveer@ranveer:~$ cat backup.log
Fri Oct 19 20:28:01 IST 2012
successfully copied testdir
test.txt successfully copied
-------------------------------------------------------------------------------------
ranveer@ranveer:~$ 

Отже, чому вихідний файл не перенаправляється на файл зсередини cron.


Відповіді:


158

Я вирішив проблему. Є два способи:

М1

Змініть переадресацію з &>>на 2>&1. Так зараз crontab -eсхоже

*/1 * * * * /home/ranveer/vimbackup.sh >> /home/ranveer/vimbackup.log 2>&1

Я вважаю, що вищезазначене працює, тому що за замовчуванням cronвикористовується shдля запуску завдання замість bashцього &>>не підтримується sh.

М2

Змініть оболонку за замовчуванням, додавши SHELL=/bin/bashу crontab -eфайл.


14
cronце як sh: вона не вибирає жодної програми. Є багато реалізацій. Найпоширенішою реалізацією є віксі-крон. Я - інший (нинішній, не оригінальний) автор іншого. Я вважаю, що більшість демонів-хронів використовуватимуть систему sh, але це може відрізнятись, чи вона приймає &>>. Деякі демони cron (як, наприклад, моя) не дозволяють вам змінити, яка оболонка виконує лінії cron з SHELL=...лініями в crontab. Я радий, що ти знайшов рішення, яке працює для тебе; просто думав, що варто зазначити, що існує багато змінних, які можуть вплинути на те, чи працює він для інших.
сумнівним

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

1
@Danijel: Це повинно допомогти serverfault.com/questions/117360/…
RanRag

2
*/1 * * * * /home/ranveer/vimbackup.sh &>> /home/ranveer/vimbackup.logробить те ж саме.
Янік Жируар

5

відмова від відповідальності [1].

Я хотів би додати виноску або додаток до відповіді @ RanRag .

Переконайтеся, що ваш синтаксис перенаправлення оболонки відповідає /bin/sh. Якщо ви спробуєте використати синтаксис перенаправлення оболонки, який не відповідає дійсності, /bin/shваша команда не вдасться, і ваше завдання cron ніколи не буде виконуватися.

У своїх /etc/cron.d/example1конфігураційних файлах, якщо ви вказали іншого користувача, крім rootтого, що оболонка для входу цього користувача не є /bin/bash... ви все одно повинні використовувати /etc/cron.d/example1команду / bin / sh синтаксис у команді.


Наприклад

Якщо користувач має оболонку cshабо zshабо kshвстановити для його оболонки. У вашому /etc/cron.d/example1конфігураційному файлі команда повинна використовувати /bin/shсинтаксис. Зокрема, будь-яке перенаправлення оболонки повинно бути /bin/shсинтаксисом.

Якщо ви спробуєте використати, наприклад, cshсинтаксис переадресації оболонки у своєму /etc/cron.d/example1, робота вашого cron ніколи не запуститься. У файлі реєстрації, crondрозташованому на, /var/log/cronвказується, що команда виконується, але команда помилиться із синтаксичною помилкою до запуску вашої команди.

Де crondнадсилаються повідомлення про помилки синтаксичної помилки?

Про помилку ніколи не повідомляється в /var/log/cron. crondнатомість за замовчуванням видає будь-які повідомлення про помилки, використовуючи mail. Отже, ви повинні перевірити, /var/spool/mail/${USER}що таке помилка.

[1]

Відмова від відповідальності

  • Ця відповідь передбачає sysvсистему
  • systemd інформація може відрізнятися
  • Зокрема, ця інформація була засвоєна для centos-6distro і може не застосовуватися до різних sysvдистрибутивів
    • Я centos-6конкретно згадую , оскільки різні дистрибутиви можуть мати різну crondреалізацію, що відрізняється відcentos-6

2
якщо ви хочете, щоб ваша /etc/cron.d/example1команда використовувала іншу оболонку, ви можете використовувати встановити SHELL=в своєму /etc/cron.d/example1конфігураційному файлі.
Тревор Бойд Сміт
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.