新しいサービスを作成するとsystemd "status=203/EXEC"エラーが発生する

新しいサービスを作成するとsystemd "status=203/EXEC"エラーが発生する

スタンドアロンで実行すると動作しますが、systemdを介して実行すると次のエラーが発生するPythonスクリプト用の新しいサービスが作成されました。

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

なぜエラーが発生するのかご存知ですか?オペレーティングシステムはラズビアンです。

ありがとう

答え1

努力する:

pi@raspberrypi:~ $ systemctl status ReadPressure.service

@Ingoが頼む起動時にThonyからPythonプログラムを起動できません。

エラーメッセージ(コード=終了、ステータス= 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/EXECSELinuxです。私の場合、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」を実行すると問題が解決しました。

関連情報