sistemd

Cron Generasi Berikutnya Dengan systemd Membuat Timer

Cron Generasi Berikutnya Dengan systemd Membuat Timer
Apakah Anda perlu menjadwalkan beberapa tugas di masa mendatang di komputer Anda?? Ini mungkin terlihat sederhana - setelah semua, mesin pencuci piring Anda dapat menunggu sebelum diluncurkan dengan bantuan tombol - tetapi terkadang komputer membuat tugas-tugas sederhana seperti itu sangat sulit.Tetapi jika Anda memiliki latar belakang tertentu, Anda mungkin pernah mendengarnya cron, perangkat lunak ini sepenuhnya didedikasikan untuk meluncurkan tugas yang tepat pada waktu yang tepat. Tapi alat ini benar-benar telah dirancang dengan kesederhanaan dalam pikiran dan Anda mungkin pada akhirnya memiliki kejutan yang buruk.Jika Anda pernah berhasil menjadwalkan tugas di Windows, Anda telah menggunakan Windows Task Planner. Itu memang memiliki GUI secara default tetapi tidak membuatnya begitu mudah digunakan juga: kedua sistem ini hanya meluncurkan proses pada waktu dan tanggal yang tetap.

Untuk memahami bagaimana systemd dapat membantu Anda di sana, saya akan mengambil contoh.

Jebakan apa yang akan dihindari oleh pengatur waktu systemd Anda?

Jika Anda pernah memiliki mesin dengan data yang Anda pedulikan di dalamnya, Anda pasti ingin memiliki salinan data Anda di tempat lain yang mungkin lebih aman. Jika Anda mengelola server, itu wajib: lagi pula, bagaimana Anda akan memulihkan jika hard disk Anda gagal dan mencegah Anda memulihkan data apa pun?

Jadi sebagai orang yang bertanggung jawab, Anda menyiapkan cadangan setiap minggu atau setiap hari. Anda dapat mengaturnya menggunakan cron, Anda menjadwalkannya pada jam 4:24 pagi, tetapi di sini masalahnya dimulai: bagaimana jika server Anda dimatikan dari jam 4:10 pagi hingga 4:30 pagi karena alasan apa pun?

Yah, kemungkinan cron hanya akan melewatkan cadangan itu. Ini mungkin penting jika itu sering terjadi dan diam-diam atau jika kode Anda bergantung pada fakta bahwa kode itu berjalan dan mungkin gagal jika tidak. Umumnya ini terjadi ketika Anda mengatur tugas pembersihan melalui cron dan tidak diluncurkan. Tiba-tiba kode Anda mungkin tidak memiliki cukup ruang untuk melanjutkan dan akan rusak - sungguh menyedihkan, situasi yang sangat menyedihkan, benar Tuan Elton John.

Namun, jika peluncuran yang terlewat bisa menjadi masalah, bayangkan satu detik - wow, John Lennon sekarang? - bahwa tugas Anda terlalu lambat. Jika tugas Anda diatur untuk berjalan setiap 10 menit tetapi membutuhkan waktu 15 menit untuk diselesaikan, cron atau Windows akan dengan senang hati meluncurkan tugas lain meskipun tugas saat ini belum selesai - jadi, Anda akan memiliki 2 contoh tugas yang berjalan secara bersamaan , yang merupakan resep yang sempurna untuk bencana. Ketika sebuah program berjalan secara bersamaan saat tidak dirancang untuk melakukannya, kemungkinan besar akan merusak file, perangkat lunak lain, database - dan server Anda tiba-tiba menjadi kapal yang tenggelam seperti Titanic.

Oke, mungkin saya terlalu jauh dengan Titanic tetapi Anda mengerti get. Meskipun systemd tidak bisa berbuat banyak untuk menyelamatkan kapal ini, ini dapat membantu Anda dengan semua kekurangan ini dan memastikan Anda mendapatkan liburan Natal yang lebih lama berkat bug yang akan menghindari Anda. Saatnya sekarang untuk mengetahui cara mengatur timer systemd.

