![¿Cómo puedo obtener $(logname) dentro del comando systemd exec?](https://rvso.com/image/170290/%C2%BFC%C3%B3mo%20puedo%20obtener%20%24(logname)%20dentro%20del%20comando%20systemd%20exec%3F.png)
Estoy escribiendo un servicio systemd ( /etc/systemd/system/name.service
). Este servicio ejecuta un script colocado en ~/folder/script.sh
. No puedo usarlo ~/
dentro del ExecStart
comando, así que lo uso /home/$(logname)/folder/script.sh
pero no funciona.
Respuesta1
Systemd opera a un nivel inferior que su entorno de shell. Con esto quiero decir que cuando ejecuta un comando, normalmente es un proceso hijo de su entorno de shell, que es un proceso hijo de su demonio de inicio (systemd en este caso). Eso significa que las unidades systemd no ven ni obedecen su entorno de shell ni macros de shell como ~
. Cualquier variable de entorno configurada en archivos como ~/.profile
o ~/.bashrc
no se aplica. Ver quéhaceaplicar puedes escribir el comando systemctl show-environment
. En mis sistemas (Ubuntu Server y Arch) eso es PATH
y LANG
. Más informaciónaquí.
Todo esto también es válido (más o menos) para las unidades de usuario... pero systemd mantiene un entorno un poco más robusto para las unidades de usuario, como debería ver con systemctl show-environment --user
. Si ejecutó ese último comando, debería haber revelado lo que necesita hacer. Systemd (al menos en mis sistemas) establece la variable de entorno USER
en el nombre de usuario del usuario con el que se ejecuta la unidad. Así que cambie su línea ExecStart a /home/${USER}/folder/script.sh
. Deberias hacer eso. También tenga en cuenta que no utilicé (
& )
... según las páginas del manual de systemd, esto no debería ser necesario. Las llaves ( {
& }
) están ahí en caso de que, por alguna razón muy extraña, tenga espacios en sus nombres de usuario. También podría utilizar ${HOME}/folder/script.sh
el cual funcionaría incluso si el directorio de inicio del usuario se encuentra en otro lugar que no sea /home/
.