У меня есть сценарий резервного копирования, который мне нужно запустить в определенное время дня, поэтому я использую 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.
bash
io-redirection
cron
RanRag
источник
источник
Ответы:
Я решил проблему. Есть два способа:
M1
Измените перенаправление с
&>>
на2>&1
. Так что теперьcrontab -e
выглядитЯ считаю , что вышеуказанные работы , так как по умолчанию
cron
используетсяsh
для выполнения задачи , а неbash
так ,&>>
не поддерживаетсяsh
.M2
Измените оболочку по умолчанию, добавив
SHELL=/bin/bash
вcrontab -e
файл.источник
cron
это какsh
: он не выбирает ни одной программы. Есть много реализаций. Наиболее распространенной реализацией является Vixie cron. Я (текущий, а не оригинал) автор другого. Я считаю, что большинство демонов cron будут использовать системуsh
, но это может варьироваться в зависимости от того, принимает ли она&>>
. Некоторые демоны cron (например, мои) не позволяют вам изменять, какая оболочка выполняет строки cron соSHELL=...
строками в crontab. Я рад, что вы нашли решение, которое работает для вас; Просто подумал, что стоит указать, что есть много переменных, которые могут повлиять на то, работает ли это для других.YYYY-MM-DD_hh-mm-sec
в выходное имя файла, чтобы каждое имя файла отличалось и сохранялось без перезаписи?*/1 * * * * /home/ranveer/vimbackup.sh &>> /home/ranveer/vimbackup.log
тоже самое делаетотказ от ответственности [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
источник
/etc/cron.d/example1
команда использовала другую оболочку, вы можете использовать setSHELL=
в вашем/etc/cron.d/example1
конфигурационном файле.