Obtendo o crontab para alterar seu diretório de trabalho para executar um script PHP

4

Eu tenho um script PHP scheduler Eu preciso do Apache para executar em um cronograma cron. Testar este comando a partir da linha de comando funciona bem:

$    ! test -e /var/www/html/maintenance.flag && cd /var/www/html/shell && /bin/php ./scheduler.php --action cron --mode default

Quando eu testo este script usando o comando mostrado abaixo como meu usuário apache ou o adiciono ao cron apache, recebo este erro: Não foi possível abrir o arquivo de entrada: ./scheduler.php

$    sudo -H -u apache bash -c "! test -e /var/www/html/maintenance.flag && cd /var/www/html/shell &&  /bin/php ./scheduler.php --action cron --mode default"

Observe que scheduler.php é um link simbólico com leitura / gravação / execução no link e no arquivo de origem ( chmod ug+rwx scheduler.php ./vendor/vendor/package/src/scheduler.php ).

Eu originalmente tentei simplesmente executar php /var/www/html/shell/scheduler.php --action cron --mode default , no entanto, o script PHP referencia arquivos no mesmo diretório, e é por isso que eu preciso do apache / cron para executar o arquivo dentro desse diretório.

Editar

Tentei usar um arquivo de script, mas ainda estou vendo o mesmo erro.

Criado um cron.sh com o seguinte conteúdo:

#!/bin/bash
cd /var/www/html/shell

#For Testing - remember, this is a symlink file
ls -l 'scheduler.php'

#Run Scheduler
/bin/php ./scheduler.php --action cron --mode always
/bin/php ./scheduler.php --action cron --mode default

Testado com:

sudo -H -u apache bash -c "! test -e /var/www/html/maintenance.flag && /bin/bash /var/www/html/cron.sh"

Saída:

lrwxrwxrwx 1 apache webroot 53 Oct 26 10:36 scheduler.php -> ../vendor/aoepeople/aoe_scheduler/shell/scheduler.php
Could not open input file: scheduler.php
Could not open input file: scheduler.php
    
por TylersSN 08.12.2016 / 20:11

1 resposta

6

Cada uma das subexpressões para && ( test... , cd ... e /bin/php... ) é executada em subshells diferentes e não pode transmitir o contexto (como $PWD ) entre si.

Em vez de colocar seu comando em crontab , envolva-o em um script simples de bash e chame esse script de crontab . Por exemplo:
Em crontab :

! test -e /var/www/html/maintenance.flag && /usr/local/bin/maint

e, em /usr/local/bin/maint :

#!/bin/bash
cd /var/www/html/shell
/bin/php ./scheduler.php --action cron --mode default"
    
por waltinator 08.12.2016 / 20:23