У меня есть cronjob, который запускается каждую минуту и перенаправляет вывод в файл журнала /var/log/cronjob/cron.log
. Поскольку это работает в Kubernetes, я хочу перенаправить журнал в STDOUT.
Подход, который я выбрал, состоял в том, чтобы использовать символическую ссылку, используя RUN ln -sf /proc/1/fd/1 /var/log/cronjob/cron.log
:
# ls -la /var/log/cronjob/cron.log
lrwxrwxrwx 1 root root 12 Jan 21 19:23 /var/log/cronjob/cron.log -> /proc/1/fd/1
Когда я запускаю kubectl logs
, она не выводится.
Если я (внутри контейнера) удаляю символическую ссылку и создаю как обычный файл, мой вывод, как и ожидалось, появляется в файле /var/log/cronjob/cron.log
.
# tail -f /var/log/cronjob/cron.log
Running scheduled command: '/usr/bin/php7.3' 'artisan' sync:health_check > '/dev/null' 2>&1
Running scheduled command: ('/usr/bin/php7.3' 'artisan' compute:user_preferences > '/dev/null' 2>&1 ; '/usr/bin/php7.3' 'artisan' schedule:finish "framework/schedule-9019c9dc22ad7439efd038277fe8f370f56958e7") > '/dev/null' 2>&1 &
Как можно Я получаю свой журнал через запись по символической ссылке в STDOUT?
Я пробовал другие вещи, такие как:
- Использование
/dev/stdout
для символической ссылки - Хвост файла
/var/log/cronjob/cron.log
в точке входа
Редактировать: Больше информации о файлах / скриптах:
crontab:
SHELL=/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
* * * * * /usr/local/bin/schedule-run.sh
# An empty line is required at the end of this file for a valid cron file
/usr/local/bin/schedule-run.sh:
#!/bin/bash
# Source container environment variables
source /tmp/export
# Run Laravel scheduler
php /var/www/api/artisan schedule:run >> /var/log/cronjob/cron.log 2>&1
Edit # 2:
В настоящее время мой CMD
выглядит так, что порождает несколько дочерних процессов:
CMD export >> /tmp/export && crontab /etc/cron.d/realty-cron && cron && tail -f /var/log/cronjob/cron.log
root@workspace-dev-condos-ca-765dc6686-h8vdl:/var/www/api# ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 21:55 ? 00:00:00 /bin/sh -c export >> /tmp/export && crontab /etc/cron.d/realty-cron && cron && tail -f /var/log/cronjob/cron.log
root 8 1 0 21:55 ? 00:00:00 cron
root 9 1 0 21:55 ? 00:00:00 tail -f /var/log/cronjob/cron.log
root 170 1 0 21:59 ? 00:00:00 ssh-agent -s
root 233 0 0 22:00 pts/0 00:00:00 bash
root 249 1 0 22:00 ? 00:00:00 ssh-agent -s
root 1277 233 0 22:26 pts/0 00:00:00 ps -ef
Я не уверен, что это уместно, но с помощью проб и ошибок я заметил, что иногда echo "test1" >> /proc/1/fd/1
или echo "test2" >> /proc/1/fd/2
будут выводить на стандартный вывод (kubectl logs
) но не оба одновременно. Я чувствую, что дочерние процессы связаны, но не знаю почему.