如何判断Python脚本是否从crontab执行?
我想知道怎么判断一个Python脚本是不是从crontab(定时任务)执行的。
我不想要那种需要添加参数的解决方案,因为我希望即使是在一个被导入的模块里,也能检测到这一点(而不是在主脚本里)。
6 个回答
6
在使用cron
命令时,可以设置一个环境变量。这种方法在模块内部也能正常工作,因为你只需要检查一下os.getenv()
就可以了。
9
检查一下它的父进程ID,也就是PPID。把这个ID和cron的进程ID进行比较;如果它们是一样的,那说明这个进程是由crontab启动的。
你可以这样做:
$ sudo ps -Af | grep cron | grep -v grep
root 6363 1 0 10:17 ? 00:00:00 /usr/sbin/cron
在这个例子中,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
它的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
...
下一步是检查/proc/7238,依此类推。同样,这也可以很容易地用shell或python脚本来实现。
感谢@digitalarbeiter和@Noufal Ibrahim在评论中指出这一点。
24
虽然这不是你问的内容,但也许你想要的是 os.isatty(sys.stdout.fileno())
这个代码,它可以告诉你 stdout
(标准输出)是否连接到了一个终端。简单来说,如果你把输出通过管道传输到一个文件或者其他程序,或者这个程序是通过定时任务(cron)运行的,这个值就会是假的。