ฉันคิดว่าการตั้งค่า 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
สคริปต์เป็นรูท