Score:0

หน่วยดรอปอิน systemd, ExecStartPre เป็นผู้ใช้รูท, ExecStart เป็นผู้ใช้ที่กำหนดเอง

ธง ru

ฉันมีบริการเว็บที่ทำงานโดยใช้ systemd บริการนี้ทำงานโดยผู้ใช้ของตัวเอง และฉันต้องการดำเนินการคำสั่ง ExecStartPre แต่ทำงานในฐานะผู้ใช้รูท รายละเอียดเพิ่มเติม:

เช่น /lib/systemd/system/webservice.service

[หน่วย]
ต้องการ=network-online.target
After=network-online.target

[บริการ]
EnvironmentFile=/etc/default/web
Group=ผู้ใช้เว็บ
ประเภท = ง่าย
รีสตาร์ท = เมื่อล้มเหลว
WorkingDirectory=/usr/share/web
RuntimeDirectory=เว็บ
RuntimeDirectoryMode=0750
ExecStart=/usr/sbin/web --config=/etc/web/config.ini                               

[ติดตั้ง]
WantedBy=multi-user.target

และฉันต้องการมีบริการดรอปอินที่ดึงไฟล์ config.ini จากเว็บซอร์ส

เช่น /etc/systemd/system/web.service.d/local.conf

[บริการ]
PermissionsStartOnly=จริง
รีสตาร์ทวินาที=5
EnvironmentFile=/etc/environment
ExecStartPre=+/usr/bin/curl http://some.url --output /etc/web/config.ini 
ExecStartPre=+chown web:web /etc/web/config.ini  

การกำหนดค่าด้านบนใช้งานไม่ได้เนื่องจากบริการของฉันค้างระหว่างการเริ่มต้นโดยไม่มีข้อความในบันทึกใดๆ มีวิธีใดบ้างที่ฉันสามารถทำสิ่งนั้นให้ใช้งานได้?

Andrew Lowther avatar
jp flag
การกำหนดค่าที่คุณโพสต์เป็นไปตามที่คุณต้องการหรือไม่ ฉันไม่สามารถบอกได้ว่าคุณต้องการความช่วยเหลือในการทำงานหรือไม่ หากคุณต้องการทราบว่ามีวิธีที่สะอาดกว่านี้หรือไม่
ru flag
คุณพูดถูก ฉันเปลี่ยนคำถามใหม่
Score:0
ธง jp

ฉันคิดว่าการตั้งค่า systemd ของคุณถูกต้อง หากเครื่องหยุดทำงานเมื่อคุณเริ่มบริการ ฉันจะสงสัยว่า ExecStartPre คำสั่งไม่ออก

ฉันรันคำสั่งต่อไปนี้ในฐานะรูทบนเซิร์ฟเวอร์ Ubuntu 20.04 เพื่อทดสอบการตั้งค่าบริการที่คล้ายกัน

สร้างผู้ใช้บริการ

useradd -- ระบบ myservice

สร้างสคริปต์สำหรับบริการที่บันทึกผู้ใช้ว่าสคริปต์กำลังทำงานและวนซ้ำ

แมว <<'EOF' > /usr/local/bin/myservice.sh
#!/usr/bin/env ทุบตี

# อาร์กิวเมนต์แรกคือจำนวนลูป ค่าเริ่มต้นเป็นอนันต์
ฉัน=${1:--1}
ในขณะที่ :; ทำ
  วันที่ >> ${RUNTIME_DIRECTORY:-/tmp}/run.log
  whoami >> ${RUNTIME_DIRECTORY:-/tmp}/run.log
  (( --i == 0 )) && ทำลาย
  นอน ${SLEEP:-60}
เสร็จแล้ว
อฟ

เพิ่มไฟล์บริการและไฟล์แทนที่

แมว <<EOF > /etc/systemd/system/myservice.service
[หน่วย]
คำอธิบาย=บริการของฉัน

[บริการ]
EnvironmentFile=-/etc/default/myservice
ประเภท = ง่าย
ผู้ใช้=บริการของฉัน
Group=บริการของฉัน
รีสตาร์ท = เมื่อล้มเหลว
RuntimeDirectory=บริการของฉัน
RuntimeDirectoryMode=0750
ExecStart=/bin/bash /usr/local/bin/myservice.sh
อฟ

mkdir -p /etc/systemd/system/myservice.service.d/
แมว <<EOF > /etc/systemd/system/myservice.service.d/override.conf
[บริการ]
PermissionsStartOnly=จริง
ExecStartPre=/bin/bash /usr/local/bin/myservice.sh 1
ExecStartPre=chown myservice.myservice /run/myservice/run.log
อฟ

systemctl daemon-โหลดซ้ำ

เริ่มบริการ

systemctl เริ่ม myservice.service

ผลเป็นไปตามคาด เดอะ run.log ไฟล์แสดงสคริปต์ที่รันครั้งเดียวเป็น ราก แล้ววิ่งต่อไปเป็น บริการของฉัน ผู้ใช้บริการจนกว่าจะหยุดให้บริการ

root@ubuntu:~# ls -al /run/myservice/
รวม 4
drwxr-x--- 2 myservice myservice 60 ก.พ. 27 18:23 น.
drwxr-xr-x 30 รูท 1080 27 ก.พ. 18:23 ..
-rw-r--r-- 1 myservice myservice 73 ก.พ. 27 18:23 น. run.log
root@ubuntu:~# cat /run/myservice/run.log
อา. 27 ก.พ. 18:23:14 UTC 2022
ราก
อา. 27 ก.พ. 18:23:14 UTC 2022
บริการของฉัน
อา. 27 ก.พ. 18:24:14 UTC 2022
บริการของฉัน

ฉันพบว่าถ้า ExecStartPre คำสั่งเข้าสู่ลูปจากนั้นเทอร์มินัลจะหยุดทำงานเมื่อบริการเริ่มทำงาน นั่นอาจอธิบายได้ว่าทำไมคุณถึงคิดว่าบริการของคุณหยุดทำงาน เดอะ ExecStartPre คำสั่งอาจยังคงทำงานอยู่หรืออาจไม่สามารถดำเนินการให้เสร็จสิ้นได้

หมายเหตุอื่น ๆ

  • ฉันพบว่าใช้อย่างใดอย่างหนึ่ง PermissionsStartOnly=จริง หรือ ExecStartPre=+... มีผลเช่นเดียวกันกับการเรียกใช้ ExecStartPre สคริปต์เป็นรูท

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา