![Добавление временной метки в файл журнала с помощью команды cronjob](https://rvso.com/image/36009/%D0%94%D0%BE%D0%B1%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5%20%D0%B2%D1%80%D0%B5%D0%BC%D0%B5%D0%BD%D0%BD%D0%BE%D0%B9%20%D0%BC%D0%B5%D1%82%D0%BA%D0%B8%20%D0%B2%20%D1%84%D0%B0%D0%B9%D0%BB%20%D0%B6%D1%83%D1%80%D0%BD%D0%B0%D0%BB%D0%B0%20%D1%81%20%D0%BF%D0%BE%D0%BC%D0%BE%D1%89%D1%8C%D1%8E%20%D0%BA%D0%BE%D0%BC%D0%B0%D0%BD%D0%B4%D1%8B%20cronjob%20.png)
Я пытаюсь запустить команду git pull с записью выходного сообщения в файл каждые 5 минут.
Но у меня возникла такая ошибка,
(root) CMD (cd /var/www/sites/ && git pull origin master | sed -e "s/^/$(date +\")
(CRON) error (grandchild #1111 failed with exit status 2)
Моя команда cronjob выглядит следующим образом.
*/5 * * * * cd /var/www/site/ && git pull origin master | sed -e "s/^/$(date +\"%d-%m-%y\ %T\"), /" >> /var/log/crond/site.log
Как это исправить?
решение1
Обратите внимание, что для некоторых систем a %
является специальным параметром в crontab: из crontab(5) в моей системе
Поле «sixth» (остальная часть строки) определяет команду, которую нужно запустить. Вся командная часть строки, до символа новой строки или «%», будет выполнена /bin/sh или оболочкой, указанной в переменной SHELL cronfile. Символ «%» в команде, если он не экранирован обратной косой чертой (\), будет заменен на символы новой строки, а все данные после первого % будут отправлены команде в качестве стандартного ввода.
ясильнорекомендуем использовать формат даты %Y-%m-%d
— он не толькостандарт, он сортирует одинаково лексически и хронологически. Некоторые реализации strftime имеют для этого сокращение:%F
Проверьте, есть ли в вашей системеts
команда
cd /dir && git pull origin master 2>&1 | ts "\%F \%T" >> /var/log/crond/site.log
Чтобы получить временные метки «в реальном времени», вам, возможно, придется отменить буферизацию команды: (это начинает становиться действительно некрасивым)
cd /dir && stdbuf -oL sh -c 'git pull origin master 2>&1' | ts "\%F \%T" >> /var/log/crond/site.log