树莓派使用at命令延迟执行Python脚本失败问题排查
问题:树莓派中使用at命令延迟执行Python脚本失败
在树莓派上开发Linux脚本时,需要延迟调用另一Python脚本,通过Python代码调用at命令后,到指定时间脚本未执行,具体信息如下:
调用at命令的Python代码
import shlex import subprocess subprocess.call(shlex.split("at now + 5 minutes -f /home/raspberry/Desktop/Filename.py"))
直接执行at命令的反馈
warning: commands will be executed using /bin/sh job 13 at Sun Feb 19 23:17:00 2023
待执行的Filename.py代码
#!/usr/bin/env python3 print("Hallo Welt")
/var/spool/mail/raspberry中的错误反馈
From raspberry@raspberrypi Sun Feb 19 23:17:00 2023 Return-path: <raspberry@raspberrypi> Envelope-to: raspberry@raspberrypi Delivery-date: Sun, 19 Feb 2023 23:17:00 +0100 Received: from raspberry by raspberrypi.fritz.box with local (Exim 4.94.2) (envelope-from <raspberry@raspberrypi>) id 1pTrzQ-0000we-Fr for raspberry@raspberrypi; Sun, 19 Feb 2023 23:17:00 +0100 Subject: Output from your job 13 To: raspberry@raspberrypi Message-Id: <E1pTrzQ-0000we-Fr@raspberrypi.fritz.box> From: raspberry@raspberrypi Date: Sun, 19 Feb 2023 23:17:00 +0100 sh: 47: Syntax error: word unexpected (expecting ")")
解决方案
问题根源
at命令的-f参数用于读取shell命令序列文件,而非直接执行脚本文件。你直接将Python脚本传给-f,at会调用/bin/sh解析该脚本,shell无法识别Python语法,因此抛出语法错误。
调整步骤
方法一:修改Python代码,传递正确的执行命令给at
放弃-f参数,通过管道将执行Python脚本的命令传给at,示例代码:import subprocess cmd = 'echo "/usr/bin/env python3 /home/raspberry/Desktop/Filename.py" | at now + 5 minutes' subprocess.call(cmd, shell=True)方法二:让Python脚本可直接执行
- 先给脚本添加可执行权限:
chmod +x /home/raspberry/Desktop/Filename.py - 修改Python调用代码,传递执行脚本的命令给at:
import subprocess cmd = 'echo "/home/raspberry/Desktop/Filename.py" | at now + 5 minutes' subprocess.call(cmd, shell=True)
- 先给脚本添加可执行权限:
额外检查项
- 确认
atd服务正在运行:执行systemctl status atd,确保服务处于active (running)状态,否则at任务无法被触发。 - 如果需要查看脚本输出,可以在命令中指定日志文件,避免查邮件:
echo "/home/raspberry/Desktop/Filename.py > /home/raspberry/Desktop/script_output.log 2>&1" | at now + 5 minutes
- 确认
内容的提问来源于stack exchange,提问作者Daniel Stappenbeck
相关产品推荐
相关产品推荐

