0

I want to execute a PHP script in my docker container on a regularly basis, let's say every 5 minutes - with supervisord controlling.

My 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

My crontab file:

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

What happens, when I start my server:

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
...

The server is running & it looks like the cronjob is working as expected, but the output that I expect after the php script got executed (creation of a file) does not happen.

I for sure cross checked my command:

cd /var/www/html/market/autoFetch && /usr/local/bin/php fetchStock.php >/dev/null 2>&1

It will result in the creation of the file I expect the script to create (it takes some time because lots of data is fetched) and it will output whatever was echoed inside the PHP into my terminal.

Do you have an idea what could go wrong?

Timisorean
  • 1,388
  • 7
  • 20
  • 30
grenzbotin
  • 2,489
  • 1
  • 12
  • 14
  • 2
    PHP 5 support ends this or next month, I believe. Don't even think of starting new stuff with that. That said, what happens if you execute the code yourself without `supervisord`? What is the skript's output (use `>> /var/log/script.log 2>&1`)? Considering the requirement of a [mcve], what is the script's content like? – Ulrich Eckhardt Aug 26 '18 at 09:19
  • No worries, it is for prototyping anyway. – grenzbotin Aug 26 '18 at 09:21
  • Still a bad idea, but well, that's your problem. BTW: Is it relevant that the code is executed by PHP at all or could it be replaced with a BASH or POSIX (`sh`) shell script? – Ulrich Eckhardt Aug 26 '18 at 09:24
  • (Thanks for your concerns & the hint, anyway.) I already wrote what happens when I execute the file manually: The script does its work, the file it should create got created. The php file that got called starts with `#! /usr/local/bin/php` The only thing it does, is calling some APIs, saving the results in a json and save that result in a folder available via /var/www/html/market/res/ The scripts output (after calling manually) is just showing what was echoed in the php file once the file was saved: "Download completed" – grenzbotin Aug 26 '18 at 09:27

1 Answers1

0

It's not a Docker problem, it's your settings problem. What your /usr/local/bin/php fetchStock.php >/dev/null 2>&1 does is explained in detail in here, I will copy it over:

>/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.

You should keep only /usr/local/bin/php fetchStock.php...

Community
  • 1
  • 1
Kevin Kopf
  • 13,327
  • 14
  • 49
  • 66