%20%D0%B2%D0%BD%D1%83%D1%82%D1%80%D0%B8%20%D0%BA%D0%BE%D0%BC%D0%B0%D0%BD%D0%B4%D1%8B%20systemd%20exec%3F.png)
Я пишу службу 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/
.