มีวิธีที่จะรู้ว่าเมื่อจับเวลา systemd จะทำงานต่อไปหรือไม่


19

ฉันกำลังทดสอบตัวจับเวลา systemd และพยายามแทนที่การหมดเวลาเริ่มต้น แต่ไม่สำเร็จ ฉันสงสัยว่ามีวิธีที่จะขอให้ systemd แจ้งให้เราทราบเมื่อบริการกำลังจะทำงานต่อไปหรือไม่

ไฟล์ปกติ ( /lib/systemd/system/snapbackend.timer):

# Documentation available at:
# https://www.freedesktop.org/software/systemd/man/systemd.timer.html

[Unit]
Description=Run the snapbackend service once every 5 minutes.

[Timer]
# You must have an OnBootSec (or OnStartupSec) otherwise it does not auto-start
OnBootSec=5min
OnUnitActiveSec=5min
# The default accuracy is 1 minute. I'm not too sure that either way
# will affect us. I am thinking that since our computers will be
# permanently running, it probably won't be that inaccurate anyway.
# See also:
# http://stackoverflow.com/questions/39176514/is-it-correct-that-systemd-timer-accuracysec-parameter-make-the-ticks-slip
#AccuracySec=1

[Install]
WantedBy=timers.target

# vim: syntax=dosini

ไฟล์แทนที่ ( /etc/systemd/system/snapbackend.timer.d/override.conf):

# This file was auto-generated by snapmanager.cgi
# Feel free to do additional modifications here as
# snapmanager.cgi will be aware of them as expected.
[Timer]
OnUnitActiveSec=30min

ฉันรันคำสั่งต่อไปนี้และตัวจับเวลายังคงทำเครื่องหมายทุกๆ 5 นาที มีข้อบกพร่องใน systemd หรือไม่?

sudo systemctl stop snapbackend.timer
sudo systemctl daemon-reload
sudo systemctl start snapbackend.timer

ฉันก็สงสัยเช่นกันฉันจะรู้ได้อย่างไรว่าตัวจับเวลาจะทำเครื่องหมายต่อไปเมื่อใด เพราะนั่นจะบอกฉันทันทีว่าใช้เวลา 5 นาที หรือ 30 นาที แต่จากที่systemctl status snapbackend.timerกล่าวมาไม่มีอะไรเกี่ยวกับเรื่องนั้น เพียงแค่สงสัยว่ามีคำสั่งที่จะบอกความล่าช้าที่ใช้ในปัจจุบันหรือไม่

สำหรับผู้ที่สนใจมีไฟล์บริการด้วย ( /lib/systemd/system/snapbackend.service) แม้ว่าฉันจะจินตนาการว่าสิ่งนี้ไม่ควรมีผลกับตัวนับเวลา ...

# Documentation available at:
# https://www.freedesktop.org/software/systemd/man/systemd.service.html

[Unit]
Description=Snap! Websites snapbackend CRON daemon
After=snapbase.service snapcommunicator.service snapfirewall.service snaplock.service snapdbproxy.service

[Service]
# See also the snapbackend.timer file
Type=simple
WorkingDirectory=~
ProtectHome=true
NoNewPrivileges=true
ExecStart=/usr/bin/snapbackend
ExecStop=/usr/bin/snapstop --timeout 300 $MAINPID
User=snapwebsites
Group=snapwebsites
# No auto-restart, we use the timer to start once in a while
# We also want to make systemd think that exit(1) is fine
SuccessExitStatus=1
Nice=5
LimitNPROC=1000
# For developers and administrators to get console output
#StandardOutput=tty
#StandardError=tty
#TTYPath=/dev/console
# Enter a size to get a core dump in case of a crash
#LimitCORE=10G

[Install]
WantedBy=multi-user.target

# vim: syntax=dosini

1
ผลลัพธ์ของsystemctl list-timersความช่วยเหลือหรือไม่?
phg

อา! การค้นหานั้นฉันพบหน้านี้พร้อมโซลูชัน: bbs.archlinux.org/viewtopic.php?id=214989ฉันจะเขียนคำตอบทันที
Alexis Wilke

คำตอบ:


25

สถานะของตัวนับที่ใช้งานในปัจจุบันสามารถแสดงได้โดยใช้ systemctl list-timers:

