【问题标题】:Detect if python script is run from console or by crontab [duplicate]检测 python 脚本是从控制台运行还是通过 crontab [重复]
【发布时间】:2011-05-11 21:59:32
【问题描述】:

想象一个脚本在这两组“条件”中运行:

  1. 真人秀,设置在sudo crontab
  2. 调试,当我从控制台运行它时./my-script.py

我想要实现的是自动检测“调试模式”,而无需我为脚本指定参数(例如 --debug)。

是否有关于如何执行此操作的约定?是否有一个变量可以告诉我脚本所有者是谁?脚本是否在stdout 有控制台?运行ps | grep 来确定?

感谢您的宝贵时间。

【问题讨论】:

标签: python bash environment-variables crontab


【解决方案1】:

由于sys.stdin 在调试模式下将是TTY,您可以使用os.isatty() 函数:

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

【讨论】:

    【解决方案2】:

    您可以在 crontab 行中添加一个环境变量,并在您的 Python 应用程序中检查该环境变量是否已设置。

    crontab的配置文件:

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

    Python 代码:

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

    【讨论】:

      【解决方案3】:

      使用只有 cron 会使用的命令行选项。

      或者一个符号链接,在被 cron 调用时给脚本一个不同的名字。然后可以使用sys.argv[0]来区分调用脚本的两种方式。

      【讨论】:

      • 虽然我认为使用os.isatty() 来检测sysout 是否是终端是一种黑客行为。 OP 特别说他不想用命令行参数来做。此外,听起来 Python 本身在某些情况下可能会执行类似的操作 - 请参阅在线文档的 1.1.3. Miscellaneous options 部分中的 -i 解释器命令行选项的信息。跨度>
      猜你喜欢
      • 1970-01-01
      • 2015-10-14
      • 2021-12-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-20
      • 1970-01-01
      相关资源
      最近更新 更多