Cara terbaik untuk membuat kait shutdown?

9

Karena Ubuntu bergantung pada pemula baru untuk beberapa waktu sekarang, saya ingin menggunakan pekerjaan pemula untuk mematikan aplikasi tertentu dengan baik pada shutdown sistem atau reboot. Sangat penting bahwa sistem shutdown atau reboot macet sampai aplikasi ini dimatikan.

Aplikasi akan dimulai secara manual pada kesempatan tertentu, dan pada sistem shutdown secara otomatis harus diakhiri dengan skrip (yang sudah saya miliki). Karena aplikasi tidak dapat berakhir andal tanpa (hampir semua) layanan lain berjalan, mengakhiri aplikasi harus dilakukan sebelum sisa shutdown dimulai.

Saya pikir saya bisa menyelesaikan ini dengan pekerjaan pemula yang akan dipicu pada shutdown, tapi saya tidak yakin acara mana yang harus saya gunakan dengan cara apa. Sejauh ini, saya telah membaca pernyataan (sebagian kontradiksi) berikut:

  • Tidak ada acara shutdown umum di pemula
  • Gunakan bait seperti start on starting shutdowndalam definisi pekerjaan
  • Gunakan bait seperti start on runlevel [06S]dalam definisi pekerjaan
  • Gunakan bait seperti start on starting runlevel [06S]dalam definisi pekerjaan
  • Gunakan bait seperti start on stopping runlevel [!06S]dalam definisi pekerjaan

Dari rekomendasi ini, muncul pertanyaan-pertanyaan berikut:

  • Apakah ada atau tidak ada acara shutdown umum di pemula Ubuntu?
  • Apa cara yang disarankan untuk menerapkan "shutdown hook"?
  • Kapan acara runlevel [x] dipicu; apakah ini ketika memasuki runlevel atau ketika memasuki runlevel?
  • Bisakah kita menggunakan sesuatu seperti start on starting runlevel [x]atau start on stopping runlevel [x]?
  • Apa yang akan menjadi solusi terbaik untuk masalah saya?

Terima kasih banyak

Binarus
sumber

Jawaban:

2

startingdan runlevelmerupakan acara yang terpisah, sehingga Anda tidak dapat mengatakannya dengan bermakna starting runlevel N.

The runlevel Nevent dipancarkan pada awal memasuki runlevel. Jika Anda start on runlevel Nkemudian tugas Anda berjalan saat masuk. Cara menjalankan ketika entri ke runlevel selesai adalah run on started rc RUNLEVEL=N.

Seperti yang saya pahami, Anda perlu start on runlevel [06S]melakukan apa yang Anda inginkan; harus secara teori dijalankan sebelum hal lain dihentikan. Untuk kontrol yang lebih halus Anda dapat menggunakan start on stopping apache or stopping mysql or ...sehingga tugas Anda berjalan sebelum salah satu dari mereka diizinkan untuk dimatikan.


Diedit untuk mengubah runlevel 5 menjadi S.

geekosaurus
sumber
1
Selain itu, satu-satunya alasan ada startupacara khusus adalah bahwa sesuatu diperlukan untuk "mengolah pompa". Setelah satu peristiwa istimewa dikirim, semua yang lain bisa, dan, ditentukan oleh pekerjaan dan tugas yang dipicu oleh startup. Karena tidak ada satu shutdownperistiwa tunggal , ada terlalu banyak jenis yang berbeda shutdownuntuk menjadi bermakna. Lebih baik bergantung langsung pada pekerjaan yang harus Anda jalankan.
geekosaur
Terima kasih banyak. Saya dengan penuh terima kasih menerima balasan Anda karena menjawab pertanyaan saya dan menyelesaikan masalah. Namun demikian, saya punya pertanyaan / komentar tambahan (yang tidak berhubungan dengan masalah, meskipun): AFAIK, itu adalah tujuan pemula untuk mengganti konsep runlevel sepenuhnya. Fakta bahwa kita perlu bergantung pada runlevel untuk mendapatkan hook shutdown global yang bertentangan dengan tujuan ini. Saya pikir pemula harus memperkenalkan acara seperti itu. Saya jelas memahami bahwa akan lebih baik untuk bergantung pada pekerjaan yang benar-benar kita butuhkan, tetapi di sisi lain, dalam kasus saya, itu adalah sejumlah pekerjaan ... lanjut ...
Binarus
(hampir semua yang berjalan), dan saya bahkan tidak berani berpikir untuk mencari tahu hubungan antara proses yang berjalan di kotak (ps -Alf) dan pekerjaan yang mengendalikan proses ini; pasti tidak ada hubungan 1: 1. Ada pekerjaan yang tidak terkait dengan proses apa pun (mengkonfigurasi jaringan, misalnya), dan saya kira ada cukup proses yang tidak terkait dengan pekerjaan dan terutama ketika memulai sesuatu secara manual.
Oli
Pemula menggantikan runlevel hardcoded ; sejauh yang saya dapat menentukan, konsep runlevel tidak hilang, itu hanya didefinisikan di userspace sekarang. Jika Anda khawatir tentang jangka panjang, maka Anda ingin menggunakan saran terakhir saya menjalankan on stopping servicea or stoping serviceb or ...untuk layanan apa pun yang Anda butuhkan untuk berjalan.
geekosaur
-1 untuk beberapa ketidakakuratan. Jelas, ini tidak akan berhasil. berhenti di mulai rc RUNLEVEL = [016] tidak berbeda dengan frun 'stop on runlevel [016]'. Ini karena tidak ada peristiwa yang akan memblokir shutdown dari proses. Ada juga sintaks yang tidak valid, karena 'run on' tidak valid. Semua ini hanya membingungkan masalah, itu tidak benar-benar membantu. Maaf sudah terlambat! Hanya meninjau jawaban lama.
SpamapS
2

