Come scrivere runit script stop personalizzato


12

Voglio avere uno script "stop" personalizzato runit( runsv) da eseguire quando si deve interrompere / riavviare il processo. Attualmente semplicemente uccide il processo, quindi esegue lo script "finish". Ma nel mio caso, il mio processo genera dinamicamente processi figlio, quindi invece di semplici kill, ho bisogno di un "killtree"per sbarazzarmi di loro. Come lo faccio?

So che dovrebbe essere fatto attraverso le controlopzioni di runit ma dalla lettura dei documenti non è molto chiaro per me come dovrebbe essere chiamato lo script stop :(

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


Il tuo servizio (non lo script ma il programma) sembra mal comportato, dovrebbe raccogliere / ripulire dopo i propri figli. Solo curioso, che cos'è?
Avery Payne,

Risposte:


13

Dai documenti

Per ogni carattere di controllo c inviato alla pipe di controllo, prima runv verifica se service / control / c esiste ed è eseguibile. In tal caso, avvia service / control / c e attende che termini, prima di interpretare il comando. Se il programma esce con il codice di ritorno 0, runv si astiene dall'inviare al servizio il segnale corrispondente. Il comando o è sempre considerato come comando u. Al comando d viene controllato prima il servizio / controllo / t, quindi il servizio / controllo / d. Al comando x viene controllato prima servizio / controllo / t, quindi servizio / controllo / x. Il controllo del servizio log opzionale non può essere personalizzato.

Ciò significa che è necessario creare un service_name/control/X, essendo X un eseguibile che verrà eseguito quando si invia il svcomando relativo al servizio, come il dcomando (giù). Se lo script esce con lo stato 0, non tenterà di disattivare il servizio stesso.

Fondamentalmente hai bisogno di uno script eseguibile /etc/sv/<service>/control/dche farà tutto ciò che vuoi e ucciderà il servizio, ripulirà pids ed ecc.


è davvero interessante e semplice il modo in cui funziona dirvv.
Dzung Nguyen,

2

La semplice risposta è denominare lo script di pulizia "service / finish". Questo script viene eseguito all'uscita di "service / run".

Esiste anche un'interfaccia "service / control / ctrl_char. Ti consente di eseguire azioni diverse a seconda del comando che invii a ronsv.


1
service / finish viene eseguito dopo che TERM CONT viene inviato al servizio in esecuzione. È più come cancellare il servizio dopo l'uccisione.
MaximKostrikin,

2

Ho dovuto risolvere questo problema da solo per la finestra mobile. Avevo il server uwsgi in esecuzione e mi è stato inviato un segnale errato dalla finestra mobile (TERM anziché INT) all'arresto del contenitore.

L'idea dei file control / x è di reagire a un segnale ricevuto. Nel mio caso, metterei un tfile per il segnale di terminazione in controllo, poiché è il file riservato per il termine segnale. Lo script dovrebbe essere eseguibile.

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

Lo script invia un segnale int al processo uwsgi, che è quello che voglio.

Se lo script di controllo esce senza errori (codice di ritorno 0), il segnale originale non verrà inviato al processo.

Quindi nel mio caso sono stato in grado di ricevere il termine segnale e inviare invece un segnale int al processo di servizio.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.