Запуск приложения php-fpm в контейнере Docker на базе CentOS7.
Так как я использую Docker, я должен записать свой вывод журнала из всех процессов в вывод PID 1. Таким образом, механизм Docker может зацепить журналы для последующей обработки (поэтому они отображаются в docker logs
).
Я могу сделать это, записав ВСЕ журналы в /proc/1/fd/2
без проблем в любом приложении. Я могу сделать это с помощью nginx и просто сделать echo "test" > /proc/1/fd/2
, и он отлично подходит для docker logs
.
Однако с программным обеспечением php я хотел бы сделать то же самое, написать в /proc/1/fd/2
, однако, независимо от того, что я делаю, я не могу заставить поток файлов идти на это.
PHP-FPM порождает множество дочерних процессов. Из-за этого я должен явно написать в stdout для PID 1!
Итак, я делаю что-то вроде этого:
$handle = fopen("/proc/1/fd/2", "w");
fwrite($handle, $msg);
fclose($handle);
Я просто получаю Warning: fopen(/proc/1/fd/2): failed to open stream: No such file or directory
ПРИМЕЧАНИЕ: Я также пробовал это с https://www.php.net/manual/en/function.file-put-contents.php, и происходит тот же результат. По сути это оболочка для fopen, fwrite, fclose.
Я попытался бросить его по символической ссылке:
bash-4.2$ ls -l /tmp/stdout
lrwxrwxrwx. 1 nginx nginx 12 Apr 10 11:19 /tmp/stdout -> /proc/1/fd/2
и затем указав метод на него как fopen("/tmp/stdout", "w");
Я получаю точно такую же ошибку Warning: fopen(/tmp/stdout): failed to open stream: No such file or directory
Вот вывод, который мне нужно записать:
bash-4.2$ ls -l /proc/1/fd/2
l-wx------. 1 nginx nginx 64 Apr 10 11:21 /proc/1/fd/2 -> pipe:[3523867]
Я могу писать в него без проблем (напрямую или через символическую ссылку), используя любое другое приложение, которое я пробовал, включая nginx и bash.
Процесс PHP запускается как тот же пользователь, которому принадлежит выходной поток
bash-4.2$ ps -ef
UID PID PPID C STIME TTY TIME CMD
nginx 1 0 0 11:21 ? 00:00:00 php-fpm: master process (/etc/php-fpm.conf)
nginx 7 1 0 11:21 ? 00:00:00 php-fpm: pool www
nginx 8 1 0 11:21 ? 00:00:00 php-fpm: pool www
nginx 9 1 0 11:21 ? 00:00:00 php-fpm: pool www
nginx 10 1 0 11:21 ? 00:00:00 php-fpm: pool www
nginx 11 1 0 11:21 ? 00:00:00 php-fpm: pool www
nginx 12 1 0 11:21 ? 00:00:00 php-fpm: pool www
bash-4.2$ ls -l /proc/1/fd/2
l-wx------. 1 nginx nginx 64 Apr 10 11:21 /proc/1/fd/2 -> pipe:[3523867]
Я пытался добавить некоторые дикие разрешения, они не берут:
bash-4.2$ chmod 777 /proc/1/fd/2
bash-4.2$ ls -l /proc/1/fd/2
l-wx------. 1 nginx nginx 64 Apr 10 11:21 /proc/1/fd/2 -> pipe:[3523867]
Вот каталог /dev/
, я не могу использовать их, так как они указывают на proc/self
, а не /proc/1
:
lrwxrwxrwx. 1 root root 11 Apr 10 11:21 core -> /proc/kcore
lrwxrwxrwx. 1 root root 13 Apr 10 11:21 fd -> /proc/self/fd
crw-rw-rw-. 1 root root 1, 7 Apr 10 11:21 full
drwxrwxrwt. 2 root root 40 Apr 10 11:21 mqueue
crw-rw-rw-. 1 root root 1, 3 Apr 10 11:21 null
lrwxrwxrwx. 1 root root 8 Apr 10 11:21 ptmx -> pts/ptmx
drwxr-xr-x. 2 root root 0 Apr 10 11:21 pts
crw-rw-rw-. 1 root root 1, 8 Apr 10 11:21 random
drwxrwxrwt. 2 root root 40 Apr 10 11:21 shm
lrwxrwxrwx. 1 root root 15 Apr 10 11:21 stderr -> /proc/self/fd/2
lrwxrwxrwx. 1 root root 15 Apr 10 11:21 stdin -> /proc/self/fd/0
lrwxrwxrwx. 1 root root 15 Apr 10 11:21 stdout -> /proc/self/fd/1
Я попытался изменить символьную ссылку /dev/fd
, чтобы она указала на /proc/1/fd/2
, а затем попытаться записать в php://fd/2
, и это тоже не сработало, та же ошибка.