Untuk menghentikan penghentian proses saat pekerjaan Anda berhenti, Anda harus menggunakan ini:

stop on starting rc RUNLEVEL=[016]

Ini akan berfungsi karena hal pertama yang terjadi ketika Anda mengetik 'shutdown' adalah tunlevel 0 dipancarkan. rc dimulai pada runlevel, dan transisi dari berhenti -> mulai akan memblokir sepenuhnya sampai setiap pekerjaan yang juga harus mengubah keadaan menyelesaikan kondisi itu.

Anda harus memastikan bahwa proses Anda merespons dengan cepat terhadap SIGTERM. Jika tidak merespons dalam 5 detik, pemula akan mengirimkannya SIGKILL. Anda dapat meningkatkannya dengan 'kill timeout X'.

Angka 1 di sana, btw sedikit rumit, Anda harus memastikan bahwa permulaan Anda mencakup sesuatu yang dimulai pada runlevel [2345] pada saat itu, sehingga pengguna yang turun untuk pemeliharaan mode pengguna tunggal mendapatkan pekerjaan mereka mulai lagi. Untungnya banyak pekerjaan telah dilakukan untuk membuat ini seperti yang disarankan pada awal

start on runlevel [2345]

Juga dalam beberapa kasus Anda membutuhkan sesuatu untuk terus berjalan hingga jaringan diturunkan (seperti dbus / network-manager). Untuk itu kamu mau

stop on deconfiguring-networking

Itu adalah peristiwa yang dipancarkan kemudian di shutdown yang juga akan diblokir sampai pekerjaan apa pun yang menggunakannya sepenuhnya menyelesaikan transisi mereka dalam keadaan.

SpamapS
sumber
Apakah maksud Anda start on starting ... Ini tidak masuk akal untuk menghentikan kait shutdown saya pada apa pun. start on starting rc RUNLEVEL=[016]akan jauh lebih masuk akal. Dan mungkin taskdilemparkan ke sana untuk memastikannya bisa selesai sebelum hal-hal lain berjalan.
Tejay Cardon
0

Geekosaur, terima kasih banyak atas bantuan Anda.

Sementara itu, saya sudah mencoba start on runlevel [016]metode ini, tetapi tidak berhasil, dan saya pikir saya mengerti mengapa:

Pekerjaan memang sudah dimulai, tetapi proses penutupan belum diblokir sampai tugas pekerjaan selesai. Saya cukup yakin sekarang bahwa peristiwa startingdan stoppingsatu-satunya peristiwa yang dapat digunakan dalam definisi pekerjaan untuk memblokir pekerjaan lain, dan saya pikir inilah yang coba diceritakan oleh buku pedoman Upstart kepada kami. Oleh karena itu, menggunakan acara runlevel tidak akan pernah menyebabkan pemblokiran pekerjaan lain atau proses penutupan; dengan demikian, itu tidak berguna untuk tujuan saya.

Sebaliknya, saya sepertinya memiliki dua kemungkinan:

  1. Mengikuti salah satu proposisi Anda, cari tahu semua pekerjaan yang dibutuhkan oleh aplikasi repektif, dan sertakan semuanya dalam acara awal untuk skrip seperti itu:

    start on stopping job1 or stopping job2 or ...
    

    Ini adalah pekerjaan yang sangat banyak sehingga saya serius memikirkan untuk membuang daftar pekerjaan dan menjalankannya melalui sed untuk secara otomatis menghasilkan bait awal untuk pekerjaan saya yang mencakup semua pekerjaan yang biasanya berjalan pada sistem.

    Keuntungannya adalah bahwa aplikasi masing-masing akan dimatikan bahkan ketika seseorang menghentikan salah satu prasyarat secara manual (sebagai lawan menghentikannya dengan perubahan runlevel / shutdown / reboot).

  2. Temukan satu pekerjaan yang akan dihentikan pada awalnya ketika me-reboot / mematikan sistem (sebut saja pekerjaan ini "FirstJob") dan gunakan pekerjaan itu dalam bait seperti:

    start on stopping FirstJob
    

    Kerugian utama adalah bahwa saya tidak tahu apakah pekerjaan seperti itu ada sama sekali dan jika pekerjaan itu benar-benar tergantung pada semua pekerjaan lain yang tergantung pada aplikasi repektif ("tergantung pada pekerjaan lain" dalam hal ini berarti "akan dihentikan sepenuhnya sebelum pekerjaan lain mulai berhenti ").

Saya tidak yakin mana dari dua kemungkinan yang lebih baik ...

Binarus
sumber
Aku akan mengerjakan sedskripnya sekarang, jika aku ada di posisimu.
geekosaur