创建新服务时 systemd“status=203/EXEC”错误

创建新服务时 systemd“status=203/EXEC”错误

我为 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”为我解决了这个问题。

相关内容