Saya melihat solusi di sini yang tampak elegan, meski agak berputar-putar. Ide utamanya adalah membuat layanan sekali pakai yang dipicu oleh pengatur waktu yang memulai ulang lainnya melayani.
Untuk pengatur waktu:
[Unit]
Description=Do something daily
[Timer]
OnCalendar=daily
Persistent=true
[Install]
WantedBy=timers.target
Untuk layanan sekali pakai:
[Unit]
Description=Restart service
[Service]
Type=oneshot
ExecStart=/usr/bin/systemctl try-restart my_program.service
Untuk layanan sekali pakai di Ubuntu 16.04 LTS:
[Unit]
Description=Restart service
[Service]
Type=oneshot
ExecStart=/bin/systemctl try-restart my_program.service
Solusi ini memungkinkan Anda memanfaatkan pengatur waktu systemd, termasuk kemampuan untuk memulai ulang layanan pada waktu tertentu dalam sehari, dan tidak hanya setelah beberapa waktu berlalu.
Untuk versi systemd>=229, ada opsi bernama RuntimeMaxSec
, yang menghentikan layanan setelah berjalan selama jangka waktu tertentu.
misalnya Untuk memulai ulang setiap 7 hari:
[Service]
Restart=always
RuntimeMaxSec=7d
Bagi saya ini tampak lebih elegan daripada menyalahgunakan Type=notify
dan WatchdogSec
.
systemd menyediakan cara bersih untuk menambah dan mengganti arahan dalam file unit systemd yang disediakan oleh vendor. Unit Drop-In dijelaskan dalam man systemd.unit. Misalnya, jika Anda ingin me-restart layanan foo yang disediakan oleh sebuah paket secara berkala, Anda akan membuat file bernama /etc/systemd/system/foo.service.d/periodic-restart.conf
. Isinya akan seperti yang ditunjukkan di atas. Lalu:
systemctl daemon-reload
systemctl restart foo
Anda dapat mengonfirmasi bahwa unit Drop-In telah dimuat karena akan dilaporkan dalam output status:
systemctl status
Terakhir, Anda dapat mengonfirmasi bahwa direktif telah disertakan dengan menelusuri systemctl show
keluaran:
systemctl show foo.service | grep RuntimeMax
Direktif dilaporkan oleh systemctl show
akan menjadi "RuntimeMaxUSec`