![Como posso obter $(logname) dentro do comando systemd exec?](https://rvso.com/image/170290/Como%20posso%20obter%20%24(logname)%20dentro%20do%20comando%20systemd%20exec%3F.png)
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 ExecStart
comando então uso /home/$(logname)/folder/script.sh
mas 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 ~/.profile
ou ~/.bashrc
não se aplicam. Para ver o quefazapply você pode digitar o comando systemctl show-environment
. Nos meus sistemas (Ubuntu Server e Arch) isso é PATH
e 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 USER
para 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.sh
which funcionaria mesmo se o diretório inicial do usuário estivesse em algum lugar diferente de /home/
.