Perché systemd notifica il fallimento del mio servizio se eseguo script con sudo

Aug 20 2020

Sto creando un servizio systemd che deve eseguire uno script bash con sudo privs. Ho notato che quando lo eseguo, si blocca per sempre in "status = Activating".

Per provare a replicarlo, ho impostato un esempio di giocattolo. Ho un'unità systemd che eseguirà uno script bash molto semplice e di lunga durata che esegue immediatamente un systemd_notify e poi si ripete per sempre. Eseguo lo script con sudo. Tuttavia, il servizio non si avvia e ricevo questo errore:

Aug 20 14:21:48 ip-10-110-103-202 systemd[1]: Starting "Testing"...
Aug 20 14:21:49 ip-10-110-103-202 sudo[24772]: No status data could be sent: $NOTIFY_SOCKET was not set
Aug 20 14:21:49 ip-10-110-103-202 systemd[1]: test.service: Main process exited, code=exited, status=1/FAILURE

test.service:

[Unit]
Description="Testing"
Requires=network-online.target
After=network-online.target

[Service]
Type=notify
User=consul
Group=consul
ExecStart=/usr/bin/sudo /home/psengupta/long_test.sh

[Install]
WantedBy=multi-user.target

long_test.sh:

!/usr/bin/env bash
set -euo pipefail

systemd-notify --ready --status="Started"
while true
do
        echo "Press CTRL+C to stop the script execution"
        # Enter your desired command in this block.
done

Quando rimuovo il sudo davanti al comando, funziona bene! es. ExecStart = / home / psengupta / long_test.sh

Perché l'utilizzo di sudo prima di eseguire lo script long_test.sh in realtà non funziona correttamente? Non ho molta familiarità con queste cose e non sono sicuro del motivo per cui $ NOTIFY_SOCKET non è impostato con l'utilizzo del comando sudo. Idealmente, vorrei impostarlo ed eseguire lo script con sudo e notificare quando viene avviato.

Risposte

waltinator Aug 20 2020 at 22:05

Leggere man sudo sudoerse utilizzare sudo -Eper passare l'intero set di variabili di ambiente.