Cara menjadwalkan pencadangan server otomatis?

Pertama-tama, pengatur waktu systemd memicu layanan systemd, jadi sebelum menjadwalkan tugas Anda, Anda harus menjadikannya layanan terlebih dahulu. Untungnya, saya telah menulis panduan untuk membuat layanan systemd, cara ini akan memperkenalkan Anda dengan cara kerja systemd. Anda harus membacanya sebelum melanjutkan. Kecuali jika Anda persis tahu apa yang Anda lakukan, file layanan systemd Anda seharusnya tidak berisi pengaturan WantedBy= apa pun. Jika Anda ingin memulai layanan Anda pada waktu tertentu, Anda mungkin tidak ingin memulainya saat boot.

Berkat sistem layanan systemd, tidak mungkin menjalankan beberapa contoh tugas Anda secara tidak sengaja: jika tugas sudah berjalan, itu hanya akan melewati peluncuran itu dan membiarkan tugas yang sedang berjalan menyelesaikan tugasnya.

Setelah Anda memiliki layanan systemd untuk dijadwalkan, buat file dengan nama file yang sama dengan layanan Anda kecuali yang harus diakhiri dengan .pengatur waktu bukannya .layanan. Dalam contoh pencadangan otomatis kami, layanan akan menjadi pencadangan otomatis.layanan dan pengatur waktu akan menjadi cadangan otomatis.pengatur waktu. Kedua file harus berada di direktori yang sama. Seperti yang saya katakan di artikel layanan systemd, saya menyarankan Anda untuk menulis file-file ini di tempat normal seperti direktori home Anda dan kemudian, salin ke folder systemd, setelah Anda selesai mengedit.

Jadi, izinkan saya menunjukkan kepada Anda seperti apa file timer kami:

[Satuan]
Description=Jadwalkan pencadangan selama jam sibuk
[Pengatur Waktu]
PadaCalendar=*-*-* 03:00:00
RandomizedDelaySec=7200
gigih = benar
[Install]
WantedBy=pengatur waktu.target

Sama seperti di layanan systemd, ada 3 bagian. [Unit] atau [Instal] bekerja persis sama seperti yang dijelaskan dalam artikel layanan systemd saya. Harap dicatat bahwa WantedBy= penting di sini karena penghitung waktu dapat dimulai atau dihentikan, jadi jika Anda tidak memberi tahu systemd untuk memulai penghitung waktu saat boot, itu tidak akan pernah dipicu. pengatur waktu.target adalah target systemd khusus untuk pengatur waktu.

Sekarang, bagian [Timer]. Di dalamnya, Anda akan menemukan semua pengaturan yang terkait dengan kapan timer harus dipicu. Untuk pencadangan otomatis kami, saya telah memberi tahu systemd untuk menjalankannya antara jam 3 pagi dan jam 5 pagi di zona waktu server. Waktu yang tepat adalah acak pada setiap hari.

OnCalendar= menyetel penghitung waktu yang terkait dengan waktu server Anda (jam dinding), seperti setiap hari Minggu pukul 1 siang. Jika Anda telah menggunakan cron sebelumnya, Anda harus benar-benar akrab dengan sintaks ini. Namun memiliki beberapa manfaat tambahan added.

Misalnya, jika Anda ingin sesuatu terjadi setiap jam, Anda dapat melakukan seperti ini:

PadaCalendar=setiap jam

dan setiap hari:

PadaCalendar=harian

Bahkan, ini mendukung semua nilai berikut:

  1. teliti
  2. per jam
  3. harian
  4. bulanan
  5. mingguan
  6. tahunan
  7. triwulanan
  8. Tengah tahunan

Namun ada masalah dengan kata kunci ini: misalnya, pemicu harian selalu tengah malam, yang sering kali merupakan jam sibuk dalam sistem komputasi. Itu sebabnya disarankan untuk menggunakan RandomizedDelaySec= (penggunaannya ditentukan di bawah). Pokoknya untuk cadangan itu bukan pilihan yang baik: tengah malam bukan di luar jam sibuk, melainkan sebaliknya. Jadi kita perlu mengatur lebih akurat ketika kita ingin melihat tugas itu diluncurkan.

