Score:3

เหตุใดตัวจับเวลา systemd ของฉันจึงทำงานเพียงครั้งเดียวเมื่อยูนิตเป็นเป้าหมาย

ธง jp

ฉันมีบริการสองสามอย่าง (ตัวสร้างไซต์คงที่) ที่ฉันต้องการเรียกใช้เป็นประจำจากตัวจับเวลา systemd เดียวกัน ฉันพบ คำถาม/คำตอบนี้ซึ่งครอบคลุมสิ่งที่ฉันต้องการทำทุกประการ และอธิบายถึงการตั้งค่าโดยก .เป้า ไฟล์นั้น ต้องการ= บริการหลายอย่างถูกเรียกใช้โดยตัวจับเวลาที่สอดคล้องกัน ฟังดูดี แต่ฉันพบว่าเมื่อฉันตั้งค่านี้จริง ๆ มันจะทริกเกอร์เท่านั้น ครั้งหนึ่งแล้วปิดตัวเอง!

ฉันได้เตรียมตัวอย่างการทำงานขั้นต่ำ (สิ่งนี้ไม่ได้เรียกใช้บริการหลายรายการ แต่แสดงให้เห็นถึงปัญหาเดียวกัน):

จับเวลาทดสอบ.จับเวลา:

[หน่วย]
คำอธิบาย=ตัวจับเวลาการทดสอบ

[ตัวจับเวลา]
ในปฏิทิน=*-*-* *:*:30
Unit=test-timer.target

[ติดตั้ง]
WantedBy=timers.target

ทดสอบ-timer.target:

[หน่วย]
คำอธิบาย=หน่วยเป้าหมาย
ต้องการ = test-timer.service
After=test-timer.service

[ติดตั้ง]
WantedBy=timers.target

ทดสอบจับเวลาบริการ:

[หน่วย]
คำอธิบาย=เรียกใช้การทดสอบ

[บริการ]
ExecStart=/usr/bin/bash -c "วันที่ --rfc-3339='วินาที' >> /tmp/test-timer-output"

[ติดตั้ง]
ยัง=test-timer.target

เปิดใช้งานตัวจับเวลา:

$ sudo cp ตัวจับเวลาการทดสอบ * /etc/systemd/system/
$ sudo systemctl enable -- ตอนนี้ test-timer.timer
สร้าง symlink /etc/systemd/system/timers.target.wants/test-timer.timer â /etc/systemd/system/test-timer.timer

จากนั้นเมื่อฉันดูผลลัพธ์ของ ตัวจับเวลารายการ systemctl --allก่อนการวิ่งครั้งแรกที่ฉันได้รับ (ไม่สนใจตัวจับเวลาอื่น):

ถัดไป ซ้าย หน่วยสุดท้ายที่ผ่านไป เปิดใช้งาน
ศ. 2021-10-08 10:38:30 EDT เหลืออีก 21 วินาที n/a n/a test-timer.timer test-timer.target

หลังจากการวิ่งครั้งแรก ต่อไป และ ซ้าย ถูกแทนที่ด้วย ไม่มี:

ถัดไป ซ้าย หน่วยสุดท้ายที่ผ่านไป เปิดใช้งาน
n/a n/a ศุกร์ 2021-10-08 10:38:32 EDT 1 นาที 5 วินาทีที่แล้ว test-timer.timer test-timer.target

ฉันได้ลองเพิ่ม ถาวร = จริง ไปที่ ทดสอบ-timer.target และเปิดใช้งานอย่างชัดเจน ทดสอบ-timer.targetแต่สิ่งเหล่านี้ไม่ได้ผล เมื่อไหร่ก็ตามที่ฉันทำ systemctl รีสตาร์ท test-timer.timerมันจะรีสตาร์ท แต่เรียกการทำงานเพียงครั้งเดียว จากนั้นจะไม่ทำงานอีก

ถ้าฉันลบเลเยอร์ของทางอ้อมโดยเปลี่ยน หน่วย= สายของ จับเวลาทดสอบ.จับเวลา ถึง Unit=test-timer.serviceบริการกระตุ้นตัวเองอย่างมีความสุขทุกนาทีตามที่คาดไว้

