16

Imagine a script is running in these 2 sets of "conditions":

  1. live action, set up in sudo crontab
  2. debug, when I run it from console ./my-script.py

What I'd like to achieve is an automatic detection of "debug mode", without me specifying an argument (e.g. --debug) for the script.

Is there a convention about how to do this? Is there a variable that can tell me who the script owner is? Whether script has a console at stdout? Run a ps | grep to determine that?

Thank you for your time.

1

3 Answers 3

38

Since sys.stdin will be a TTY in debug mode, you can use the os.isatty() function:

import sys, os
if os.isatty(sys.stdin.fileno()):
    # Debug mode.
    pass
else:
    # Cron mode.
    pass
Sign up to request clarification or add additional context in comments.

Comments

9

You could add an environment variable to the crontab line and check, inside your python application, if the environment variable is set.

crontab's configuration file:

CRONTAB=true

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

Python code:

import os

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

Comments

4

Use a command line option that only cron will use.

Or a symlink to give the script a different name when called by cron. You can then use sys.argv[0]to distinguish between the two ways to call the script.

1 Comment

Although I think using os.isatty() to detect whether sysout is a terminal is a hack. the OP specifically said he did not want to to do it with a command line argument. In addition, it sounds like Python itself might be doing something like this in certain situations -- see the info for the -i interpreter command line option in the 1.1.3. Miscellaneous options section of the online docs.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.