web-dev-qa-db-fra.com

Comment définir une tâche à exécuter de temps en temps?

Comment exécuter un script toutes les 30 minutes, par exemple? Je suppose qu'il existe différentes manières pour différents systèmes d'exploitation. J'utilise OS X.

70
stalepretzel

Utilisez simplement launchd . C'est un système de lancement très puissant et, en attendant, c'est le système de lancement standard pour Mac OS X (la version actuelle d'OS X ne démarrerait même pas sans lui). Pour ceux qui ne sont pas familiarisés avec launchd (ou avec OS X en général), c'est comme un croisement entre init, cron, at, SysVinit (init.d), inetd, upstart et systemd. Emprunter des concepts de tous ces projets, mais aussi proposer des choses que vous ne trouverez peut-être pas ailleurs.

Chaque service/tâche est un fichier. L'emplacement du fichier dépend des questions: "Quand ce service est-il censé fonctionner?" et "De quels privilèges le service aura-t-il besoin?"

Les tâches système vont à

/Library/LaunchDaemons/

s'ils s'exécutent, peu importe si un utilisateur est connecté ou non au système. Ils seront démarrés avec les privilèges "root".

S'ils s'exécutent uniquement si un utilisateur est connecté, ils accèdent à

/Library/LaunchAgents/

et sera exécuté avec les privilèges de l'utilisateur qui vient de se connecter.

S'ils ne s'exécutent que si vous êtes connecté, ils accèdent à

~/Library/LaunchAgents/

où ~ est votre répertoire HOME. Ces tâches s'exécuteront avec vos privilèges, comme si vous les aviez démarrées vous-même par ligne de commande ou en double-cliquant sur un fichier dans le Finder.

Notez qu'il existe également /System/Library/LaunchDaemons et /System/Library/LaunchAgents, mais comme d'habitude, tout sous /System est géré par OS X. Vous ne devez y placer aucun fichier, vous ne devez y modifier aucun fichier, sauf si vous savez vraiment ce que vous faites. Jouer dans le dossier Systems peut rendre votre système inutilisable (mettez-le dans un état où il refusera même de redémarrer). Il s'agit des répertoires dans lesquels Apple place les tâches launchd qui permettent à votre système d'être opérationnel au démarrage, de démarrer automatiquement les services selon les besoins, d'effectuer les tâches de maintenance du système, etc.

Chaque tâche launchd contient un fichier au format plist. Il doit avoir une notation inversée du nom de domaine. Par exemple. vous pouvez nommer votre tâche

com.example.my-fancy-task.plist

Cette liste peut avoir différentes options et paramètres. Écrire un par main n'est pas optimal, vous voudrez peut-être obtenir l'outil gratuit Lingon pour créer vos tâches. Cet outil était gratuit, maintenant il coûte 5 $ dans l'App Store et 10 $ dans la version non App Store (la version non App Store est beaucoup plus puissante et si vous prévoyez déjà de le payer, sérieusement, obtenez le non App Store version). Si quelqu'un connaît un outil comparable qui est gratuit ou open source, envoyez-moi une ligne dans les commentaires et je recommanderai plutôt celui-ci (je ne veux pas faire de publicité ici pour un logiciel commercial).

À titre d'exemple, cela pourrait ressembler à ceci

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.Apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>com.example.my-fancy-task</string>
    <key>OnDemand</key>
    <true/>
    <key>ProgramArguments</key>
    <array>
        <string>/bin/sh</string>
        <string>/usr/local/bin/my-script.sh</string>
    </array>
    <key>StartInterval</key>
    <integer>1800</integer>
</dict>
</plist>

Cet agent exécutera le script Shell /usr/local/bin/my-script.sh toutes les 1800 secondes (toutes les 30 minutes). Vous pouvez également exécuter une tâche à certaines dates/heures (fondamentalement launchd peut faire tout ce que cron peut faire) ou vous pouvez même désactiver "OnDemand", ce qui permet à launchd de maintenir le processus en cours d'exécution (s'il se ferme ou se bloque, launchd le redémarrera immédiatement) . Vous pouvez même limiter la quantité de ressources qu'un processus peut utiliser (comme dit précédemment, Lingon affiche tous ces paramètres dans une interface Nice UI).

