Bagaimana saya bisa mengkonfigurasi program yang dikelola supervisor untuk menunggu X detik sebelum berusaha me-restart?

9

Saya punya proses pekerja yang memproses 1 pesan RabbitMq sekaligus. Saat ini, segera setelah pekerja keluar, supervisor akan memulai kembali (yang akan memproses pesan berikutnya).

Saya ingin menetapkan interval X detik, sehingga pengawas tidak memulai kembali dengan segera, tetapi menunggu sejumlah waktu tertentu sebelum memulai pekerja lain.

Apakah ini mungkin? Bagaimana?

loostro
sumber

Jawaban:

11

Tidak ada cara untuk menentukan interval di bagian program penyelia, tetapi yang dapat Anda lakukan adalah memasukkan "sleep ()" ke dalam kode Anda sehingga setelah program menunggu periode waktu tertentu setelah selesai dengan pemrosesan pesan.

Jika Anda tidak ingin / tidak dapat mengubah kode program, Anda dapat mencoba membungkusnya menjadi skrip bash, misalnya:

#!/bin/bash
/usr/local/bin/myprogram
sleep 30

Dan ubah bagian program penyelia Anda untuk menjalankan skrip itu, alih-alih program Anda:

command=/usr/local/bin/myprogram.sh
Jakov Sosic
sumber
Tidur tidak akan dieksekusi sampai / usr / local / bin / myprogram kembali?
loostro
Tepat, hanya setelah myprogram keluar, tidur akan mulai menghitung.
Jakov Sosic
Masalahnya adalah skrip ini tidak menangani sinyal, khususnya, TERM.
Torsten Bronger
9

Saya membutuhkan cara sederhana untuk menjalankan perintah dari dalam wadah buruh pelabuhan, di mana tidak ada cron. Inilah yang saya gunakan:

[program:runevery]
directory = /my/workdir
command = sh -c "sleep 5;date >>/root/test.ts"
stdout_logfile = /var/log/supervisor/%(program_name)s.log
stderr_logfile = /var/log/supervisor/%(program_name)s.log
autorestart = true
startsecs = 0
exitcodes = 0,1,2

beginecs = 0 memastikan bahwa penyelia mengira perintah itu mulai berhasil bahkan jika ia keluar setelah beberapa detik. Kalau tidak, pengawas akan berhenti me-restart, berpikir itu dalam satu lingkaran.

Inilah yang akan Anda lihat di /root/date.ts dengan contoh di atas:

# tail -f /root/test.ts 
Tue Nov 17 20:42:58 UTC 2015
Tue Nov 17 20:43:04 UTC 2015
Tue Nov 17 20:43:10 UTC 2015
[...]

Sesuaikan tidur sesuai keinginan Anda dan ganti 'tanggal >> / root / test.ts' dengan apa pun yang Anda butuhkan.

Solusi ini juga berguna jika Anda perlu menjalankan cronjob lebih sering daripada setiap menit.

Luca Gibelli
sumber
+1 untuk solusi pintar. Saya ingin melakukan hal serupa. Sayangnya, ini tidak berfungsi untuk saya karena saya perlu mendapatkan kode keluar di pendengar menggunakan panggilan RPC. Sayangnya, pengawas memulai kembali program segera setelah keluar, membuat kode 0, huh ... Ada ide lain?
Onema
0
[program:yourapp]
command = bash -c "sleep 60 && exec urcmd'
startsecs = 65 ; 

lalu

supervisorctl -c your_config_file reload

1. Anda perlu menggunakan execperintah, jika tidak maka akan membayar subprogres dari sleep 60 && exec your commanddan kemajuan Anda akan terlihat seperti berikut

$ ps -ef|grep urcmd
work      1818  1698  0 17:35 ?        00:00:00 bash -c sleep 60 && urcmd
work      3872  1818  0 17:36 ?        00:00:00 urcmd

dan kemudian ketika Anda gunakan supervisorctluntuk menghentikan urApp, Anda akan menghentikan kemajuan 1818 dan meninggalkan 3872 kemajuan anak yatim

2. merekomendasikan untuk mengubah mulai untuk 5 lebih dari detik tidur, maka ketika Anda memulai aplikasi ini dan memeriksa statusnya, itu akan menunjukkan kepada Anda itu mulai

$supervisorctl -c your_config_file status;echo;ps -ef|grep urcmd
urapp                          STARTING  
otherapp                       RUNNING   pid 13502, uptime 0:00:55

$supervisorctl -c your_config_file status;echo;ps -ef|grep urcmd
urapp                          RUNNING   pid 13503, uptime 0:00:05
otherapp                       RUNNING   pid 13502, uptime 0:00:65

lain jika Anda menetapkan nilai kurang dari detik tidur, ketika Anda memulai aplikasi dan memeriksa status, Anda akan mendapatkan status berlari, tetapi masih tidur cmd sebelum eksekusi nyata

3. ketika Anda mengubah file konfigurasi Anda, Anda perlu menggunakan ulang cmd atau hanya restart supervisor Anda untuk membuatnya berfungsi

qingxin wang
sumber