Jika Anda ingin kontrol lebih, Anda dapat menulis tanggal seperti 2018-12-06 12:49:37. Nah jika Anda spesifik, Anda hanya akan memicu timer sekali trigger. Untuk membuatnya berulang, Anda akan mengganti salah satu elemen ini dengan * asterisk.

PadaCalendar=*-*-* 03:00:00

Seperti yang Anda lihat di atas, dalam contoh cadangan kami, semua bagian tanggal adalah *-*-*, artinya harus terjadi setiap hari setiap bulan setiap tahun. Sekarang jika Anda melakukannya:

PadaCalendar=*-12-25 03:00:00

Kemudian berjalan setiap tanggal 25 Desember jam 3 pagi. Pengatur waktu sistem yang sempurna untuk Santa Claus - bahkan jika saya ragu dia akan membutuhkannya! Jadi asterisk menambahkan pengulangan di tempat Anda meletakkannya. Jika Anda memasukkannya ke dalam bidang tahun, itu berarti "setiap tahun", dll.

Terakhir, Anda dapat menambahkan UTC di akhir baris untuk menggunakan waktu UTC alih-alih zona waktu lokal. Misalnya, beberapa layanan menyetel ulang kuota API mereka pada tengah malam tetapi untuk menghindari bias zona waktu, layanan ini menggunakan UTC. Jadi untuk tugas seperti itu, Anda akan melakukan:

OnCalendar=UTC harian

Sekarang, mari selesaikan masalah lain: jam sibuk. systemd juga memiliki pengaturan untuk melawan itu.

RandomizedDelaySec= memungkinkan untuk menunda tugas dalam waktu yang acak. Nilainya adalah jumlah detik maksimum yang akan ditunda oleh timer. Ini secara khusus ditujukan untuk kasus seperti itu. Anda ingat bahwa di systemd, setiap hari selalu memicu di tengah malam? Yah, mingguan selalu memicu pada Senin tengah malam, dan pemicu tahunan pada 1 Januari tengah malam, salah satu puncak terburuk tahun ini dengan pemadaman jaringan di mana-mana. Anda tentu tidak ingin hal itu terjadi.

Dengan menambahkan penundaan, Anda menghapus masalah itu: itu akan secara otomatis menunda tugas Anda pada waktu yang tidak diketahui. Keacakan di sini penting karena jauh lebih mungkin terjadi bahkan ketika itu acak dan beban yang merata memungkinkan untuk lebih mengoptimalkan tugas Anda.

Katakanlah Anda perlu menjalankan tugas Anda sekitar jam 7 pagi untuk pagi hari tetapi Anda ingin membiarkan penundaan kecil maksimal 15 menit, Anda akan melakukan seperti ini:

RandomizedDelaySec=900

Itu seharusnya cukup untuk penundaan. Terkadang penundaan milidetik pun cukup untuk mencegah lonjakan yang tidak diinginkan.

Persistent= menangani pemicu timer yang terlewat. Bagaimana jika server Anda dimatikan pada malam hari?? Yah, cadangan tidak akan pernah terpicu sama sekali. Menyetelnya ke true memungkinkan systemd menjalankannya pada boot berikutnya dalam kasus seperti itu. Dengan cara ini Anda tahu dengan satu atau lain cara, tugas pengatur waktu akan dijalankan. Penggunaannya sederhana, Anda cukup melakukan ini:

gigih = benar

Namun ini memiliki satu kelemahan yang sangat sulit untuk dihindari: ketika banyak tugas dari penghitung waktu yang berbeda terlewatkan, semuanya akan berjalan saat boot dan memperlambat boot itu. Menurut saya itu jauh lebih baik daripada tidak pernah berjalan dan toh itu normal, saat yang paling tepat untuk menjalankan timer adalah ketika dijadwalkan, setelah itu mungkin tidak tepat pula.

