Page 1 sur 2

Tache planifiée, éxécutée 1 seule fois

Posté : 15 févr. 2006, 10:23
par Albert
Je voudrais pouvoir à partir d'un script prorammer une action qui se déclenchera à un instant bien précis et 1 seule fois.

Avec le crontab l'action serait répétée.

Est ce possible ?? si oui, Comment ?

Merci

Posté : 15 févr. 2006, 10:58
par Ryle
Ce n'est probablement pas la réponse que tu attends, mais à défaut.. si tu mettais simplement un flag que tu testes au début de ton script (champ en base, présence d'un fichier verrou, etc.) et que tu renseignes à la fin de celui ci lors de sa première exécution ?
Même s'il est appellé une fois par mois par la crontab, tant que le flag sera présent il ne s'exécutera plus... et tu peux éventuellement authoriser son execution en supprimant le flag

Bon c'était juste une idée en passant :)

Posté : 15 févr. 2006, 11:06
par Albert
Ok, les idées sont toujours bien venu.

Mais ca ne me plait pas trop car une requête serait éxécutée regulierement sur le script.

C'est pour ca que je precise bien que mon action serait éxécutée 1 seule fois.

Posté : 15 févr. 2006, 11:25
par Ryle
Vi tout à fait, ce n'est rien d'autre qu'une rustine en attendant que quelqu'un te propose mieux ;)

Sinon, je te parlais de fichier verrou pour éviter la requête sur le script : il suffit d'interroger un simple shell du genre

Code : Tout sélectionner

if [ ! -f /.../verrou ] ; then // appel de ton script fi

Posté : 15 févr. 2006, 12:03
par Albert
OK,

Et avec la commande "at", je ne peux pas faire quelque chose.

quelle syntaxe avec cette commande ??

Posté : 16 févr. 2006, 22:13
par Albert
Up :?

Posté : 18 févr. 2006, 11:26
par Ripat
Si tu veux utiliser at pour exécuter un script php il te faut:
  1. Créer ton script :wink: (exple test.php)
  2. Créer un fichier qui contiendra la commande qui fera un GET sur ce script. Tu peux utiliser wget ou curl, à ta bonne convenance. Exemple fichier monAtJob:

    Code : Tout sélectionner

    wget -q -O /dev/null 'http://localhost/test.php' # ou, plus court: curl localhost/test.php # ou, plus simplement php -f test.php
  3. Programmer ton at en ligne de commande. Il ira lire les commandes contenues dans monAtJob

    Code : Tout sélectionner

    at -f monAtJob 10:13 25.03.2006
    La commande at est très flexible sur le format de l'heure et date. Elle acceptera des formats aussi différents que
    • at 6pm 25 december 2006
    • at 6pm december 25 2006
    • at 18:00 25.12.2006
    • at 18:00 12/25/2006

Posté : 18 févr. 2006, 18:58
par Invité
Ok, Ripat merci de ta réponse, c'est super sympa.

Mais pour répondre exactement à ma question,

Est il possible d'utiliser la commande ci dessous directement dans un script PHP ??

Code : Tout sélectionner

at -f monAtJob 10:13 25.03.2006
Car je voudrait justement, qu'à l'éxécution d'un script php, ce dernier prepare une tache planifiée.

Merci.

Posté : 18 févr. 2006, 19:17
par Ripat
Simplement:
exec('at -f monAtJob 10:13 25.03.2006');
Il faut, pour cela, que les fonctions exec() ou assimilées soient disponibles sur ton site. Ce n'est souvent pas le cas en mutualisé.

Posté : 18 févr. 2006, 19:24
par Albert
Vraiment rapide ce Ripat :wink:

J'essaie tout ça

Je suis sur un dédie, et j'utilise deja la fonction exec() sur d'autre script.

Mais je ne connaissais pas du tout la commande "at".

Encore une fois merci pour tout.

Albert

Posté : 20 févr. 2006, 18:17
par Paulo
Moi aussi justement j'essaie d'utiliser la fontion at mais sans succes.

exec("at -f /var/www/vhosts/domaine.tld/httpdocs/monAtJob 17:05 20.02.2006");

Le job passe bien dans la file d'attente mais aucun resultat.

Pour la config j'ai 1 seul fichier /ect/at.denny qui est vide.
Ce qui permet en théorie l'acces à tous les utilisateurs.


Je n'ai pas encore de solutions :(

Posté : 20 févr. 2006, 18:19
par Ripat
As-tu essayé en ligne de commande avant de la faire par exec() ?

Posté : 20 févr. 2006, 18:42
par Paulo
Oui, mais en tant que root

Code : Tout sélectionner

at -f /var/www/vhosts/domaine.tld/httpdocs/monAtJob 17:34 20.02.2006
=>> 45 2006-02-20 17:34 a root

C'est bon.
Pour les tests, ca envoie un mail et je le reçois bien.

Par contre, dans le script php

Code : Tout sélectionner

exec("at -f /var/www/vhosts/domaine.tld/httpdocs/monAtJob 17:30 20.02.2006");
=>> 44 2006-02-20 17:30 a apache

Ce n'est pas bon, pourtant il est bien en attente (atq)

La seule différence que je vois, se sont les users qui sont différents (root & apache).

Pourtant en ayant le fichier /ect/at.deny vide, il est indiqué que tout utilisateur est autorisé.

Posté : 20 févr. 2006, 18:52
par Ripat
Essaye d'abord ceci:
echo exec("at 2>&1 -f /var/www/vhosts/domaine.tld/httpdocs/monAtJob 17:30 20.02.2006");
La redirection de stderr vers stdout permettra de voir quelle erreur le shell renvoie quand invoqué par le exec() de php.

Posté : 20 févr. 2006, 19:11
par Paulo
J'ai ceci en retour

Code : Tout sélectionner

Array ( [0] => job 46 at 2006-02-20 17:30 )