Como posso obter $(logname) dentro do comando systemd exec?

Como posso obter $(logname) dentro do comando systemd exec?

Estou escrevendo um serviço systemd ( /etc/systemd/system/name.service). Este serviço executa um script colocado em ~/folder/script.sh. Não consigo usar ~/dentro do ExecStartcomando então uso /home/$(logname)/folder/script.shmas não funciona.

Responder1

O Systemd opera em um nível inferior ao seu ambiente shell. Com isso quero dizer que quando você executa um comando, normalmente é um processo filho do seu ambiente shell, que é um processo filho do seu daemon de inicialização (neste caso, systemd). Isso significa que as unidades do systemd não veem ou obedecem ao seu ambiente shell nem às macros shell como ~. Quaisquer variáveis ​​de ambiente configuradas em arquivos como ~/.profileou ~/.bashrcnão se aplicam. Para ver o quefazapply você pode digitar o comando systemctl show-environment. Nos meus sistemas (Ubuntu Server e Arch) isso é PATHe LANG. Mais informaçõesaqui.

Tudo isso vale (mais ou menos) para unidades de usuário também... mas o systemd mantém um ambiente um pouco mais robusto para unidades de usuário, como você deve ver no systemctl show-environment --user. Se você executou o último comando, ele deveria ter revelado o que você precisa fazer. Systemd (pelo menos em meus sistemas) define a variável de ambiente USERpara o nome de usuário do usuário com o qual a unidade está sendo executada. Então mude sua linha ExecStart para /home/${USER}/folder/script.sh. Isso deve resolver. Observe também que eu não usei (& )... de acordo com as páginas de manual do systemd, isso não deveria ser necessário. As chaves ( {& }) estão lá caso, por algum motivo muito estranho, você tenha espaços em seus nomes de usuário. Você também pode usar ${HOME}/folder/script.shwhich funcionaria mesmo se o diretório inicial do usuário estivesse em algum lugar diferente de /home/.

informação relacionada