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 shutdown
dalam 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]
ataustart on stopping runlevel [x]
? - Apa yang akan menjadi solusi terbaik untuk masalah saya?
Terima kasih banyak
startup
acara 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 olehstartup
. Karena tidak ada satushutdown
peristiwa tunggal , ada terlalu banyak jenis yang berbedashutdown
untuk menjadi bermakna. Lebih baik bergantung langsung pada pekerjaan yang harus Anda jalankan.on stopping servicea or stoping serviceb or ...
untuk layanan apa pun yang Anda butuhkan untuk berjalan.Untuk menghentikan penghentian proses saat pekerjaan Anda berhenti, Anda harus menggunakan ini:
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
Juga dalam beberapa kasus Anda membutuhkan sesuatu untuk terus berjalan hingga jaringan diturunkan (seperti dbus / network-manager). Untuk itu kamu mau
Itu adalah peristiwa yang dipancarkan kemudian di shutdown yang juga akan diblokir sampai pekerjaan apa pun yang menggunakannya sepenuhnya menyelesaikan transisi mereka dalam keadaan.
sumber
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 mungkintask
dilemparkan ke sana untuk memastikannya bisa selesai sebelum hal-hal lain berjalan.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
starting
danstopping
satu-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:
Mengikuti salah satu proposisi Anda, cari tahu semua pekerjaan yang dibutuhkan oleh aplikasi repektif, dan sertakan semuanya dalam acara awal untuk skrip seperti itu:
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).
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:
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 ...
sumber
sed
skripnya sekarang, jika aku ada di posisimu.