Mengapa systemd memberi tahu gagal layanan saya jika saya menjalankan skrip dengan sudo

Aug 20 2020

Saya membuat layanan systemd yang perlu menjalankan skrip bash dengan sudo privs. Saya perhatikan bahwa ketika saya menjalankannya, hang selamanya dalam "status = Activating".

Untuk mencoba menirunya, saya menyiapkan contoh mainan. Saya memiliki unit systemd yang akan menjalankan skrip bash yang berjalan lama dan sangat sederhana yang melakukan systemd_notify segera dan kemudian berulang selamanya. Saya menjalankan skrip dengan sudo. Namun, layanan gagal memulai dan saya mendapatkan kesalahan ini:

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

Ketika saya menghapus sudo di depan perintah, itu berfungsi dengan baik! misalnya ExecStart = / home / psengupta / long_test.sh

Mengapa menggunakan sudo sebelum menjalankan skrip long_test.sh benar-benar gagal dalam layanan saya? Saya tidak begitu akrab dengan hal ini dan tidak yakin mengapa $ NOTIFY_SOCKET tidak diatur dengan penggunaan perintah sudo. Idealnya, saya ingin mengatur dan menjalankan skrip dengan sudo dan memberi tahu ketika dimulai.

Jawaban

waltinator Aug 20 2020 at 22:05

Baca man sudo sudoersdan gunakan sudo -Euntuk meneruskan seluruh rangkaian variabel lingkungan Anda.