systemd exec コマンド内で $(logname) を取得するにはどうすればよいですか?

systemd exec コマンド内で $(logname) を取得するにはどうすればよいですか?

私は systemd サービス ( /etc/systemd/system/name.service) を書いています。このサービスは に配置されたスクリプトを実行します。コマンド内では~/folder/script.sh使用できないため、 を使用しますが、機能しません。~/ExecStart/home/$(logname)/folder/script.sh

答え1

Systemd はシェル環境よりも低いレベルで動作します。つまり、コマンドを実行すると、通常はシェル環境の子プロセスとなり、シェル環境は init デーモン (この場合は systemd) の子プロセスとなります。つまり、systemd ユニットはシェル環境や のようなシェルマクロを認識したり従ったりしません。や~のようなファイルで設定された環境変数は適用されません。~/.profile~/.bashrcする適用するには、コマンド を入力しますsystemctl show-environment。私のシステム (Ubuntu Server および Arch) では、 および ですPATHLANG詳細情報ここ

これはすべて (多かれ少なかれ) ユーザー ユニットにも当てはまります... ただし、 でわかるように、systemd はユーザー ユニットに対して若干堅牢な環境を維持しますsystemctl show-environment --user。 最後のコマンドを実行した場合、必要な操作が明らかになっているはずです。systemd (少なくとも私のシステムでは) は、USERユニットが実行されているユーザーのユーザー名に環境変数を設定します。したがって、ExecStart 行を に変更します。これで完了です。また、 &/home/${USER}/folder/script.shを使用していないことに注意してください... systemd のマニュアル ページによると、これは不要です。中括弧 ( & ) は、非常に奇妙な理由でユーザー名にスペースが含まれている場合に備えてあります。ユーザーのホーム ディレクトリが 以外の場所にある場合でも機能する を使用することもできます。(){}${HOME}/folder/script.sh/home/

関連情報