Bagaimana cara menulis skrip stop runit kustom

12

Saya ingin memiliki skrip "stop" khusus runit( runsv) untuk dijalankan ketika harus menghentikan / memulai ulang proses. Saat ini hanya membunuh proses, lalu menjalankan skrip "selesai". Tetapi dalam kasus saya, proses saya memunculkan proses anak secara dinamis, jadi alih-alih sederhana kill, saya perlu "killtree"menyingkirkannya. Bagaimana aku melakukan itu?

Saya tahu itu harus dilakukan melalui controlopsi runit tetapi dari membaca dokumen itu tidak begitu jelas bagi saya bagaimana skrip berhenti harus dinamai :(

http://smarden.org/runit/runsv.8.html

ddinchev
sumber
Layanan Anda (bukan skrip tetapi program) kedengarannya keliru, ia harus menuai / membersihkan anak-anaknya sendiri. Penasaran saja, ada apa?
Avery Payne

Jawaban:

13

Dari dokumen

Untuk setiap karakter kontrol c yang dikirim ke pipa kontrol, jalankanv terlebih dahulu memeriksa apakah layanan / kontrol / c ada dan dapat dieksekusi. Jika demikian, ia memulai service / control / c dan menunggu sampai terminasi, sebelum menafsirkan perintah. Jika program keluar dengan kode pengembalian 0, runv menahan diri untuk tidak mengirimkan sinyal yang sesuai kepada layanan. Perintah o selalu dianggap sebagai perintah u. Pada perintah d pertama layanan / kontrol / t dicentang, dan kemudian layanan / kontrol / d. Pada perintah x layanan pertama / kontrol / t dicentang, dan kemudian layanan / kontrol / x. Kontrol layanan log opsional tidak dapat dikustomisasi.

Itu berarti Anda perlu membuat service_name/control/X, X menjadi executable yang akan berjalan ketika Anda mengirim svperintah terkait ke layanan, seperti dperintah (turun). Jika skrip Anda keluar dengan status 0, skrip itu tidak akan mencoba menghentikan layanan itu sendiri.

Pada dasarnya Anda memerlukan skrip yang dapat dieksekusi /etc/sv/<service>/control/dyang akan melakukan apa pun yang Anda inginkan dan mematikan layanan, membersihkan id dan sebagainya.

coredump
sumber
benar-benar menarik dan sederhana cara menjalankan dir.
Dzung Nguyen
2

Jawaban sederhananya adalah memberi nama skrip pembersihan "layanan / selesai". Script ini dieksekusi ketika "layanan / menjalankan" keluar.

Ada juga "layanan / kontrol / ctrl_char antarmuka. Ini memungkinkan Anda untuk melakukan tindakan yang berbeda tergantung pada perintah yang Anda kirim ke runsv.

Rik Schneider
sumber
1
layanan / selesai berjalan setelah TERT CONT sedang dikirim ke layanan yang berjalan. Ini lebih seperti layanan kliring setelah pembunuhan.
MaximKostrikin
2

Saya harus menyelesaikan masalah ini sendiri untuk buruh pelabuhan. Saya menjalankan server uwsgi, dan mengirimkan sinyal yang salah dengan buruh pelabuhan (TERM bukannya INT) untuk menghentikan kontainer.

Gagasan file kontrol / x adalah bereaksi terhadap sinyal yang diterima. Dalam kasus saya, saya akan menempatkan tfile untuk sinyal terminasi ke dalam kendali, karena ini adalah file yang disediakan untuk sinyal term. Skrip harus dapat dieksekusi.

#!/bin/bash
kill -INT `cat /tmp/project-master.pid`

Script mengirim sinyal int ke proses uwsgi, yang saya inginkan.

Jika skrip kontrol keluar tanpa kesalahan (kode pengembalian 0) sinyal asli tidak akan dikirim ke proses.

Jadi dalam kasus saya, saya bisa menerima sinyal istilah dan mengirimkan sinyal int untuk proses layanan sebagai gantinya.

nyawa
sumber