IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Shell et commandes GNU Discussion :

CRON avec changement de contexte/path (pour hebergeur web)


Sujet :

Shell et commandes GNU

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    347
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 347
    Par défaut CRON avec changement de contexte/path (pour hebergeur web)
    Bonjour,

    Je m'excuse si ma demande n'est pas à la bonne place ; je n'ai pas trouvé de section dédiée aux CRON dans l'interface de l'hébergeur web. Mon problème semble assez courant, mais je n'ai pas encore trouvé de solution.

    J'ai configuré un CRON sur mon hébergeur PHP mutualisé via l'interface CPanel. La commande que je suis censé utiliser pour appeler ma page `monscript.php` est la suivante (selon les exemples de scripts fournis par l'hébergeur) :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    /usr/bin/php80 -f /home/sites/11/82103d299/monsite/monscript.php
    La page est bien appelée ! Cool !
    Note: Mon site est situé à "/home/sites/11/82103d299/" et les répertoires avant cela sont complètement inaccessibles pour moi.

    Cependant, la mauvaise nouvelle est que j'ai une commande dans `monscript.php` qui ne se déroule pas comme prévu :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $lines = file('toto.txt', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);

    Lorsque j'appelle directement la page, tout fonctionne très bien en prod et sur mon environnement de développement, mais cela ne marche pas du tout lorsque le CRON l'appelle ! Je pense que c'est parce que lorsque je lance le script directement, il cherche le fichier au même niveau que lui (je pourrais le remplacer par `./toto.txt`, cela ne change rien).

    Cependant, lorsque le CRON l'appelle, cela ne fonctionne pas car la commande `file('toto.txt')` semble chercher au niveau du CRON lui-même, c'est-à-dire sur "/usr/bin/", et donc il ne le trouve pas.

    Afin de résoudre ce problème, je suis obligé d'écrire l'URL absolue :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $lines = file('/home/sites/11/82103d299/toto.txt', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);

    Cependant, ce code n'est clairement pas idéal, car il ne fonctionne plus sur mon environnement de développement et n'est pas du tout portable en cas de changement d'hébergeur ou même de répertoire.

    Je désespère de trouver une commande CRON qui me permette de me positionner au niveau du script, de sorte que les appels à des chemins relatifs fonctionnent.
    Si vous avez une solution, je suis preneur !

    Merci d'avance !

    Remarque : Actuellement, le problème est si critique qu'en solution de contournement, j'ai créé un CRON qui appelle une page nommée 'moncron.php' ayant pour seul but d'appeler `monscript.php` en utilisant cURL. Ainsi, avec cURL, les chemins relatifs fonctionnent, et mon fichier `./toto.txt` est correctement lu.

  2. #2
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 874
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 874
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par laclac Voir le message
    je n'ai pas trouvé de section dédiée aux CRON dans l'interface de l'hébergeur web.
    Un peu normal. Le cron est un outil et un hébergeur web en est un autre. Tu ne trouveras pas non plus de section dédiée à la commande "ls" ou à la commande "mount" qui sont aussi d'autres outils.

    Citation Envoyé par laclac Voir le message
    Lorsque j'appelle directement la page, tout fonctionne très bien en prod et sur mon environnement de développement, mais cela ne marche pas du tout lorsque le CRON l'appelle ! Je pense que c'est parce que lorsque je lance le script directement, il cherche le fichier au même niveau que lui
    Exactement. Et ce n'est même pas un souci lié à cron, c'est un souci de nommage des fichiers Lorsque tu appelles ton script manuellement tu te trouves à l'endroit où se trouve le fichier "toto.txt" et ça fonctionne mais place-toi dans "/tmp" et appelle ensuite ton script même manuellement, il ne fonctionnera plus.

    Citation Envoyé par laclac Voir le message
    (je pourrais le remplacer par `./toto.txt`, cela ne change rien).
    Exact puisque le dossier "." symbolise le dossier où tu te trouves. Donc que le fichier soit appelé depuis implicitement l'endroit où tu te trouves ou que tu lui dises explicitement de prendre le fichier depuis l'endroit où tu te trouves cela ne change effectivement rien.

    Citation Envoyé par laclac Voir le message
    Afin de résoudre ce problème, je suis obligé d'écrire l'URL absolue
    Ben oui. Mais en allant plus loin, afin de résoudre le problème tu es obligé de surtout réfléchir à ce que signifie un nommage relatif et à l'implication que cela a dans les projets.

    Citation Envoyé par laclac Voir le message
    Cependant, ce code n'est clairement pas idéal, car il ne fonctionne plus sur mon environnement de développement et n'est pas du tout portable en cas de changement d'hébergeur ou même de répertoire.
    C'est pour cela qu'il existe des fichiers dit "de configuration", fichiers destinés à donner les chemins de base du projet et sur lesquels les scripts iront taper.
    Il y a aussi les variables d'environnement $HOME et $LOGNAME qui référencent respectivement le dossier de base de l'utilisateur et le nom de l'utilisateur et qui sont connues du cron. Pour le reste, on ne travaille jamais en relatif dans un projet parce que justement le relatif c'est relatif à l'endroit où l'utilisateur se trouve lorsqu'il lance le projet. Et qu'un chemin relatif, par définition c'est un chemin qui n'est pas figé et donc qui ne peut pas servir de repère.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  3. #3
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 333
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 333
    Par défaut
    bonjour

    C'est toujours la même chose quel que soit le language pour ton problème.
    Il faut récupérer le chemin du script(absolu) puis lui ajouter ton fichier(relatif) et on obtient un chemin absolu !

    Donc ta question est ici, purement php ... voir (par exemple) la constante __DIR__ (python: __file__, bash: BASH_SOURCE / $0, ...)

    /usr/bin/php80 -f /home/sites/11/82103d299/monsite/monscript.php
    D'après ce que tu écris, ici ton script est accessible via http Mauvaise pratique ! A toi de le descendre d'un niveau.
    Par exemple /home/sites/11/ID_CLIENT/monscript.php ou mieux /home/sites/11/ID_CLIENT/MAINTENANCE/monscript.php

    note: oui, le top est d'utiliser une variable d'environnement type HOME, mais elle n'est pas forcément présente chez ton hébergeur au niveau des cron.

    ----------------------------

    C'est pour cela qu'il existe des fichiers dit "de configuration", fichiers destinés à donner les chemins de base du projet et sur lesquels les scripts iront taper.
    Pas d'accord justement puisque ici, on ne connait pas son répertoire, il est donc impossible de trouver le fichier de config... (sans variable d'environnement particulière dont tu parles).

  4. #4
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 874
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 874
    Billets dans le blog
    1
    Par défaut
    Ah oui désolé, le chemin du script je n'y ai pas pensé mais c'est effectivement un bon point de réflexion
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

Discussions similaires

  1. Réponses: 0
    Dernier message: 21/03/2012, 00h23
  2. Tomcat 6 et changement de context path
    Par kadje84 dans le forum Tomcat et TomEE
    Réponses: 0
    Dernier message: 28/02/2012, 11h23
  3. Comment configurer le context path pour un war ?
    Par piloupy dans le forum Tomcat et TomEE
    Réponses: 4
    Dernier message: 15/08/2010, 13h56
  4. pb avec le compteur Changements de contexte
    Par yanis97 dans le forum IIS
    Réponses: 0
    Dernier message: 09/05/2009, 17h57
  5. Réponses: 1
    Dernier message: 03/08/2007, 08h55

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo