Cara menjadwalkan tugas dengan timer SystemD di Linux

Cara menjadwalkan tugas dengan timer SystemD di Linux

Cara tradisional untuk menjadwalkan tugas di Linux, adalah dengan menggunakan daemon cron, menentukan interval waktu dan
Perintah untuk dieksekusi dalam crontab.

SystemD, sistem init yang relatif baru sekarang diadopsi oleh semua distribusi Linux utama, di antara yang lain, memberikan kemampuan untuk menjadwalkan tugas menggunakan khusus unit, ditelepon pengatur waktu. Dalam artikel ini kita akan belajar bagaimana mereka terstruktur dan beberapa contoh penggunaannya.

Dalam tutorial ini Anda akan belajar:

  • Struktur dasar timer SystemD;
  • Cara membuat timer monotonik dan realtime;
  • Cara mendaftar dan memeriksa timer aktif;
  • Cara mengaktifkan pengatur waktu;
  • Cara menggunakan timer sementara;


Persyaratan dan konvensi perangkat lunak yang digunakan

Persyaratan Perangkat Lunak dan Konvensi Baris Perintah Linux
Kategori Persyaratan, konvensi atau versi perangkat lunak yang digunakan
Sistem Distribusi-independen
Perangkat lunak Systemd
Lainnya Pengetahuan tentang konsep SystemD dasar
Konvensi # - mensyaratkan perintah linux yang diberikan untuk dieksekusi dengan hak istimewa root baik secara langsung sebagai pengguna root atau dengan menggunakan sudo memerintah
$ - mensyaratkan perintah Linux yang diberikan untuk dieksekusi sebagai pengguna biasa

Penggunaan dasar



Menjadwalkan tugas melalui SystemD melibatkan penggunaan dua jenis unit yang berbeda: pengatur waktu Dan jasa. Yang pertama adalah file unit dengan .timer Ekstensi: Di ​​dalamnya, kami menentukan jadwal pekerjaan dan mengatur unit layanan yang harus dipicu. Yang terakhir adalah jenis unit yang paling umum: mereka digunakan untuk mendefinisikan layanan pada distribusi Linux modern dan diidentifikasi oleh .melayani perpanjangan.

Kami menggunakan unit layanan untuk mengatur perintah yang sebenarnya untuk dieksekusi (jika Anda tidak terbiasa dengan konsep SystemD dasar, Anda mungkin ingin melihat artikel kami tentang layanan SystemD).

Bergantung pada bagaimana jadwal dibuat, timer dapat:

  1. Monoton
  2. Waktu sebenarnya

Pengatur waktu monotonik

Systemd menyediakan daftar kata kunci yang dapat kita gunakan di unit timer untuk menjadwalkan pelaksanaan tugas sejumlah waktu tertentu setelah acara yang telah ditentukan terjadi. Kata kunci harus digunakan di [Timer] Bagian dari unit timer.

Mari kita lihat mereka dan jelaskan artinya:



Kata kunci Arti
Onactivesec Jadwalkan tugas relatif hingga saat unit timer itu sendiri diaktifkan
Onbootsec Jadwalkan tugas relatif ke waktu boot sistem
Onstartupsec Jadwalkan tugas relatif sampai saat Systemd dimulai
Onunitactivesec Jadwalkan tugas relatif ke terakhir kali unit layanan aktif
OnunitinActiveSec Jadwalkan tugas relatif ke terakhir kali unit layanan tidak aktif

Karena dapat dengan mudah ditebak dari nama tombol, "detik" digunakan sebagai unit waktu default. Namun, kami dapat menentukan unit yang berbeda setelah nilai (e.G. 15m - lima belas menit). Seperti yang akan kita lihat nanti, kata kunci dapat digabungkan di dalam unit timer.

Timer waktu nyata

Suatu acara juga dapat dijadwalkan dalam istilah "absolut", mirip dengan bagaimana kita akan mendefinisikannya melalui cron, menggunakan yang lain Oncalendar kata kunci dan pengkodean waktu yang diizinkan.

Berikut beberapa contoh:



Spesifikasi waktu Penjelasan
Rabu 18:00:00 Tugas akan dieksekusi setiap hari Rabu pukul 18:00
Senin… Rabu *-5-27 Tugas tersebut akan dieksekusi pada tanggal 27 Mei setiap tahun, tetapi hanya pada hari -hari dari Senin hingga Rabu
2020-05-27 Tugas akan dieksekusi pada tanggal 27 Mei tahun 2020 pukul 00:00:00
Thu, Fri 2020-*-1,5 11:12:13 Tugas akan dieksekusi pada 11:12:13 dari hari pertama dan kelima setiap bulan tahun 2020, tetapi hanya jika hari itu adalah hari Kamis atau hari Jumat
*: 0/2 Tugas akan dieksekusi setiap dua menit mulai dari menit 0
15/2 Tugas akan dieksekusi setiap dua jam mulai dari jam 3 sore
per jam Tugas akan dieksekusi pada awal setiap jam
sehari-hari Tugas akan dieksekusi setiap hari pukul 00:00:00
mingguan Tugas akan dieksekusi setiap hari Senin pukul 00:00
bulanan Tugas akan dieksekusi pada hari pertama setiap bulan pukul 00:00

