テクノロジー · 実用ガイド
systemd の status=203/EXEC?実行ファイル、インタープリター、サービス環境を先に証明
シェルで動くコマンドでもサービスは開始前に失敗します。journal を保存し、有効な ExecStart、実行パス、shebang、親ディレクトリ、マウント、ポリシー証拠を unit 環境で調べます。

status=203/EXEC は systemd が設定プログラムを実行する段階に達したものの、execve が開始できなかったことを示します。ログインシェルとはトークン、作業ディレクトリ、ユーザー、マウント、セキュリティ環境が異なります。
chmod 777、シェルラッパー、ポリシー無効化から始めません。最初の journal とマージ済み unit を保存し、失敗した実行ファイルまたはインタープリターを分類します。
最初の実行証拠を固定
status と最初の journal を保存し、system/--user、unit 名、boot、時刻、203/EXEC 行を記録します。
systemctl cat で unit と drop-in、show で ExecStart、User、Group、WorkingDirectory を取得し、シェルのコマンドと比較します。
実行ファイルと全パスを解決
有効な ExecStart の先頭トークンを取り、リンク、file、namei -l で各親ディレクトリを確認します。無関係な権限は広げません。
スクリプトは先頭行をバイトで読み、shebang の絶対パスと隠れた CR を確認します。インタープリター欠落でも ENOENT になります。
シェルでなくサービス環境を試す
設定ユーザーと作業ディレクトリで試しますが、sudo -u は部分再現です。実 unit は環境、名前空間、能力、可視ファイルシステムも変えます。
実行ファイルとインタープリターに findmnt -T を使い noexec を確認します。通常のパスが通るなら audit AVC と journal を調べます。
証明した境界だけ修復
誤った ExecStart、欠けたインタープリター、shebang、改行、最小限のアクセスを修正します。noexec なら承認済み場所へ移すか所有者と方針を確認します。
SELinux 拒否はラベルと標準場所を先に確認し、原因を分析します。全体 permissive や広い許可規則を近道にしません。
必要なものだけ再読込し一回観測
unit 変更時だけ daemon-reload し、一回開始して直ちに status と新 journal を確認します。
主 PID、子プロセス、作業ディレクトリと実要求を確認し、有効 unit と狭い変更を保存します。
