【问题标题】:Crontab not running a Processing scriptcrontab 未运行处理脚本
【发布时间】:2020-11-13 07:27:26
【问题描述】:

我有一个从命令行运行的 python 脚本,它执行三件事

1.) 杀死当前正在运行的所有处理程序

2.) 运行一个新的处理程序

3.) 关闭树莓派

从命令行运行此命令时,它可以完美运行。然而,当使用 crontab 调用这个 Python 脚本时,只有第 1 个和第 3 个进程可以正常运行。我想知道的是为什么当我从命令行运行 Python 脚本而不是从 crontab 运行第二个命令(运行新的处理程序)时有效?

这是我的 Python 脚本

import os # Use operating system
import  subprocess # Use subprocess calls
from time import sleep # Use sleep
from subprocess import call 


os.system('sudo killall java')
sleep(5)
child = subprocess.Popen('sudo processing-java --sketch=/home/pi/Desktop/LaserCannonProcessing/LCshutdown --run', shell=True) # 
sleep(15)
call("sudo poweroff", shell = True)

这是我的 crontab

50 20  * * * sudo /usr/bin/python3 /home/pi/Desktop/Shutdown.py

有谁知道为什么crontab不能成功运行命令来运行一个处理程序?如果是这样,有什么办法可以解决这个问题并让 crontab 运行该行?谢谢

【问题讨论】:

    标签: java python cron raspberry-pi processing


    【解决方案1】:

    cron 守护进程会自动设置几个环境变量。默认路径设置为 PATH=/usr/bin:/bin。

    因此,如果processing-java 命令不在 cron 指定路径中,您应该使用命令的绝对路径或更改 cron $PATH 变量。

    使用shell=True 掩盖了问题... 例如

    In [7]: child = subprocess.Popen('bla', shell=True)
    /bin/sh: bla: command not found
    In [8]: child
    Out[8]: <subprocess.Popen at 0x107ac8c50>
    

    您可以在脚本中添加一些调试以找出真正的问题:

    • try-except 围绕子进程调用和 shell=True
    • 打印os.environ["PATH"]
    • 检查文件的权限(如果您的进程需要读/写文件)

    【讨论】:

      猜你喜欢
      • 2017-12-02
      • 2014-06-25
      • 2019-11-24
      • 2020-02-02
      • 2015-10-05
      • 2017-12-16
      • 2012-05-23
      • 1970-01-01
      • 2017-11-20
      相关资源
      最近更新 更多