I am trying to use the $HOME
environment variable in the ExecStart
. I tried many different things like $HOME
and ${HOME}
but nothing seems to be working
ExecStart=${HOME}/bin/some-binary
Anyone knows the correct format for this?
Server Fault is a question and answer site for system and network administrators. It only takes a minute to sign up.
Sign up to join this communityI think this is what you're looking for: https://www.freedesktop.org/software/systemd/man/systemd.unit.html#Specifiers.
Specifically, %h
should expand to the current user's home dir.
%h
is the user home directory
. But, in my case, ExecStart
still requested the full path so I ended up typing it starting from the root.
Nov 15, 2019 at 9:06
%h
is probably not what you want. I've posted an alternate answer with details.
The full list of supported variables (called "Specifiers") is here: https://www.freedesktop.org/software/systemd/man/systemd.unit.html#Specifiers.
There is no specifier for the home directory of user the service is run as (the one specified by User=
). There is only one for the user running the service manager.
From the link:
%h
is the home directory of the user running the service manager instance. In case of the system manager this resolves to "/root
". Note that this setting is not influenced by theUser=
setting configurable in the [Service] section of the service unit.
%h
most definitely is what I want to use because it will give me the equivalent of $HOME
.
So, as the absence of practical examples in combination with comments makes a feeling like %h
doesn't work (it does actually), here's a full example of a service that starts from HOME dir without hardcoding it.
Given a script ~/test.sh
:
#!/bin/bash
echo hello
Creating a file ~/.config/systemd/user/test.service
:
[Unit]
Description=Test
[Service]
Type=oneshot
ExecStart=%h/test.sh
[Install]
WantedBy=multi-user.target
then executing a systemctl --user daemon-reload && systemctl --user start test
will make it start and print Hello
to the journal.
It uses the %h
specifier mentioned in other answers and documented as a This is the home directory of the user running the service manager instance. […]
. So unless you'll run your user service as another user, this should work.
Systemd versions tested:
systemd 253 (253.1-3-arch)
systemd 237
.
ExecStart=
. It must be a full path beginning with a/
.