Jalankan skrip setiap 30 menit dengan systemd

20

Saya ingin menjalankan skrip setiap 30 menit setelah boot ke sistem. Saya tahu Anda dapat menggunakan cron, tetapi saya tidak berencana untuk menggunakan fitur ini sering karena itu saya ingin mencobanya dengan systemd.

Sejauh ini saya hanya menemukan timer monoton yang memungkinkan untuk mengeksekusi sesuatu sekali (setidaknya saya pikir begitu). Bagaimana foo.timerdan [email protected]kelihatannya seandainya saya ingin menjalankan sesuatu setiap 30 menit sejak boot / sistem dimulai?

[email protected]

[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... ???
TomTom
sumber

Jawaban:

26

Anda perlu membuat dua file: satu untuk layanan, lainnya untuk timer dengan nama yang sama.

contoh:

/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

setelah itu memuat ulang systemd menggunakan perintah systemctl daemon-reloaddan memulai timer Anda dengan systemctl start test.timer, atau mengaktifkannya secara default.

konten pengujian 1.sh

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

Dan perintah untuk memeriksa semua timer yang tersedia: systemctl list-timers --all

Info lebih rinci tentang halaman proyek dan contoh-contoh di halaman ArchLinux

Reishin
sumber
systemd menerima skrip dan terdaftar, namun tidak ada yang terjadi
TomTom
yang mana? harus ada dua skrip, satu penghitung waktu dan layanan lainnya. Waktu, ketika mereka dieksekusi dapat diperiksa oleh perintah list-timer, Kemungkinan kesalahan bisa diperiksa oleh systemctl status test.timerdan systemctl status test.servicecomamand
Reishin
1
silakan gunakan systemctl list-timers --allperintah dan periksa output. Dia harus seperti ini . Lihat ke unit, kolom kiri dan berlalu. Jika penghitung waktu ada, lihat file layanan Anda dan periksa bug di sana karena penghitung waktu bekerja dengan normal.
Reishin
1
tidak, karena pertanyaan utama tidak bertanya apa-apa tentang "kirim-kirim" dan saya pikir kita tidak boleh mencampur dua hal yang berbeda ketika topik tersebut sudah ada. dalam kasus Anda, coba tambahkan export DISPLAY=:0.0ke skrip.
Reishin
1
ps: menurut man systemd.timer Persistent = true hanya berpengaruh pada konfigurasi dengan OnCalendar (mis. wallclock)
snyh
11

Berikut ini pilihan lain tanpa menggunakan timer Anda. Jika pengaturan waktu tidak terlalu kritis dan dan skrip tidak berjalan lama, itu akan baik untuk hal-hal sederhana.

[Unit]
Description=Run foo

[Service]
User=%I
Restart=always
RestartSec=1800s
ExecStart=/bin/bash /home/user/script.sh
Matt H
sumber
2
Saya suka solusi ini. Satu-satunya kelemahan utama adalah log sistem akan dibanjiri dengan log "Mulai <layanan X>" jika Anda sering memulai ulang (yaitu setiap 30 detik). Pada titik mana mungkin lebih baik menjalankan layanan sebagai daemon saja, daripada memulai kembali layanan berulang kali dari systemd.
kacang jersey
Itu benar. Untuk hal-hal cepat dan sederhana ini berfungsi. Tetapi timer atau skrip yang berjalan lama akan menjadi solusi yang lebih baik.
Matt H