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