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