¿Cómo puedo obtener $(logname) dentro del comando systemd exec?

¿Cómo puedo obtener $(logname) dentro del comando systemd exec?

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 ExecStartcomando, así que lo uso /home/$(logname)/folder/script.shpero 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 ~/.profileo ~/.bashrcno se aplica. Ver quéhaceaplicar puedes escribir el comando systemctl show-environment. En mis sistemas (Ubuntu Server y Arch) eso es PATHy 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 USERen 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.shel cual funcionaría incluso si el directorio de inicio del usuario se encuentra en otro lugar que no sea /home/.

información relacionada