Вопрос или проблема
У меня есть crontab, похожий на этот, на конфигурации LAMP:
0 0 * * * /some/path/to/a/file.php > $HOME/cron.log 2>&1
Это записывает вывод файла в cron.log. Однако, когда он запускается снова, он перезаписывает все, что ранее было в файле.
Как я могу заставить cron выводить в файл с временной меткой в имени файла?
Пример имени файла мог бы выглядеть так: 2010-02-26-000000-cron.log
Мне не важно, в каком формате, главное, чтобы была какая-то временная метка.
Попробуйте:
0 0 * * * /some/path/to/a/file.php > $HOME/`date +\%Y\%m\%d\%H\%M\%S`-cron.log 2>&1
Попробуйте поэкспериментировать с форматом даты, если хотите; просто убедитесь, что вы экранируете любой %
, как \%
, как указано выше.
Я бы сильно рекомендовал сохранять все в один и тот же файл, используя временную метку, как объясняется в блоге Абдуллы Диаба.
убрать
2>&1
… и пропустить это через скрипт временной метки перед сохранением в файл журнала.
Скрипт timestamp.sh
:
#!/bin/bash
while read x; do
echo -n `date +%d/%m/%Y\ %H:%M:%S`;
echo -n " ";
echo $x;
done
Не забудьте chmod +x timestamp.sh
, чтобы сделать его исполняемым.
Затем отредактируйте строку задания cron, используя crontab -e
, чтобы она выглядела так:
/path/to/my/command.sh 2>&1 | /path/to/timestap.sh >> /var/log/cron/my_log.log
Вы также можете добавлять ваш вывод в файл журнала, сделав это так:
0 0 * * * /some/path/to/a/file.php >> $HOME/cron.log 2>&1
Я модифицировал скрипт вот так:
`/bin/date +\%Y\%m\%d`.log
Я решил эту проблему; просто добавьте путь к дате (/bin/date) перед командой даты.
@daily /some/path/to/a/file.php 2>&1 > $HOME/$(date +\%Y\%m\%d\%H\%M\%S)-cron.log
Ответ или решение
Для решения задачи по отправке вывода cron-задачи в файл с временной меткой в его имени на системе LAMP, необходимо учитывать несколько аспектов. Давайте рассмотрим пошагово, как это можно реализовать, используя возможности командной оболочки и crontab.
Шаг 1: Понимание текущего задания
В вашем текущем crontab задании, вывод команды, выполняемой каждую ночь, записывается в файл cron.log
в домашней директории. Однако каждое новое выполнение этой задачи перезаписывает предыдущий вывод, что может привести к потере важной информации.
Шаг 2: Создание имени файла с временной меткой
Для создания имени файла с временной меткой, вы можете использовать команду date
. Важно правильно организовать команды с учетом экранирования символов, так как crontab обрабатывает символы %
по-своему.
Шаг 3: Примеры изменения crontab
Вот как можно отредактировать вашу текущую настройку cron, чтобы вывод выполняемой команды сохранялся в файл с временной меткой в имени:
Основной метод
0 0 * * * /some/path/to/a/file.php > $HOME/$(date +\%Y\%m\%d\%H\%M\%S)-cron.log 2>&1
Здесь мы используем $(...)
, чтобы выполнить команду date
и подставить результат в имя файла. Такие экранирования как \%
необходимы для корректного выполнения в контексте cron.
Метод с добавлением вывода
Если вы хотите добавлять вывод в один файл вместо создания нового файла при каждом запуске, используйте следующую команду:
0 0 * * * /some/path/to/a/file.php >> $HOME/$(date +\%Y\%m\%d\%H\%M\%S)-cron.log 2>&1
Однако, как упоминалось ранее, этот метод перезапишет файл каждый раз. Чтобы избежать этого, стоит использовать другой подход.
Шаг 4: Использование скрипта для добавления временной метки к выводу
Как упомянуто в вашем вопросе, вы также можете создать скрипт для добавления временной метки к каждой строчке вывода. Создайте файл timestamp.sh
с содержимым:
#!/bin/bash
while read x; do
echo -n "$(date +'%d/%m/%Y %H:%M:%S') "
echo "$x"
done
Не забудьте сделать его исполняемым с помощью команды:
chmod +x /path/to/timestamp.sh
Теперь измените вашу cron-задачу:
0 0 * * * /some/path/to/a/file.php 2>&1 | /path/to/timestamp.sh >> $HOME/my_log.log
Итог
Используя приведенные выше методы, вы можете эффективно управлять выводом ваших cron-задач, автоматизируя процесс логирования и сохраняя информацию о каждом запуске. Это обеспечит более организованный подход к обработке логов и упростит анализ работы ваших скриптов. Не забывайте проверять и тестировать ваши настройки cron, чтобы убедиться в их правильности и эффективности.