web-dev-qa-db-fra.com

Obtenir que crontab change de répertoire de travail pour exécuter un script PHP

J'ai un script de planification PHP et j'ai besoin qu'Apache s'exécute selon une planification cron. Tester cette commande à partir de la ligne de commande fonctionne bien:

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

Lorsque je teste ce script à l'aide de la commande indiquée ci-dessous en tant qu'utilisateur Apache ou que je l'ajoute au cron Apache, l'erreur suivante apparaît: Impossible d'ouvrir le fichier d'entrée: ./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"

Notez que scheduler.php est un lien symbolique avec lecture/écriture/exécution sur le lien et le fichier source (chmod ug+rwx scheduler.php ./vendor/vendor/package/src/scheduler.php).

A l'origine, j'avais simplement essayé de lancer php /var/www/html/Shell/scheduler.php --action cron --mode default, mais le script PHP fait référence à des fichiers du même répertoire. C'est pourquoi j'ai besoin d'Apache/cron pour exécuter le fichier à partir de ce répertoire.

Éditer

Essayé d'utiliser un fichier de script, mais je vois toujours la même erreur.

Création d'un fichier cron.sh avec le contenu suivant:

#!/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

Testé avec:

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

Sortie:

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
4
TylersSN

Chacune des sous-expressions à && (test..., cd ... et /bin/php...) s'exécute dans différents sous-shell et ne peut pas passer de contexte (comme $PWD) entre elles.

Plutôt que de mettre votre commande dans votre crontab, enveloppez-la dans un simple script bash et appelez-le depuis crontab. Par exemple.:
Dans crontab:

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

et, dans /usr/local/bin/maint:

#!/bin/bash
cd /var/www/html/Shell
/bin/php ./scheduler.php --action cron --mode default"
6
waltinator