57 votes

commande cron à exécuter toutes les 12 heures

J'ai besoin d'une commande unix cron qui s'exécute toutes les 12 heures.

J'ai plus de 500 sous-blogs sur mon serveur.

Voici le fichier que je veux exécuter toutes les 12 heures

http://*.mysite.com/somedir/index.php

Où * est le sous-domaine de mes blogs.

J'ai besoin d'une commande cron pour tous les blogs. Est-il possible de les exécuter tous avec une seule commande ? OU dois-je créer une commande pour chaque blog ?

0 votes

Qu'est-ce que vous ne comprenez pas : le format de crontab ou comment accéder/exécuter un script PHP ?

0 votes

Avez-vous une liste de sites quelque part ? (à quoi doit s'étendre le '*' ?)

0 votes

Voulez-vous exécuter le script localement, ou l'appeler depuis une autre machine ? Si vous l'avez localement, vous pourriez facilement créer une seule commande. Appeler un curl ou un wget sur chaque page une par une s'avérera un peu plus difficile.

153voto

NEW Points 1250

Un fichier crontab comporte cinq champs permettant de spécifier le jour, la date et l'heure, suivis de la commande à exécuter à cet intervalle.

*     *     *   *    *        command to be executed
-     -     -   -    -
|     |     |   |    |
|     |     |   |    +----- day of week (0 - 6) (Sunday=0)
|     |     |   +------- month (1 - 12)
|     |     +--------- day of        month (1 - 31)
|     +----------- hour (0 - 23)
+------------- min (0 - 59)

* dans le champ de valeur ci-dessus signifie toutes les valeurs légales entre accolades pour cette colonne.

Vous pourriez utiliser 0 1,13 * * * c'est-à-dire pour chaque tranche de 1 heure du matin et de 1 heure du soir.

0 1,13 * * * rm /var/www/*/somedir/index.php > /home/someuser/cronlogs/some.log 2>&1

* peuvent être remplacés par des noms de domaine différents.

3 votes

C'est la meilleure réponse car elle vous montre comment faire avec des heures arbitraires, pas seulement 12PM / 12AM.

0 votes

Expliquez-moi ce qu'il y a dans cette chaîne :)

0 votes

Notez que vous pouvez également définir une minute, par exemple "47 1,13 * * *" qui signifie "tous les 1:47am et 1:47pm". Cela peut être utile pour réduire les charges sur votre serveur ; au lieu de lancer tous les crons à la 0e minute de chaque heure, espacez-les

34voto

Giovani Dardani Points 436

Je pense que le bon chemin est -> 1 */12 * * * ( En fait, n'importe quel chiffre dans la position des minutes fera l'affaire. )

Si vous définissez -> * */12 * * * il sera exécuté toutes les minutes à 12h et à nouveau à 24h.

11voto

Jens Timmerman Points 1448

En supposant que vos sites se trouvent dans /var/www/sitename et que le shell php est installé dans /usr/bin/php, vous pouvez facilement créer une tâche cron qui exécute tous ces fichiers.

exécuter

crontab -e

et ajoutez cette ligne

42 */12 * * * /usr/bin/php /var/www/*/somedir/index.php  >> ~/cronjob.log 2>&1

Le * dans /var/www/*/somedir est un caractère générique. Cela signifie que tous les répertoires de votre dossier /var/ww seront pris en compte.

p.ex :

[jens@localhost ~]$ ls -l temp
total 28
-rw-rw-r--. 1 jens jens 1641 Feb 21 16:12 somefile.py
drwxrwxr-x. 2 jens jens 4096 Feb 22 15:10 test
drwxrwxr-x. 2 jens jens 4096 Feb 22 15:10 test2
drwxrwxr-x. 2 jens jens 4096 Feb 22 15:10 test3
drwxr-xr-x. 8 jens jens 4096 Jan 27 10:21 emptydir
-rw-rw-r--. 1 jens jens  548 Jan 27 16:15 Unsaved Document 1

[jens@localhost ~]$ ls temp/*/testfile.php 
temp/test2/testfile.php  temp/test3/testfile.php  temp/test/testfile.php

Comme vous pouvez le voir, cela renvoie le testfile.php dans chaque sous-dossier de temp, à savoir le dossier test, test2 et test3. Emptydir est également un dossier, mais comme il ne contient pas de testfile.php, rien ne se passera avec lui.

Si votre structure de répertoire est arbitrairement profonde, vous pouvez utiliser **

par exemple 42 */12 * * * /usr/bin/php /var/www/**/index.php >> ~/cronjob.log 2>&1

0 votes

Bonjour, je ne suis pas sûr de ce que * signifie dans cette ligne /var/www/*/somedir/index.php Vous voulez que j'utilise la commande telle quelle ou je dois la remplacer par mes sous-domaines ?

0 votes

@user1091558 : c'est ce que je vous ai demandé dans le cadre de l'OT. Avez-vous une liste de sites (ou une liste de scripts) ?

0 votes

Oh, je suis désolé. J'utilise wordpress multisite. J'ai plus de 500 blogs sous une seule installation. Donc je n'ai qu'une liste de sites

7voto

Geremia Points 162

Utilisez "*/12" pour signifier "toutes les 12 heures".

6voto

wildplasser Points 17900

Vous avez besoin d'une sorte de maître-script (appelé par cron), qui développe la liste des sites, et appelle "/usr/bin/php /var/www/*/somedir/index.php", avec le '*' remplacé par une entrée de liste. Ceci peut être fait dans un shellscript, un script en perl ou python, ou peut-être même un script en php. Pour sh, cela pourrait être : (non testé)

#!/bin/sh
cd /home/subdir/for/cron

LIST="a b c d e f g h i j k l m o p q r s t u v w x y z"

for x in $LIST; do
   /usr/bin/php /var/www/${x}/somedir/index.php 2>$1 > /tmp/${x}.log
done

S'il n'est pas pratique d'avoir la liste codée en dur de cette manière, il existe d'autres méthodes : backticks ou read < file_with_all_the_names_in_it

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X