【问题标题】:Execute PHP script via supervisor in docker通过 docker 中的主管执行 PHP 脚本
【发布时间】:2019-02-01 03:13:52
【问题描述】:

我想定期在我的 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 中回显的任何内容输出到我的终端中。

你知道会出什么问题吗?

【问题讨论】:

  • PHP 5 支持将于本月或下个月结束,我相信。甚至不要考虑用它开始新的东西。也就是说,如果您在没有supervisord 的情况下自己执行代码会发生什么?脚本的输出是什么(使用>> /var/log/script.log 2>&1)?考虑到minimal reproducible example的要求,脚本的内容是什么样的?
  • 不用担心,反正它是用于原型设计的。
  • 还是个坏主意,但是,那是你的问题。顺便说一句:代码完全是由 PHP 执行的,还是可以用 BASH 或 POSIX (sh) shell 脚本替换?
  • (无论如何,感谢您的关注和提示。)我已经写了当我手动执行文件时会发生什么:脚本完成它的工作,它应该创建的文件已经创建。被调用的 php 文件以 #! /usr/local/bin/php 开头,它唯一做的就是调用一些 API,将结果保存在 json 中,并将结果保存在通过 /var/www/html/market/res/ 可用的文件夹中输出(手动调用后)只是显示保存文件后在 php 文件中回显的内容:“下载完成”

标签: php docker cron supervisord


【解决方案1】:

这不是 Docker 问题,而是您的设置问题。你的/usr/local/bin/php fetchStock.php >/dev/null 2>&1做了什么解释in detail in here,我复制过来:

>/dev/null 将标准输出 (stdout) 重定向到 /dev/null,后者将其丢弃。

...

2>&1 将标准错误 (2) 重定向到标准输出 (1),然后由于标准输出已被重定向,标准输出也将其丢弃。

你应该只保留/usr/local/bin/php fetchStock.php...

【讨论】:

    猜你喜欢
    • 2017-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-03
    相关资源
    最近更新 更多