終了コードステータス= 203 / EXECのため、システムサービスが失敗しました。

終了コードステータス= 203 / EXECのため、システムサービスが失敗しました。

起動時に実行されるサービスを作成しようとしています。このサービスは、私のユーザーのホームディレクトリにあるC ++で書いてコンパイルしたプログラムです。プログラムは一部のUDPソケットを開き、無限ループにあるため、自動的に終了しません。プログラムを手動で実行でき、すべてが期待どおりに機能しますが、実行してsystemctl start myservice状態を確認すると、プログラムが実行されていないことがわかります。以下のエラー結果+その他の有用な情報。ちなみに、オペレーティングシステムはCentOS Streamです。

出力は以下から来ます。systemctl status myservice

myservice.service - my serivce
    Loaded: loaded (/etc/systemd/system/myservice.service; disabled; vendor present: disabled)
    Active: failed (Result: exit-code) since <redacted unnecessary timestamp>
    Process 2101 ExecStart=/home/user/program (code=exited, status=203/EXEC)
  Main PID: 2101 (code=exited, status=203/EXEC)

Journalctlのエラーメッセージ

myservice.service: Main process exited, code=exited, status=203/EXEC
myservice.service: Failed with result 'exit-code'
myservice.service: Service RestartSec=2s expired, scheduling restart

システム単位ファイル

[Unit]
Description=my service
After=network.target

[Service]
Type=simple
ExecStart=/home/user/program
User=user
WorkingDirectory=/home/user/
Restart=always
RestartSec=2
KillMode=process

[Install]
WantedBy=multi-user.target

203ステータスは通常、ファイルが存在しないか、適切な権限がないことを意味するため、以下の出力はこれがそのような問題の1つではないことを証明します(希望的に)。

出力は以下から来ます。ls -laZ /home/user/program

-rwxrwxrwx. 1 root root unconfined_u:object_r:user_home_t:s0 803168 Aug 14 23:35 /home/user/program

出力は以下から来ます。sestatus

SELinux status: enabled
SELinuxfs mount: /sys/fs/selinux
SELinux root directory /etc/selinux
Loaded policy name: targeted
Current mode: enforcing
Mode from config file: enforcing
Policy MLS status: enabled
Policy deny_unknown status: allowed
Memory protection checking: actual (secure)
Max kernel policy version: 33

出力は以下から来ます。ausearch -ts recent -m avc -i

type=PROCTITLE msg=audit(08/16/2021 20:14:04.216:698) : proctitle=(ster_myservice)
type=SYSCALL msg=audit(08/16/2021 20:14:04.216:698) : arch=x86_64 syscall=execve success=no exit=EACCES(Permission denied) a0=0x5572ff82e7a0 a1=0x5572ff6ff6d0 a2=0x5572ff7f54b0 a3=0x1 items=0 ppid=1 pid=2568 auid=unset uid=user gid=user euid=user suid=user fsuid=user egid=user sgid=user fsgid=user tty=(none) ses=unset comm=(ster_myservice) exe=/usr/lib/systemd/systemd subj=system_u:system_r:init_t:s0 key=(null)
type=AVC msg=audit(08/16/2021 20:14:04.216:698) : avc:  denied  { execute } for  pid=2568 comm=(ster_myservice) name=program dev="dm-2" ino=137 scontext=system_u:system_r:init_t:s0 tcontext=unconfined_u:object_r:user_home_t:s0 tclass=file permissive=0

ベストアンサー1

SELinuxはプログラムを実行しません:AVC Deny status type=AVC msg=audit(08/16/2021 20:14:04.216:698) : avc: denied { execute } for pid=2568 comm=(ster_myservice) name=program dev="dm-2" ino=137 scontext=system_u:system_r:init_t:s0 tcontext=unconfined_u:object_r:user_home_t:s0 tclass=file permissive=0

これはinit_t、プロセスコンテキストで実行されているsystemdが表示されたプログラムを起動できないことを意味しますuser_home_t

これを軽減するには、プログラムを標準のバイナリディレクトリ(たとえば)に移動して/usr/local/binからrestorecon -Rv /usr/local/bin

またはあなたが必要ホームディレクトリ外でプログラムを実行するには、カスタム SELinux ポリシーモジュールをコンパイルします。

ausearch -m avc -ts recent --comm ster_myservice | audit2allow -a -M ster-myservice
semodule -i ster-myservice.pp

おすすめ記事