ルートとして実行されるサービスがあります。
[Unit]
Description=my service
After=docker.service network-online.target
Requires=docker.service network-online.target
[Service]
TimeoutStartSec=0
RestartSec=60
Restart=always
User=root
Group=root
ExecStart=/usr/bin/myservice
[Install]
WantedBy=multi-user.target
予期しない動作が発生しました。
障害を引き起こす環境変数を見てみると、その$HOME
環境変数が。/root
myservice
しかし、ルートとして次のようになります。
$ echo $HOME
/home/root
これは私が見たものと一致する/etc/passwd
root:x:0:0:root:/home/root:/bin/sh
手動で実行すると、myservice
正しい$HOME
環境変数が得られ、動作します。
私は$HOME
したいのですが、/home/root
そうではありません/root
。だから...
- どこから
systemd
来て、/root
なぜ上書きされますか$HOME
? systemd
$HOME
サービスファイルで環境変数を明示的に設定することに加えて、これがグローバルに行われるのを防ぐにはどうすればよいですか? <-- ソースコードを見てみると、あまり影響はないようです。
答え1
ソースコードを確認した後、ディレクトリがsystemd
実際にユーザーhome
のためにroot
ハードコードされていることがわかりました。この設定を変更する構成文書が見つからなかったため、デフォルトのホームディレクトリを使用するYoctoプロジェクトについて知っておく必要があります。
/root
ハードコードされた値をinに変更して/home/root
これを確認しました。https://github.com/systemd/systemd/blob/main/src/basic/user-util.csystemd
修正されたサービスが正しい変数で作成されていることを観察しました$HOME
。
これまではシンボリックリンクが良い解決策/root
でした。/home/root
デフォルトをROOT_HOME
次に切り替えるのは/root
悪い考えではないかもしれません。残りのLinuxの世界との支援。