Mise à jour: Même si OnDemand est toujours pris en charge, il est déconseillé. Le nouveau paramètre est nommé KeepAlive, ce qui est beaucoup plus logique. Il peut avoir une valeur booléenne, auquel cas il est exactement l'opposé de OnDemand (le définir sur false se comporte comme si OnDemand est true et le dans l'autre sens). La grande nouvelle fonctionnalité est qu'elle peut également avoir une valeur de dictionnaire au lieu d'une valeur booléenne. S'il a une valeur de dictionnaire, vous avez quelques options supplémentaires qui vous donnent un contrôle plus fin du grain dans quelles circonstances la tâche doit être maintenue en vie. Par exemple. il n'est maintenu en vie que tant que le programme s'est terminé avec un code de sortie de zéro, uniquement tant qu'un certain fichier/répertoire sur le disque existe, uniquement si une autre tâche est également active, ou uniquement si le réseau est actuellement opérationnel.

Vous pouvez également activer/désactiver manuellement les tâches via la ligne de commande:

launchctl <command> <parameter>

la commande peut être chargée ou déchargée, pour charger une liste ou la décharger à nouveau, auquel cas le paramètre est le chemin d'accès au fichier. La commande peut être start ou stop, pour simplement démarrer ou arrêter une telle tâche, auquel cas le paramètre est le label (com.example.my-fancy-task). D'autres commandes et options existent également.

Voir la documentation Apple du format plist et de l'outil de ligne de commande launchctl (notez que vous pouvez sélectionner la version OS X par dessus, puisque le format/les options varient entre les différentes versions d'OS X)

113
Mecki

vous pouvez utiliser le générateur de plist très pratique: http://launched.zerowidth.com/ (pas besoin d'acheter quoi que ce soit…)

il vous donnera une ligne unique Shell pour enregistrer un nouveau travail planifié avec le lancement déjà recommandé

37
Kosmotaur

Sur MacOSX, vous avez au moins les options suivantes:

  • Alarme iCal récurrente avec une action "Exécuter le script"
  • launchd
  • cron ( link1 , link2 )

Par expérience personnelle, cron est le plus fiable. Lorsque j'ai testé, launchd avait un certain nombre de bugs et de bizarreries. Les alarmes iCal ne s'exécutent que lorsque vous êtes connecté (mais cela peut être quelque chose que vous préférez).

11
Bruno De Fraine

Comme l'a souligné Mecki, launchd serait la solution. Il y a une interface graphique pour launchd appelée Lingon que vous voudrez peut-être vérifier, au lieu de modifier les fichiers launchd à la main:

Lingon est une interface utilisateur graphique pour créer un fichier de configuration de launchd d'édition pour Mac OS X Leopard 10.5.

[couper...]

La modification d'un fichier de configuration est plus facile que jamais dans cette version et elle a deux modes différents. Mode de base qui a les paramètres les plus courants facilement disponibles dans une interface très simple et mode expert où vous pouvez ajouter tous les paramètres directement dans le texte ou les insérer via un menu.

6
Jay

MAC OS a un outil Automator qui est le même que celui de Task Scheduler dans les fenêtres. Et en utilisant Automator, vous pouvez planifier des tâches quotidiennement et lier la tâche à un événement de calendrier récurrent pour exécuter quotidiennement des scripts à une heure spécifiée. référez-vous au lien pour exécuter des scripts quotidiennement sous Mac OS

3
Jlearner

Pour les scripts Apple, je mets en place un calendrier iCal spécial et j'utilise des alarmes pour les exécuter périodiquement. Pour les outils de ligne de commande, j'utilise launchd.

2
Mike Heinz

FYI: alors que je manque tellement c'est la siplicité, cron est une chose du passé sur OS X. C'était chien de garde sur panther. Depuis Tiger, il a été lancé. Donc, si vous exécutez Leopard cron n'est pas une option.

1
joelbrock