我为 Python 脚本创建了一项新服务,该脚本在独立运行时可以运行,但通过 systemd 运行时会出现以下错误:
Oct 02 12:17:09 raspberrypi systemd[1]: Started Read pressure And Post to mqtt.
Oct 02 12:17:09 raspberrypi systemd[1]: ReadPressure.service: Main process exited, code=exited, status=203/EXEC
Oct 02 12:17:09 raspberrypi systemd[1]: ReadPressure.service: Unit entered failed state.
Oct 02 12:17:09 raspberrypi systemd[1]: ReadPressure.service: Failed with result 'exit-code'.
Oct 02 12:17:09 raspberrypi systemd[1]: ReadPressure.service: Service hold-off time over, scheduling restart.
Oct 02 12:17:09 raspberrypi systemd[1]: Stopped Read pressure And Post to mqtt.
Oct 02 12:17:09 raspberrypi systemd[1]: ReadPressure.service: Start request repeated too quickly.
Oct 02 12:17:09 raspberrypi systemd[1]: Failed to start Read pressure And Post to mqtt.
Oct 02 12:17:09 raspberrypi systemd[1]: ReadPressure.service: Unit entered failed state.
Oct 02 12:17:09 raspberrypi systemd[1]: ReadPressure.service: Failed with result 'exit-code'.
该服务是在“etc/systemd/system/ReadPressure.service”中创建的。它具有可执行权限。
服务看起来像:
[Unit]
Description=ReadPressure
[Service]
ExecStart=/bin/bash -c 'python3 -u /home/pi/ReadPressure/ReadPressure2AndPostToMqtt.py'
WorkingDirectory=/home/pi/ReadPressure/
Restart=always
User=pi
[Install]
WantedBy=multi-user.target
有什么想法为什么我会收到错误吗?操作系统是Raspbian。
谢谢
答案1
尝试:
pi@raspberrypi:~ $ systemctl status ReadPressure.service
转述@Ingo 来自我在启动时无法在 Thonny 中启动 python 程序
当脚本本身或其解释器无法执行时,经常会看到错误消息(code=exited,status=203/EXEC)。
可能有这些原因:
脚本路径错误(例如/home/py/ReadPressure2AndPostToMqtt.py)
脚本不可执行
没有 shebang(第一行)
shebang 中的路径错误(例如 /bin/python3)
脚本中的内部文件可能缺少访问权限。
SELinux 可能会阻止 ExecStart 参数的执行;检查 /var/log/audit/audit.log 中是否有以下形式的消息:
type=AVC msg=audit([...]): avc: denied { execute }
或 的输出ausearch -ts recent -m avc -i
。WorkingDirectory
你的参数有误
答案2
另一个可能的原因status=203/EXEC
可能是 SELinux。就我而言,我有一个启动 python 脚本的单元文件:
[Unit]
Description=LibreNMS SNMP Poller Service
After=network.target
[Service]
ExecStart=/opt/librenms/librenms-service.py -v -d
ExecReload=/bin/kill -HUP $MAINPID
WorkingDirectory=/opt/librenms
User=librenms
Group=librenms
RestartSec=10
Restart=always
[Install]
WantedBy=multi-user.target
python 脚本具有 SELinux 类型描述符httpd_sys_content_t
,不允许执行。我通过使用看到了错误,audit2why < /var/log/audit/audit.log
看起来像
type=AVC msg=audit(1631272189.992:1032): avc: denied { execute } for pid=2873 comm="(rvice.py)" name="librenms-service.py" dev="sda3" ino=714393 scontext=system_u:system_r:init_t:s0 tcontext=system_u:object_r:httpd_sys_content_t:s0 tclass=file permissive=0
Was caused by:
Missing type enforcement (TE) allow rule.
You can use audit2allow to generate a loadable module to allow this access.
我最终编辑了安全上下文。
非永久编辑(用于测试):
chcon -t bin_t /opt/librenms/librenms-service.py
永久编辑:
semanage fcontext -a -t bin_t '/opt/librenms/librenms-service.py'
restorecon -Fv /opt/bin/librenms-service.py
答案3
您可能需要引用您的命令,例如:
ExecStart="/bin/bash -c 'python3 bla blah'"
答案4
对我来说,问题实际上是我之前尝试安装的同名服务。通过日志中对旧服务的引用,我可以看出这是问题所在。删除旧服务并运行“systemctl daemon-reload”为我解决了这个问题。