1
1

結論

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
1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1