OnBootSec= adalah opsi terakhir yang akan saya tunjukkan (tetapi tidak sedikit). Itu jika Anda ingin memicu penghitung waktu beberapa saat setelah boot alih-alih berdasarkan kalender. Misalnya, jika Anda perlu memeriksa startup jika server Anda dimulai dengan benar dan berfungsi sebagaimana mestinya, Anda dapat menulis layanan pemeriksaan dan menggunakan pengaturan timer itu untuk memicunya setelah sistem memiliki cukup waktu untuk boot.

Katakanlah sistem membutuhkan 3 menit untuk boot, Anda dapat melakukan:

OnBootSec=180

Dan terlepas dari namanya, Anda juga dapat melakukan:

OnBootSec=3 menit

Jika Anda tepat OnBootSec= dan OnCalendar=, itu akan memulai layanan setiap kali salah satu dari 2 peristiwa ini terjadi.

Oke, sekarang saatnya menyimpan file Anda, salin ke folder sistem jika Anda mengikuti saran saya di atas, dan uji apakah timer Anda berfungsi dengan baik.

Aktifkan timer dan pemantauan baru Anda

Untuk menguji timer baru Anda, Anda harus memberi tahu systemd bahwa Anda menambahkan timer baru, jadi Anda perlu mengetikkan perintah ini:

$ sudo systemctl daemon-reload

Sekarang, systemd akan memperhitungkan penghitung waktu baru Anda dan melihat dari dekat kapan harus menjalankan tugas Anda. Karena systemd selalu berjalan, ini adalah salah satu kandidat terbaik untuk mengelola dan menjalankan tugas terjadwal Anda.

Satu hal yang mungkin Anda temukan berlawanan dengan intuisi: pengatur waktu secara default dinonaktifkan. Untuk mengaktifkannya, Anda perlu melakukan perintah ini:

$ sudo systemctl aktifkan --sekarang pencadangan otomatis.pengatur waktu

Anda mungkin ingin melihat apakah penghitung waktu Anda berfungsi seperti yang diharapkan. Kabar baik: systemd bahkan cukup baik untuk memiliki perintah yang memberi tahu Anda kapan terakhir diluncurkan dan kapan peluncuran berikutnya dijadwalkan (kecuali jika timer diatur untuk berjalan hanya saat boot, karena systemd tidak tahu kapan sistem akan boot lagi, tentu saja). Inilah perintah itu:

$ systemctl status pencadangan otomatis.pengatur waktu

Terakhir, ketika Anda tidak lagi membutuhkan timer, Anda juga dapat menonaktifkannya:

$ sudo systemctl nonaktifkan --sekarang pencadangan otomatis.pengatur waktu

Kesimpulan

Menggunakan pengatur waktu systemd, manajemen tugas terjadwal Anda ke tingkat berikutnya: jujur, saya pribadi merasa tugas terjadwal seharusnya seperti ini sejak bertahun-tahun.

Oh, satu kejutan kecil untuk Anda: semua pengatur waktu systemd masuk dalam sistem yang terstruktur dengan baik dengan pemfilteran, rotasi log, dan sejenisnya. Jadi saya mengundang Anda untuk melihat bagaimana Anda dapat melihat log tentang tugas terjadwal Anda!

5 Game Arkade Terbaik untuk Linux
Saat ini, komputer adalah mesin serius yang digunakan untuk bermain game. Jika Anda tidak bisa mendapatkan skor tinggi baru, Anda akan tahu apa yang s...
Pertempuran Untuk Wesnoth 1.13.6 Pengembangan Dirilis
Pertempuran Untuk Westnoth 1.13.6 dirilis bulan lalu, adalah rilis pengembangan keenam dalam 1.13.x series dan memberikan sejumlah peningkatan, teruta...
Cara Menginstal League Of Legends di Ubuntu 14.04
Jika Anda adalah penggemar League of Legends, maka ini adalah kesempatan bagi Anda untuk menguji coba League of Legends. Perhatikan bahwa LOL didukung...