科技 · 實用指南
systemd 顯示 status=203/EXEC?先證明可執行檔、解譯器與服務環境
命令可在互動式 shell 執行,不代表服務程序能啟動。先保存 journal、檢查實際生效的 ExecStart,再依服務環境核對路徑、shebang 解譯器、目錄遍歷、掛載選項與政策證據。

status=203/EXEC 表示 systemd 已嘗試執行設定的程式,但 execve 沒有啟動它。登入 shell 成功,服務仍可能因可執行項、工作目錄、使用者、掛載視圖或安全環境不同而失敗。
不要從 chmod 777、加入 shell 包裝或關閉安全政策開始。保存第一份 journal、讀取合併後的 unit,再分類失敗的程式或解譯器路徑。
先凍結首次執行證據
保存 status 與第一批相關 journal,記錄 system 或 --user unit、精確名稱、boot、時間與 203/EXEC 行。
用 systemctl cat 取得基礎 unit 和 drop-in,再用 show 查看 ExecStart、User、Group、WorkingDirectory,與 shell 成功命令比較。
解析程式與每段路徑
從生效 ExecStart 取第一個程式項,解析連結、以 file 檢查並用 namei -l 查看每個父目錄,不要擴大無關權限。
腳本要按位元組讀首行,確認 shebang 的絕對解譯器存在且沒有隱藏回車;解譯器遺失時腳本存在仍會 ENOENT。
測試服務環境而非只測 shell
依設定使用者和工作目錄測試,但 sudo -u 只是部分重現;實際 unit 還會改變環境、命名空間、能力與可見檔案系統。
對程式和解譯器使用 findmnt -T 檢查 noexec。路徑與模式正常後查看 audit AVC 與 journal,不以關閉強制政策隱藏問題。
只修已證明的邊界
修正 ExecStart、安裝解譯器、修復 shebang 或行尾,或給予最小目錄與檔案存取。noexec 位置應移到核准路徑,或由檔案系統擁有者確認政策。
SELinux 拒絕應先核標籤與標準位置,再分析根因;不要直接全域 permissive 或建立過寬規則。
只重載變更,再觀察一次啟動
只有 unit 或 drop-in 改變才 daemon-reload。啟動一次後立即查看新 status 與 journal,避免重試淹沒證據。
確認主 PID、子程序、工作目錄與一個真實請求,並保存最終生效 unit 及窄修改。
