我试图使用crontab每分钟运行一次test.py,它使用一个参数调用(在一些其他函数之后)test2.py。当我在终端中运行“ python3 test.py”时,在任务管理器中看到了test2.py。当我使用crontab时,情况并非如此。正如我在终端中看到的那样,Test.py确实运行。所有文件都在/ root /中。
Crontab:
PATH=/root
* * * * * /usr/bin/flock -n /tmp/5.lockfile /usr/bin/python3 /root/test.py > /dev/pts/3
Test.py:
import subprocess
import os
import time
print(os.environ['PATH']) #Gives \root
#Three different methods, doesn't work:
subprocess.call("python3 /root/test2.py 1", shell=True)
subprocess.Popen("python3 test2.py 1", stdout=subprocess.PIPE, shell=True, preexec_fn=os.setsid)
os.system("test2.py 1")
time.sleep(30)
可能是python3不在运行crontab的用户的路径中。因此,您必须使脚本更加安全。
您可以考虑不使用shell=True
和字符串命令行:这是不正确的做法,并会导致问题(例如引号以及安全性问题)
无论系统路径sys.executable
用于查找当前解释器并创建参数列表,以免将来出现问题(例如包含特殊字符的参数),该方法都将起作用:
subprocess.call([sys.executable,"/root/test2.py","1"])
sys.executable
是当前正在运行脚本的解释器的完整路径,因此可以保证找到它。其余参数不取决于用户(权限除外)
此外,或许检查的返回码subprocess.call
,或如果呼叫已获得成功,通过更换subprocess.check_call
。
另一种方法是导入test2
并调用一个函数(如果有)。那不会创建另一个进程,但是可能没关系,它具有优点(例如:允许返回python类型,而不破坏异常链…)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句