Журналы STDOUT не работают при использовании символической ссылки для файла журнала в / proc / 1 / fd / 1 на Kubernetes - PullRequest
0 голосов
/ 21 января 2020

У меня есть 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) но не оба одновременно. Я чувствую, что дочерние процессы связаны, но не знаю почему.

...