Dalam systemd, apa perbedaan antara After = dan Membutuhkan =?

54

Saya membuat file .service systemd dan saya butuh bantuan untuk memahami perbedaan antara Requires=dan After=. The halaman manual mengatakan bahwa Requires="Mengkonfigurasi dependensi kebutuhan pada unit lain." dan After="Mengkonfigurasi ketergantungan pemesanan antar unit." Apa bedanya?

TomOnTime
sumber

Jawaban:

44

After=mengkonfigurasi pesanan layanan (lakukan X hanya setelah Y), sementara Requires=status dependensi. Jika Anda tidak menentukan pesanan, layanan tergantung pada yang lain akan dimulai pada saat yang sama dengan yang itu tergantung. Juga, cara saya memahaminya (walaupun saya tidak bisa mengujinya sekarang dan tidak menemukan referensi), After=adalah "kopling longgar", dan layanan dengan pernyataan seperti itu akan tetap berjalan jika yang disebutkan dalam After=baris tidak mulai sama sekali, sementara itu Require=akan mencegahnya dimulai jika persyaratan tidak terpenuhi.

Mengutip https://www.freedesktop.org/software/systemd/man/systemd.unit.html :

Membutuhkan =

Mengkonfigurasi dependensi persyaratan pada unit lain. Jika unit ini diaktifkan, unit yang tercantum di sini akan diaktifkan juga. Jika salah satu unit lainnya dinonaktifkan atau aktivasi gagal, unit ini akan dinonaktifkan. Opsi ini dapat ditentukan lebih dari sekali atau beberapa unit yang dipisahkan ruang dapat ditentukan dalam satu opsi di mana dependensi persyaratan kasus untuk semua nama yang terdaftar akan dibuat. Perhatikan bahwa dependensi persyaratan tidak memengaruhi urutan layanan dimulai atau dihentikan. Ini harus dikonfigurasikan secara independen dengan opsi After = atau Before =. Jika unit foo.service membutuhkan unit bar.service yang dikonfigurasikan dengan Membutuhkan = dan tidak ada pemesanan yang dikonfigurasi dengan After = atau Sebelum =, maka kedua unit akan dimulai secara bersamaan dan tanpa penundaan di antara mereka jika foo.service diaktifkan. Sering,

dan

Sebelum =, Setelah =

Daftar nama unit yang dipisahkan oleh spasi. Mengkonfigurasi ketergantungan pemesanan antar unit. Jika unit foo.service berisi pengaturan Before = bar.service dan kedua unit sedang dimulai, start-up bar.service ditunda hingga foo.service dimulai. Perhatikan bahwa pengaturan ini independen dan ortogonal dengan dependensi persyaratan yang dikonfigurasi oleh Membutuhkan =. Ini adalah pola umum untuk memasukkan nama unit dalam opsi After = dan Membutuhkan =, dalam hal ini unit yang terdaftar akan dimulai sebelum unit yang dikonfigurasi dengan opsi ini. Opsi ini dapat ditentukan lebih dari sekali, dalam hal ini dependensi pemesanan untuk semua nama yang tercantum dibuat. After = adalah kebalikan dari Before =, yaitu sementara After = memastikan bahwa unit yang dikonfigurasi dimulai setelah unit yang terdaftar selesai memulai, Before = memastikan yang sebaliknya, yaitu bahwa unit yang dikonfigurasikan sepenuhnya dimulai sebelum unit yang terdaftar dimulai. Perhatikan bahwa ketika dua unit dengan ketergantungan pemesanan di antara mereka dimatikan, kebalikan dari pesanan mulai diterapkan. yaitu jika suatu unit dikonfigurasikan dengan After = pada unit lain, yang pertama dihentikan sebelum yang kedua jika keduanya dimatikan. Diberikan dua unit dengan ketergantungan pemesanan di antara mereka, jika satu unit dimatikan dan yang lain dimulai, shutdown dipesan sebelum start-up. Tidak masalah jika ketergantungan pemesanan adalah Setelah = atau Sebelum =. Juga tidak masalah yang mana dari keduanya dimatikan, selama salah satu dimatikan dan yang lainnya mulai naik. Shutdown dipesan sebelum start-up dalam semua kasus. Jika dua unit tidak memiliki dependensi pemesanan di antara mereka, mereka dimatikan atau dijalankan secara bersamaan,

Sven
sumber
7
Apa itu ketergantungan jika bukan pernyataan pesanan? (Serius ... Saya tidak mengerti perbedaannya)
TomOnTime
Lihat hasil edit saya. Pemahaman saya: After=Xakan berarti "Lakukan ini setelah X jika X selesai", sementara Require=Xitu berarti "jangan lakukan ini sama sekali jika Anda tidak bisa melakukan X".
Sven
The Before=bagian dari halaman manual tampaknya untuk mengkonfirmasi hal ini. If a unit foo.service contains a setting Before=bar.service and both units are being started, bar.service's start-up is delayed until foo.service is started up Cara saya memahami itu, pemesanan tidak akan ditegakkan jika bar.servicetidak dimulai dan foo.serviceakan mulai secara normal.
Sven
10

Salah satu perbedaan utama adalah,

  • After hanya memeriksa apakah unit sudah diaktifkan, dan tidak secara eksplisit mengaktifkan unit yang ditentukan.
  • Unit yang terdaftar di Requiresdiaktifkan bersama dengan unit. Jika salah satu unit yang diperlukan gagal untuk memulai, unit tidak diaktifkan.