$ systemctl list-timers --all
NEXT                         LEFT     LAST                         PASSED       UNIT                         ACTIVATES
Wed 2016-12-14 08:06:15 CET  21h left Tue 2016-12-13 08:06:15 CET  2h 18min ago systemd-tmpfiles-clean.timer systemd-tmpfiles-clean.service

1 timers listed.

7

จากความคิดเห็นและคำตอบ @phg ฉันพบหน้าเว็บพร้อมคำตอบ ตัวจับเวลาเป็นแบบสะสมและคุณต้องรีเซ็ตเป็นครั้งแรกมิฉะนั้นรายการก่อนหน้าจะยังคงอยู่ สิ่งนี้มีประโยชน์สำหรับปฏิทิน แต่ใช้งานได้เหมือนกันกับตัวจับเวลาทั้งหมด

การมีหนึ่งรายการที่รีเซ็ตตัวจับเวลาก่อนที่จะเปลี่ยนเป็นค่าใหม่ทำงานตามที่คาดไว้:

# This file was auto-generated by snapmanager.cgi
# Feel free to do additional modifications here as
# snapmanager.cgi will be aware of them as expected.
[Timer]
OnUnitActiveSec=
OnUnitActiveSec=30min

1

ไม่ไม่มีวิธีที่จะดูว่าเมื่อตัวจับเวลาจะทำงานครั้งต่อไปหรือไม่ systemdข้อเสนอsystemctl list-timersและsystemctl status something.timer, แต่สิ่งเหล่านั้นไม่แสดงผลกระทบของAccuracySec=และแนวทางอื่น ๆ ที่อาจเปลี่ยนแปลงเวลา

หากคุณตั้งค่าAccuracySec=1hบนเซิร์ฟเวอร์สองเครื่องพวกเขาทั้งสองจะรายงานว่าตัวจับเวลาเดียวกันบนเซิร์ฟเวอร์ทั้งสองนั้นจะเริ่มทำงานในเวลาเดียวกัน แต่ในความเป็นจริงพวกเขาสามารถเริ่มต้นห่างกันได้ถึงหนึ่งชั่วโมง! หากคุณสนใจที่จะทราบว่าตัวจับเวลาแบบสุ่มสองตัวอาจชนกันหรือไม่ดูเหมือนว่าจะไม่มีทางที่จะตรวจสอบเวลาการทำงานสุดท้ายที่คำนวณได้เพื่อค้นหา

มีปัญหา systemd เปิดเพื่อให้ผลลัพธ์ของ list-timers ถูกต้องมากขึ้น / สับสนน้อยลง


จุดที่น่าสนใจเกี่ยวกับตัวนับ อย่างไรก็ตามข้อมูลที่เราได้รับlist-timersนั้นค่อนข้างดีที่จะเข้าใจว่าการใช้ตัวจับเวลาของคุณถูกต้องหรือไม่
Alexis Wilke

1
ไม่ใช่ในกรณีของฉัน ฉันต้องการใช้การกำหนดค่าเดียวกันที่แน่นอนบนโฮสต์คู่ แต่ใช้ AccuracySec = เพื่อให้แน่ใจว่าทั้งคู่ไม่ได้ทำการบำรุงรักษาพร้อมกัน ฉันต้องการที่จะดูว่าตัวจับเวลาจะยิงในแต่ละโฮสต์จริง ๆ แต่ไม่สามารถทำได้
Mark Stosberg

อา. ฉันมีปัญหาที่คล้ายกัน ฉันจะใช้ต้นแบบที่เลือก (โดยใช้ระบบลงคะแนน) และต้นแบบส่งข้อความ "ทำการบำรุงรักษา" ไปยังคอมพิวเตอร์ 1 เมื่อคอมพิวเตอร์ 1 เสร็จแล้วมันจะรายงานสถานะใหม่ไปยังต้นแบบซึ่งจะทำให้คอมพิวเตอร์ 2 ทำการบำรุงรักษา แน่นอนว่าคอมพิวเตอร์เครื่องใดเครื่องหนึ่งนั้นจะเป็นผู้เชี่ยวชาญ แต่รหัสที่ใช้งานลูปการบำรุงรักษาควรแยกจากการบำรุงรักษาจริง ปัญหาหนึ่งที่ต้องจำไว้ หากคลัสเตอร์ของคุณเติบโตขึ้นเล็กน้อยโปรดจำไว้ว่าต้องใช้เวลาและอาจนานจนคอมพิวเตอร์บางเครื่องไม่ได้รับการอัปเดตเป็นเวลานาน!
Alexis Wilke
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.