检测 Python 脚本是从控制台运行还是由 crontab 执行

16 投票
3 回答
5253 浏览
提问于 2025-04-16 07:15

想象一下,有一个脚本在这两种“环境”下运行:

  1. 正常运行,设置在 sudo crontab
  2. 调试模式,当我从控制台运行它时,使用 ./my-script.py

我想要实现的是自动检测“调试模式”,而不需要我手动指定一个参数(比如 --debug)给脚本。

有没有什么约定可以做到这一点?有没有什么变量可以告诉我脚本的拥有者是谁?脚本是否在 stdout 上有控制台?要不要运行 ps | grep 来判断一下?

谢谢你的时间。

3 个回答

4

使用一个只有定时任务(cron)会用到的命令行选项。

或者可以创建一个符号链接,让脚本在被定时任务调用时有一个不同的名字。这样你就可以用 sys.argv[0] 来区分这两种调用脚本的方式。

9

你可以在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
38

因为在调试模式下,sys.stdin 会变成一个 TTY(终端设备),所以你可以使用 os.isatty() 这个函数来检查。

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

撰写回答