2010-11-18 5 views
12

Imaginez un script est en cours d'exécution dans ces 2 ensembles de "conditions":détecter si le script python est exécuté à partir de la console ou par crontab

  1. action en direct, mis en place dans sudo crontab
  2. debug, quand je le lance de la console ./my-script.py

Ce que je voudrais réaliser est une détection automatique du mode « debug », sans me préciser un argument (par exemple --debug) pour le script.

Existe-t-il une convention sur la façon de procéder? Y at-il une variable qui peut me dire qui est le propriétaire du script? Si le script a une console à stdout? Exécutez un ps | grep pour déterminer cela?

Nous vous remercions de votre temps.

+0

similaire à [cette question SO] (http://stackoverflow.com/questions/2086961/how-can-i-determine-if-a-python-script-is-executed-from-crontab) –

Répondre

29

Depuis sys.stdin sera un TTY en mode débogage, vous pouvez utiliser la fonction os.isatty():

import sys, os 
if os.isatty(sys.stdin.fileno()): 
    # Debug mode. 
    pass 
else: 
    # Cron mode. 
    pass 
4

Vous pouvez ajouter une variable d'environnement à la ligne crontab et vérifier, dans votre application python, si la variable d'environnement est réglé.

fichier de configuration de crontab:

CRONTAB=true 

# run five minutes after midnight, every day 
5 0 * * *  /path/to/your/pythonscript 

code Python:

import os 

if os.getenv('CRONTAB') == 'true': 
    # do your crontab things 
else: 
    # do your debug things 
3

Utilisez une option de ligne de commande qui ne Cron utilisera.

Ou un lien symbolique pour donner un nom différent au script lorsqu'il est appelé par cron. Vous pouvez ensuite utiliser sys.argv[0] pour distinguer les deux manières d'appeler le script.

+1

Bien que je pensez en utilisant 'os.isatty()' pour détecter si 'sysout' est un terminal est un hack. le PO a spécifiquement dit qu'il ne voulait pas le faire avec un argument de ligne de commande. En outre, il semble que Python lui-même pourrait faire quelque chose comme ça dans certaines situations - voir les informations sur l'option de ligne de commande de l'interpréteur ** - i ** dans le [1.1.3. Options diverses] (http://docs.python.org/using/cmdline.html?highlight=command%20line%20option#miscellaneous-options) section des docs en ligne. – martineau

Questions connexes