Anggap saya punya file unit test-app.service,

[Unit]
Description=test app
After=network-online.target

Inilah yang akan terjadi ketika pernyataan ini dieksekusi,

  • Aftermemeriksa apakah network-online.target.
  • jika network-online.targettidak dimulai, itu akan menunggu.
  • test-appdimulai hanya setelah network-online.targetaktif

Jika saya Requiressebaliknya,

[Unit]
Description=test app
Requires=network-online.target

Inilah yang akan terjadi ketika pernyataan ini dieksekusi,

  • network-online.targetdan test-appdiaktifkan bersama
  • jika network-online.targetgagal memulai test-apptidak akan diaktifkan.
Sufiyan Ghori
sumber
2

systemd adalah manajer pekerjaan. Halaman manual tidak begitu tepat tentang bagaimana segala sesuatu bekerja.

Ketika Anda boot, apa yang dilakukan systemd adalah membangun transaksi yang terdiri dari pekerjaan untuk pekerjaan anchor (yaitu memulai pekerjaan untuk default.target). Apa yang dilakukan semua dependensi dan hubungan ini adalah menentukan bagaimana dan pekerjaan apa yang akan dipicu. Memesan menentukan pekerjaan apa yang akan ditunggu oleh setiap pekerjaan lain. Oleh karena itu, default.target unit berada di pusat semua ini, itulah sebabnya ketika mengaktifkan unit Anda menggunakan dependensi terbalik yang melalui systemctl aktif membuat tautan simbolis filesystem yang menunjukkan dependensi maju yang dapat diikuti oleh systemd (juga mengapa Anda memerlukan symlink sistem file di tempat pertama). Mirip adalah ketika Anda secara manual memulai beberapa unit, maka unit itu adalah jangkar, dan transaksi dihitung dengan itu.

Tidak terlalu detail, saya akan menjelaskan apa yang Membutuhkan = dan Setelah = lakukan.

Membutuhkan = akan menyebabkan systemd untuk memicu pekerjaan awal untuk unit yang diperlukan ketika Anda mendapatkan pekerjaan awal yang dipicu (secara eksplisit, atau melalui ketergantungan: tidak ada perbedaan secara internal). Ini juga memiliki properti memicu stop job pada Anda ketika unit ini dihentikan (catatan: dihentikan, tidak turun sendiri) atau dimulai kembali. Ini berarti bahwa jika beberapa dependensi / systemctl menyebabkannya berhenti / restart, Anda juga akan berhenti / restart. Namun, jika turun sendiri, Anda tidak akan berhenti, karena tidak ada pekerjaan, dan perubahan negara terjadi tanpa keterlibatan systemd. Di situlah Anda akan menggunakan BindsTo = (mirip dengan unit perangkat, yang dapat menjadi tidak aktif tanpa keterlibatan systemd, untuk alasan yang jelas).

Sekarang, penggunaan Setelah = direkomendasikan karena Membutuhkan = sendiri adalah bersemangat untuk apa yang dilakukannya: membatalkan penerima jika pekerjaan awal gagal. Namun pembatalan ini hanya bekerja pada pekerjaan, yaitu jika unit lain tidak mendefinisikan pemesanan, systemd memicu keduanya secara paralel, dan jika pekerjaan awalnya selesai sebelum pekerjaan awal Anda gagal, itu tidak akan dibatalkan (tidak dapat dibatalkan, sebenarnya) . Penggunaan After = berarti bahwa pekerjaan lain terus menunggu sampai pekerjaan awal dari unit yang diperlukan selesai, dan tergantung pada hasilnya, jika gagal, pekerjaan mulai menunggu unit Anda dibatalkan dengan hasil pekerjaan JOB_DEPENDENCY (mengapa Anda menggunakan warna kuning [DEPEND] saat boot untuk kasus seperti itu). Oleh karena itu, efek pembatalan ini tidak dapat ditentukan tanpa menggunakan After =.

Inilah sebabnya mengapa menggunakan Wants = tanpa After = baik-baik saja jika Anda tidak ingin menunggu startup unit lain: karena tidak ada pembatalan di sana, jadi tidak ada balapan. Dalam hal ini, itu tidak lebih dari mekanisme sinkronisasi.

Selain itu, Anda juga dapat mengaktifkan keduanya saat boot, dan tidak memerlukan satu sama lain, dan hanya menentukan pemesanan, dalam hal ini, ketika keduanya ditarik sebagai bagian dari transaksi yang sama, mereka akan dipesan (atau jika pekerjaan untuk yang lain dipicu sementara pekerjaan untuk unit yang ingin ia jalankan setelah berjalan, ia akan lebih dulu menunggu untuk itu selesai, di seluruh transaksi).

Sekarang jika tidak ada pekerjaan, pemesanan tidak berpengaruh pada unit tersebut. Namun, biasanya ada pekerjaan, sebagai konsekuensi dari penggunaan dependensi seperti Membutuhkan = dan Mau =, atau keduanya ditarik pada suatu waktu dan menentukan beberapa pemesanan, dalam hal ini mereka menunggu pekerjaan unit lain.

Jonathan Kowalski
sumber