【问题标题】:Detect if python script is run from console or by crontab [duplicate]检测 python 脚本是从控制台运行还是通过 crontab [重复]
【发布时间】:2011-05-11 21:59:32
【问题描述】:
想象一个脚本在这两组“条件”中运行:
- 真人秀,设置在
sudo crontab
- 调试,当我从控制台运行它时
./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 解释器命令行选项的信息。跨度>