在 docker 中通过主管执行 PHP 脚本
Execute PHP script via supervisor in docker
我想定期在我的 docker 容器中执行一个 PHP 脚本,比方说每 5 分钟一次 - 使用 supervisord 控制。
我的 Dockerfile:
FROM php:5.6-apache
RUN apt-get update && apt-get install -y \
cron \
rsyslog \
supervisor
COPY supervisord/*.conf /etc/supervisor/conf.d/
COPY crontab /etc/cron.d/cron
RUN rm -Rf /etc/cron.daily && \
rm -Rf /etc/cron.weekly && \
rm -Rf /etc/cron.monthly && \
rm -Rf /etc/cron.hourly && \
chmod a+x /etc/cron.d/cron
EXPOSE 80
CMD exec supervisord -n
我的crontab文件:
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
*/5 * * * * root cd /var/www/html/market/autoFetch && /usr/local/bin/php fetchStock.php >/dev/null 2>&1
当我启动服务器时发生了什么:
php_1 | /usr/lib/python2.7/dist-packages/supervisor/options.py:298: UserWarning: Supervisord is running as root and it is searching for its configuration file in default locations (including its current working directory); you probably want to specify a "-c" argument specifying an absolute path to a configuration file for improved security.
php_1 | 'Supervisord is running as root and it is searching '
php_1 | 2018-08-26 08:45:52,515 CRIT Supervisor running as root (no user in config file)
php_1 | 2018-08-26 08:45:52,516 INFO Included extra file "/etc/supervisor/conf.d/supervisord.conf" during parsing
php_1 | 2018-08-26 08:45:52,522 INFO RPC interface 'supervisor' initialized
php_1 | 2018-08-26 08:45:52,523 CRIT Server 'unix_http_server' running without any HTTP authentication checking
php_1 | 2018-08-26 08:45:52,523 INFO supervisord started with pid 1
php_1 | 2018-08-26 08:45:53,526 INFO spawned: 'cron' with pid 8
php_1 | 2018-08-26 08:45:53,528 INFO spawned: 'rsyslogd' with pid 9
php_1 | 2018-08-26 08:45:53,531 INFO spawned: 'apache2' with pid 10
php_1 | 2018-08-26 08:45:54,607 INFO success: cron entered RUNNING state, process has stayed up for > than 1 seconds (startsecs)
php_1 | 2018-08-26 08:45:54,607 INFO success: rsyslogd entered RUNNING state, process has stayed up for > than 1 seconds (startsecs)
php_1 | 2018-08-26 08:45:54,607 INFO success: apache2 entered RUNNING state, process has stayed up for > than 1 seconds (startsecs)
php_1 | 2018-08-26 09:00:11,493 INFO reaped unknown pid 21
...
服务器是 运行 & 它看起来 cronjob 正在按预期工作,但是在执行 php 脚本(创建文件)后我期望的输出没有发生。
我肯定交叉检查了我的命令:
cd /var/www/html/market/autoFetch && /usr/local/bin/php fetchStock.php >/dev/null 2>&1
它将创建我希望脚本创建的文件(这需要一些时间,因为要获取大量数据)并且它将 PHP 中回显的任何内容输出到我的终端。
你知道哪里会出错吗?
这不是 Docker 的问题,而是您的设置问题。你的/usr/local/bin/php fetchStock.php >/dev/null 2>&1
是做什么的,解释in detail in here,我复制过来:
>/dev/null
redirects standard output (stdout
) to /dev/null
, which discards it.
...
2>&1
redirects standard error (2
) to standard output (1
), which then discards it as well since standard output has already been redirected.
你应该只保留 /usr/local/bin/php fetchStock.php
...
我想定期在我的 docker 容器中执行一个 PHP 脚本,比方说每 5 分钟一次 - 使用 supervisord 控制。
我的 Dockerfile:
FROM php:5.6-apache
RUN apt-get update && apt-get install -y \
cron \
rsyslog \
supervisor
COPY supervisord/*.conf /etc/supervisor/conf.d/
COPY crontab /etc/cron.d/cron
RUN rm -Rf /etc/cron.daily && \
rm -Rf /etc/cron.weekly && \
rm -Rf /etc/cron.monthly && \
rm -Rf /etc/cron.hourly && \
chmod a+x /etc/cron.d/cron
EXPOSE 80
CMD exec supervisord -n
我的crontab文件:
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
*/5 * * * * root cd /var/www/html/market/autoFetch && /usr/local/bin/php fetchStock.php >/dev/null 2>&1
当我启动服务器时发生了什么:
php_1 | /usr/lib/python2.7/dist-packages/supervisor/options.py:298: UserWarning: Supervisord is running as root and it is searching for its configuration file in default locations (including its current working directory); you probably want to specify a "-c" argument specifying an absolute path to a configuration file for improved security.
php_1 | 'Supervisord is running as root and it is searching '
php_1 | 2018-08-26 08:45:52,515 CRIT Supervisor running as root (no user in config file)
php_1 | 2018-08-26 08:45:52,516 INFO Included extra file "/etc/supervisor/conf.d/supervisord.conf" during parsing
php_1 | 2018-08-26 08:45:52,522 INFO RPC interface 'supervisor' initialized
php_1 | 2018-08-26 08:45:52,523 CRIT Server 'unix_http_server' running without any HTTP authentication checking
php_1 | 2018-08-26 08:45:52,523 INFO supervisord started with pid 1
php_1 | 2018-08-26 08:45:53,526 INFO spawned: 'cron' with pid 8
php_1 | 2018-08-26 08:45:53,528 INFO spawned: 'rsyslogd' with pid 9
php_1 | 2018-08-26 08:45:53,531 INFO spawned: 'apache2' with pid 10
php_1 | 2018-08-26 08:45:54,607 INFO success: cron entered RUNNING state, process has stayed up for > than 1 seconds (startsecs)
php_1 | 2018-08-26 08:45:54,607 INFO success: rsyslogd entered RUNNING state, process has stayed up for > than 1 seconds (startsecs)
php_1 | 2018-08-26 08:45:54,607 INFO success: apache2 entered RUNNING state, process has stayed up for > than 1 seconds (startsecs)
php_1 | 2018-08-26 09:00:11,493 INFO reaped unknown pid 21
...
服务器是 运行 & 它看起来 cronjob 正在按预期工作,但是在执行 php 脚本(创建文件)后我期望的输出没有发生。
我肯定交叉检查了我的命令:
cd /var/www/html/market/autoFetch && /usr/local/bin/php fetchStock.php >/dev/null 2>&1
它将创建我希望脚本创建的文件(这需要一些时间,因为要获取大量数据)并且它将 PHP 中回显的任何内容输出到我的终端。
你知道哪里会出错吗?
这不是 Docker 的问题,而是您的设置问题。你的/usr/local/bin/php fetchStock.php >/dev/null 2>&1
是做什么的,解释in detail in here,我复制过来:
>/dev/null
redirects standard output (stdout
) to/dev/null
, which discards it....
2>&1
redirects standard error (2
) to standard output (1
), which then discards it as well since standard output has already been redirected.
你应该只保留 /usr/local/bin/php fetchStock.php
...