Hari kerja, jika ditentukan, harus dalam bahasa Inggris, baik di Formulir Singkat (Rabu) atau Lengkap (Rabu) (kasusnya tidak masalah).

Kami dapat memberikan daftar nilai waktu menggunakan , karakter dan tentukan berbagai nilai menggunakan .. . A * Karakter cocok dengan nilai apapun. Lebih banyak contoh dapat ditemukan berkonsultasi Systemd.waktu Berkasingan.

Mendaftarkan timer aktif

Untuk mendaftar semua yang aktif unit timer Dalam sistem kami, kami dapat meluncurkan daftar waktu Sub -perintah Systemctl. Kecuali --semua Opsi diteruskan ke perintah, hanya timer aktif yang termasuk dalam hasilnya. Berikut adalah contoh output yang dihasilkan oleh perintah:

$ Systemctl List-Timers BERIKUTNYA KIRI TERAKHIR LULUS SATUAN Aktif Sun 2020-01-19 19:36:06 CET 5H 15 Mnt tersisa Sabtu 2020-01-18 10:38:59 CET 1 hari 3H lalu Systemd-tmpfiles-clean.timer systemd-tmpfiles-clean.Layanan Senin 2020-01-20 00:00:00 CET 9H Left Sun 2020-01-19 00:00:16 CET 14H lalu Man-db.pengatur waktu man-db.Layanan Senin 2020-01-20 00:00:00 CET 9H Left Sun 2020-01-19 00:00:16 CET 14H lalu Shadow.Bayangan Timer.melayani 

Laporannya sangat rinci. Ini termasuk 6 kolom, yang menjelaskan, secara berurutan:

  1. Lain kali timer akan berjalan (BERIKUTNYA);
  2. Berapa kali sebelum timer lain akan berjalan lagi (KIRI);
  3. Terakhir kali pengatur waktu berlari (TERAKHIR);
  4. Berapa kali telah berlalu sejak terakhir kali pengatur waktu berjalan (LULUS);
  5. Itu Unit Timer di mana jadwal ditetapkan (SATUAN);
  6. Itu Unit Layanan diaktifkan oleh timer (Aktif).


Contoh Dunia Nyata

Mari kita periksa man-db.timer timer. Untuk memeriksa unit, kita dapat menggunakan SystemCTL dan kucing Sub -perintah:

$ Systemctl Cat Man-DB.timer

Inilah definisi timer:

[Unit] description = Daily Man-DB Regeneration Documentation = Man: MandB (8) [Timer] Oncalendar = Daily Accuracysec = 12H persisten = true [install] wantedby = timer.target 

Hal pertama yang bisa kita perhatikan adalah [Satuan] bait, yang umum untuk semua jenis unit systemd. Di sini digunakan untuk memberikan deskripsi unit: kita dapat melihat bahwa timer digunakan untuk melakukan "regenerasi harian man-db".

Namun, bagian yang paling menarik bagi kami [Timer]. Bait ini khusus untuk unit timer: di situlah jadwal didefinisikan. Itu Oncalendar Kata kunci digunakan untuk mengatur a sehari-hari jadwal waktu nyata.

Kami juga dapat mengamati dua kata kunci lainnya digunakan: Accuracysec Dan Gigih. Yang pertama digunakan untuk membangun penundaan maksimum di mana layanan dapat diluncurkan. Dalam hal ini nilainya 12h, jadi perintahnya bisa ditunda selama maksimal 12 jam. Nilai default untuk Accuracysec adalah 1 menit; akurasi terbaik diperoleh dengan 1ns Notasi (1 nanodetik).



Kata kunci lainnya, Gigih, mengambil nilai boolean: jika diatur ke true, terakhir kali layanan dipicu oleh timer disimpan ke disk. Jika karena alasan apa pun, menjalankan yang dijadwalkan terlewatkan, kali berikutnya unit timer diaktifkan, layanan ini diluncurkan segera, jika pada waktu yang berlalu itu akan dipicu setidaknya sekali. Ini bisa berguna, misalnya, untuk menjalankan jadwal yang terlewatkan karena sistem yang ditenagai, lain kali mesin ditenagai.

Dengan melihat lebih dekat pada definisi timer, kita dapat melihat bahwa layanan yang akan dipicu tidak disebutkan secara eksplisit: ketika ini terjadi, SystemD mencari unit layanan dengan nama timer yang sama (jadi dalam kasus ini man-db.melayani). Untuk merujuk unit layanan secara eksplisit, kita harus menggunakan Satuan kata kunci.

