Как перенаправить вывод в файл из cron?

105

У меня есть сценарий резервного копирования, который мне нужно запустить в определенное время дня, поэтому я использую cronдля этой задачи и из cron также пытаюсь перенаправить вывод сценария резервного копирования в 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.

RanRag
источник
superuser.com/questions/122246/…
Сиро Сантилли 事件 改造 中心 法轮功 六四 事件

Ответы:

158

Я решил проблему. Есть два способа:

M1

Измените перенаправление с &>>на 2>&1. Так что теперь crontab -eвыглядит

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

Я считаю , что вышеуказанные работы , так как по умолчанию cronиспользуется shдля выполнения задачи , а не bashтак , &>>не поддерживается sh.

M2

Измените оболочку по умолчанию, добавив SHELL=/bin/bashв crontab -eфайл.

RanRag
источник
14
cronэто как sh: он не выбирает ни одной программы. Есть много реализаций. Наиболее распространенной реализацией является Vixie cron. Я (текущий, а не оригинал) автор другого. Я считаю, что большинство демонов cron будут использовать систему sh, но это может варьироваться в зависимости от того, принимает ли она &>>. Некоторые демоны cron (например, мои) не позволяют вам изменять, какая оболочка выполняет строки cron со SHELL=...строками в crontab. Я рад, что вы нашли решение, которое работает для вас; Просто подумал, что стоит указать, что есть много переменных, которые могут повлиять на то, работает ли это для других.
dubiousjim
Как вставить 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... вы все равно должны использовать синтаксис / bin / sh в /etc/cron.d/example1команде.


Например

Если у вашего пользователя есть оболочка 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-6дистрибутива и может не относиться к разным sysvдистрибутивам.
    • Я упоминаю centos-6конкретно, потому что разные дистрибутивы могут иметь различную crondреализацию, которая отличается отcentos-6
Тревор Бойд Смит
источник
2
если вы хотите, чтобы ваша /etc/cron.d/example1команда использовала другую оболочку, вы можете использовать set SHELL=в вашем /etc/cron.d/example1конфигурационном файле.
Тревор Бойд Смит