รันสคริปต์ทุก ๆ 30 นาทีด้วย systemd


20

ฉันต้องการรันสคริปต์ทุก ๆ 30 นาทีหลังจากบูตเข้าสู่ระบบ ฉันรู้ว่าคุณสามารถใช้ cron ได้ แต่ฉันไม่ได้วางแผนที่จะใช้คุณสมบัตินี้บ่อยครั้งดังนั้นฉันจึงอยากลองใช้กับ systemd

จนถึงตอนนี้ฉันเพิ่งพบตัวจับเวลาแบบโมโนโทนิกซึ่งช่วยให้สามารถเรียกใช้บางสิ่งได้ครั้งเดียว (อย่างน้อยฉันก็คิดอย่างนั้น) จะเป็นอย่างไรfoo.timerและfoo@user.serviceดูเหมือนว่าในกรณีที่ฉันต้องการที่จะดำเนินการบางอย่างทุก 30 นาทีจากการบูต / ระบบเริ่มต้น?

foo@user.service

[Unit]
Description=run foo
Wants=foo.timer

[Service]
User=%I
Type=simple
ExecStart=/bin/bash /home/user/script.sh

foo.timer

[Unit]
Description=run foo

[Timer]
where I am stuck... ???

คำตอบ:


26

คุณต้องสร้างไฟล์สองไฟล์: ไฟล์หนึ่งสำหรับบริการและอีกไฟล์สำหรับตัวจับเวลาที่มีชื่อเดียวกัน

ตัวอย่าง:

/etc/systemd/system/test.service

[Unit]
Description=test job

[Service]
Type=oneshot
ExecStart=/bin/bash /tmp/1.sh

/etc/systemd/system/test.timer

[Unit]
Description=test

[Timer]
OnUnitActiveSec=10s
OnBootSec=10s

[Install]
WantedBy=timers.target

หลังจากนั้นโหลด systemd อีกครั้งโดยใช้คำสั่งsystemctl daemon-reloadและเริ่มจับเวลาของคุณsystemctl start test.timerหรือเปิดใช้งานตามค่าเริ่มต้น

เนื้อหาทดสอบของ 1.sh

#!/bin/bash
echo `date` >> /tmp/2

และคำสั่งเพื่อตรวจสอบตัวจับเวลาที่มีอยู่ทั้งหมด: systemctl list-timers --all

ข้อมูลรายละเอียดเพิ่มเติมเกี่ยวกับหน้าโครงการและตัวอย่างในหน้า ArchLinux


systemd ยอมรับสคริปต์และอยู่ในรายการ แต่ไม่มีอะไรเกิดขึ้น
TomTom

อันไหน? ควรมีสองสคริปต์หนึ่งตัวจับเวลาและบริการอื่น เวลาเมื่อพวกเขาได้รับการดำเนินการอาจจะมีการตรวจสอบโดยคำสั่งรายการนับข้อผิดพลาดที่เป็นไปได้อาจจะมีการตรวจสอบโดยsystemctl status test.timerและsystemctl status test.servicecomamand
Reishin

1
โปรดใช้systemctl list-timers --allคำสั่งและตรวจสอบผลลัพธ์ เขาต้องการที่จะเป็นเช่นนี้ ดูหน่วยซ้ายและคอลัมน์ที่ผ่าน หากมีตัวจับเวลาอยู่โปรดดูที่ไฟล์บริการของคุณและตรวจสอบข้อผิดพลาดที่นั่นเนื่องจากตัวจับเวลาทำงานตามปกติ
Reishin

1
ไม่คำถามหลัก coz ไม่ได้ถามอะไรเกี่ยวกับ "ส่งแจ้งเตือน" และฉันคิดว่าเราไม่ควรผสมสองสิ่งที่แตกต่างกันเมื่อหัวข้อดังกล่าว มีอยู่แล้ว ในกรณีของคุณลองเพิ่มexport DISPLAY=:0.0สคริปต์
Reishin

1
PS: ตาม man systemd.timer the Persistent = true มีผลกับการกำหนดค่าด้วย OnCalendar (เช่น wallclock)
snyh

11

นี่คือตัวเลือกอื่นโดยไม่ต้องใช้ตัวจับเวลา หากเวลาไม่สำคัญอย่างยิ่งยวดและสคริปต์ก็ทำงานไม่นานมันจะดีสำหรับสิ่งที่เรียบง่าย

[Unit]
Description=Run foo

[Service]
User=%I
Restart=always
RestartSec=1800s
ExecStart=/bin/bash /home/user/script.sh

2
ฉันชอบวิธีนี้ ข้อเสียเปรียบหลักประการเดียวคือบันทึกของระบบจะเต็มไปด้วยบันทึก "การเริ่มต้น <service X>" ถ้าคุณเริ่มต้นใหม่บ่อยครั้ง (เช่นทุก ๆ 30 วินาที) ณ จุดนี้มันอาจจะดีกว่าที่จะใช้บริการเป็น daemon แทนการเริ่มบริการใหม่ซ้ำแล้วซ้ำอีกจาก systemd
jersey bean

นั่นเป็นเรื่องจริง สำหรับการทำงานที่รวดเร็วและง่ายดาย แต่ตัวจับเวลาหรือสคริปต์ที่รันนานจะเป็นทางออกที่ดีกว่า
Matt H
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.