Mengaktifkan timer

Mengaktifkan timer cukup sederhana. Yang harus kita lakukan adalah menempatkannya, bersama dengan layanan harus dipicu, di dalam /etc/systemd/system direktori. Dengan semua file di tempat, kami menjalankan:

$ sudo systemctl mulai .timer

Untuk membuat timer diaktifkan secara otomatis saat boot (atau ketika target spesifik lainnya tercapai), yang harus kita lakukan adalah memastikannya memiliki [Install] bait, di mana kami menentukan kapan aktivasi harus terjadi.

Dalam contoh di atas Dicari Kata kunci digunakan untuk menetapkan ketergantungan terbalik (lemah) dari unit target tertentu (pengatur waktu.target - Target yang dicapai cukup awal dalam proses boot) pada unit timer yang kami konfigurasi: Sebelum target itu tercapai, unit kami harus diaktifkan.

Pengatur waktu sementara

Dimungkinkan untuk menjadwalkan pelaksanaan tugas "dengan cepat", tanpa secara manual membuat timer dan unit layanan khusus dengan menggunakan Systemd-Run. Perintah tersebut menciptakan unit sementara (mereka tidak akan selamat dari reboot) di dalam /run/systemd/transient direktori jika dijalankan secara global, dan di dalam /run/user // systemd/transient direktori jika diluncurkan sebagai pengguna tertentu (--pengguna pilihan).

Mari kita lihat contohnya. Misalkan kita ingin tanggal dan waktu untuk dicatat ke file setiap menit. Kami akan menjalankan:

$ systemd-run --user --on-calendar '*: 0/1'/bin/sh -c "tanggal >> ~/log.txt "menjalankan timer sebagai unit: run-r81a4fef38154401bbd8cdbd1e5c19d04.timer akan menjalankan layanan sebagai unit: run-r81a4fef38154401bbd8cdbd1e5c19d04.melayani 

Seperti yang dapat kita lihat dari output perintah, dua unit sementara telah dibuat, run-r81a4fef38154401bbd8cdbd1e5c19d04.timer Dan run-r81a4fef38154401bbd8cdbd1e5c19d04.melayani.

Jika kita memeriksa file log, kita dapat melihat bahwa timer berfungsi dengan benar:

$ cat ~/log.txt mon 20 Jan 2020 11:20:54 pagi cet mon 20 Jan 2020 11:21:54 pagi cet mon 20 Jan 2020 11:22:54 CET Mon 20 Jan 2020 11:23:54 AM CET MON 20 Jan 2020 11 : 24: 54 pagi CET Mon 20 Jan 2020 11:25:54 AM CET MON 20 Jan 2020 11:26:54 CET 

Untuk menghapus/menonaktifkan a pengatur waktu sementara, Yang harus kita lakukan adalah menghentikannya. Dalam hal ini kami akan menjalankan:

$ Systemctl-Pengguna Stop Run-R81A4FEF38154401BBD8CDBD1E5C19D04.timer

Kesimpulan

Dalam tutorial ini kami belajar bagaimana kami dapat menjadwalkan tugas sistem menggunakan timer SystemD sebagai alternatif untuk cronjobs. Kami melihat struktur dasar di balik timer, bagaimana kami dapat mendefinisikan jadwal monotonik dan realtime melalui kata kunci khusus, seperti Onbootsec atau Oncalendar, Cara mendaftar dan memeriksa pengatur waktu aktif, cara mengaktifkan dan menonaktifkannya.

Akhirnya, kami melihat cara menggunakan pengatur waktu sementara. Di artikel ini Anda harus menemukan semua yang Anda butuhkan untuk memulai dengan timer. Namun, untuk informasi lebih rinci yang Anda inginkan, untuk melihat dokumentasi resmi, baik online atau dengan berkonsultasi Systemd.timer Berkasingan.

Tutorial Linux Terkait:

  • Hal -hal yang harus diinstal pada ubuntu 20.04
  • Pengantar Otomatisasi Linux, Alat dan Teknik
  • Hal -hal yang harus dilakukan setelah menginstal ubuntu 20.04 FOSSA FOSSA Linux
  • Cara membuat pekerjaan cron di kubernetes
  • Mint 20: Lebih baik dari Ubuntu dan Microsoft Windows?
  • Hal -hal yang harus dilakukan setelah menginstal ubuntu 22.04 Jammy Jellyfish…
  • Unduh Linux
  • Cara menjalankan perintah secara berkala dengan anacron di linux
  • File Konfigurasi Linux: 30 Teratas Paling Penting
  • Ubuntu 20.04 trik dan hal -hal yang mungkin tidak Anda ketahui