ฉันขาดการกำหนดค่าหรือขั้นตอนการติดตั้งบางอย่างหรือไม่

Score:3
ธง jp

หลังจากได้รับความช่วยเหลือบน Twitter ฉันสามารถแก้ไขปัญหานี้ได้ ปัญหาคือ systemd จับเวลา จะเปิดใช้งานเฉพาะบริการที่ไม่ได้ใช้งาน และลักษณะการทำงานเริ่มต้นสำหรับ เป้า คือการเปิดใช้งานและใช้งานอยู่เว้นแต่จะมีบางอย่างทำให้มันดับลง (ไม่ผูกติดอยู่กับอายุการใช้งานของยูนิตนั้นๆ ต้องการ=). เพื่อบังคับให้ยูนิตเป้าหมายไม่ทำงานถ้า ใดๆ ของบริการที่เปิดใช้งานจะไม่ใช้งาน ใช้ BindsTo= แทนที่ ต้องการ= ในตัวอย่างของฉันด้านบน ดังนั้นสำหรับตัวอย่างขั้นต่ำนี้:

ทดสอบ-timer.target:

[หน่วย]
คำอธิบาย=หน่วยเป้าหมาย
BindsTo=test-timer.service
After=test-timer.service

[ติดตั้ง]
WantedBy=timers.target

ทดสอบจับเวลาบริการ:

[หน่วย]
คำอธิบาย=เรียกใช้การทดสอบ

[บริการ]
ExecStart=/usr/bin/bash -c "วันที่ --rfc-3339='วินาที' >> /tmp/test-timer-output"

[ติดตั้ง]
ยัง=test-timer.target

จากนั้นคุณจะเห็นได้ทันทีว่า ทดสอบจับเวลาบริการ วิ่งเสร็จแล้ว ทดสอบ-timer.target ก็จะกลายเป็น ไม่ได้ใช้งาน (และทำให้ตัวจับเวลาสามารถเปิดใช้งานได้อีกครั้ง):

$ sudo systemctl list-units --all test-timer.target test-timer.service
  หน่วย โหลด แอคทีฟ คำอธิบายย่อย
  test-timer.service โหลดการทดสอบการเรียกใช้ที่ตายแล้วที่ไม่ได้ใช้งาน   
  test-timer.target โหลดหน่วยเป้าหมายที่ตายแล้วที่ไม่ได้ใช้งาน

ในขณะที่ก่อนที่จะมีการเปลี่ยนแปลง เป้าหมายยังคงทำงานอยู่หลังจากที่บริการเสียชีวิต:

$ sudo systemctl list-units --all test-timer.target test-timer.service
  หน่วย โหลด แอคทีฟ คำอธิบายย่อย
  test-timer.service โหลดการทดสอบการเรียกใช้ที่ตายแล้วที่ไม่ได้ใช้งาน   
  โหลด test-timer.target ใช้งานอยู่ ใช้งานอยู่ หน่วยเป้าหมาย
za flag
Dagnabbit คุณพบวิธีแก้ปัญหาก่อนที่ฉันจะสามารถโพสต์ได้ :-)
karlsebal avatar
in flag
โดยเฉพาะอย่างยิ่งเมื่อคุณมีบริการหลายอย่างที่เรียกใช้โดยเป้าหมาย และพวกเขาทั้งหมดเป็นบริการเดียว คุณอาจใช้ `StopWhenUnneeded=True` สิ่งนี้จะทำให้เป้าหมายไม่ทำงานหลังจากทำงานเสร็จแล้ว
ma flag
ดูเหมือนว่า `StopWhenUnneeded=` ทำงานได้ดีกว่า `BindsTo=` อย่างหลัง ฉันพบข้อผิดพลาด `xxx.target: ผูกไว้กับหน่วย yyy.service แต่หน่วยไม่ทำงาน' เมื่อใดก็ตามที่เป้าหมายถูกเปิดใช้งาน

โพสต์คำตอบ

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