結論
systemdのサービスはシェル環境とは独立した環境で実行される。
そのためrcファイルの内容に依存したコマンドを実行しようとすると203エラーが出る。
そこでsystemdのサービス実行時に必要な設定を入れることで解決する。
備忘録
ここからは蛇足なんですが、私がハマったことを書いておきます。
ある日、systemdでサーバを自動起動しようと思い、ユニットファイルを書きました。
[Unit]
Description=hogehoge
After=network.target
[Service]
Type=simple
WorkingDirectory=/path/to/dir/
ExecStart=some_command
Restart=always
[Install]
WantedBy=multi-user.target
しかしstatusを見ると
ExecStart=some_command (code=exited, status=203/EXEC)
と実行できていませんでした。
コマンドを手打ちする分には実行できるのになんでだろな〜?とハマっていました。
原因はExecStart
のコマンドが環境変数に依存していたためでした。
export SOME_VAR="xxx"
~/.bashrc
にこのように書いてあっても、サービスファイルのExecStartが実行される環境は別なので、この設定を読まないのですね。
対応1
-l
オプションでシェルを起動してやれば動きます。
ExecStart=/bin/bash -lc 'some_command'
しかし、~/.bashrc
に依存するので、~/.bashrc
を変更する際の影響範囲が大きくなります。
対応2
設定も含めたシェルスクリプトを作ってそれをExecStart
に渡してやります。
これなら前述した問題はクリアできます。
#!/bin/bash
export SOME_VAR="xxx"
some_command