เหตุใด systemd จึงแจ้งให้บริการของฉันล้มเหลวหากฉันเรียกใช้สคริปต์ด้วย sudo

Aug 20 2020

ฉันกำลังสร้างบริการ systemd ที่ต้องใช้ bash script ด้วย sudo privs ฉันสังเกตว่าเมื่อเรียกใช้มันจะแฮงค์ตลอดไปใน "status = Activating"

เพื่อพยายามทำซ้ำฉันตั้งค่าตัวอย่างของเล่น ฉันมียูนิต systemd ที่จะรันสคริปต์ bash ที่รันเป็นเวลานานที่เรียบง่ายซึ่งทำ systemd_notify ทันทีแล้ววนซ้ำตลอดไป ฉันเรียกใช้สคริปต์ด้วย sudo อย่างไรก็ตามบริการไม่สามารถเริ่มต้นได้และฉันได้รับข้อผิดพลาดนี้:

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

เมื่อฉันลบ sudo ที่อยู่หน้าคำสั่งมันก็ใช้ได้ดี! เช่น ExecStart = / home / psengupta / long_test.sh

เหตุใดการใช้ sudo ก่อนที่จะเรียกใช้สคริปต์ long_test.sh จึงทำให้บริการของฉันล้มเหลว ฉันไม่ค่อยคุ้นเคยกับสิ่งนี้มากนักและไม่แน่ใจว่าทำไม $ NOTIFY_SOCKET จึงไม่ถูกตั้งค่าด้วยการใช้คำสั่ง sudo ตามหลักการแล้วฉันต้องการตั้งค่าและเรียกใช้สคริปต์ด้วย sudo และแจ้งให้ทราบเมื่อเริ่มต้น

คำตอบ

waltinator Aug 20 2020 at 22:05

อ่านman sudo sudoersและใช้sudo -Eเพื่อส่งผ่านตัวแปรสภาพแวดล้อมทั้งหมดของคุณไปพร้อมกัน