如何确定是否从crontab执行python脚本?

sor*_*rin 5 python unix terminal cron

我想知道如何确定是否从crontab执行python脚本?

我不想要一个需要添加参数的解决方案,因为我希望能够从导入的模块(而不是主脚本)中检测到这一点.

Jas*_*rff 19

不是你问的,但也许你想要的是os.isatty(sys.stdout.fileno()),它告诉我是否stdout连接到(粗略地说)一个终端.如果将输出通过管道传输到文件或其他进程,或者从cron运行进程,则为false.

  • **`sys.stdout.isatty()`**比`os.isatty(sys.stdout.fileno())`更直接. (3认同)

Ada*_*tan 7

检查其PPID - 其父进程的ID.将其与cron pid进行比较; 如果它们相同,则由crontab调用.

这可以通过以下方式完成:

$ sudo ps -Af | grep cron | grep -v grep
root  6363  1  0 10:17 ?  00:00:00 /usr/sbin/cron
Run Code Online (Sandbox Code Playgroud)

此示例中的cron进程的PID为6363.值得一提的是,cron的PPID为1 - init进程.

现在找出你的python程序的PID是什么:

$  sudo ps -Af | grep SorinSbarnea.py
adam  12992  6363  1 12:24 pts/2  00:04:21 /usr/bin/python SorinSbarnea.py
Run Code Online (Sandbox Code Playgroud)

它的PID是12992,PPID是6363,所以它确实是由cron进程调用的.

编辑:

cron进程可能不会直接调用您的进程.因此,您必须向上遍历过程中的PPID,直到达到PPID = 1或PPID = /usr/sbin/cron'PID.这可以使用小shell或python脚本轻松完成; 只解析输出ps:

$ cat /proc/12992/status
....
Pid:    12992
PPid:   7238
Uid:    1000    1000    1000    1000
Gid:    1000    1000    1000    1000
...
Run Code Online (Sandbox Code Playgroud)

下一步是checkig/proc/7238,依此类推.同样,使用shell或python脚本实现这很容易.

谢谢@digitalarbeiter和@Noufal Ibrahim在你的评论中指出它.

  • cron将在新shell中运行您的crontab条目,这将是您的Python脚本的PPID.您需要比较PPID的PPID. (3认同)
  • 这假设父(cron)直接产生了孩子而没有shell或其他东西.并非总是如此. (2认同)

Ste*_*ini 5

cron命令调用处设置环境变量。即使在模块中也可以使用,您只需检查即可os.getenv()