Watch at Ease看見世界,讀懂生活。

科技 · 實用指南

systemd 顯示 status=203/EXEC?先證明可執行檔、解譯器與服務環境

命令可在互動式 shell 執行,不代表服務程序能啟動。先保存 journal、檢查實際生效的 ExecStart,再依服務環境核對路徑、shebang 解譯器、目錄遍歷、掛載選項與政策證據。

原創圖:從 ExecStart 經路徑、shebang 與服務環境追到三類 execve 錯誤。
原創示意圖:修復前先保存 execve 類別。 Watch at Ease

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 及窄修改。

原創圖:systemd 203/EXEC 的安全決策順序。
原創示意圖:先驗證 unit 與環境,再改權限或政策。 Watch at Ease