Mengapa systemd memberi tahu gagal layanan saya jika saya menjalankan skrip dengan sudo
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
Baca man sudo sudoers
dan gunakan sudo -E
untuk meneruskan seluruh rangkaian variabel lingkungan Anda.