2012-04-02 7 views
34

Di seguito è riportato uno script di avvio per redis. Come posso creare un pid, quindi uso monit per il monitoraggio?Ubuntu, upstart e creazione di un pid per il monitoraggio

#!upstart 
description "Redis Server" 

env USER=redis 

start on startup 
stop on shutdown 

respawn 

exec sudo -u $USER sh -c "/usr/local/bin/redis-server /etc/redis/redis.conf 2>&1 >> /var/log/redis/redis.log" 
+1

Perché dovresti usare Monit quando hai già specificato 'respawn'? – auny

+5

@auny La ragione per usare monit oltre a upstart/respawn è che respawn è consapevole solo se il processo è vivo o meno, ma non sa se l'applicazione è in cattivo stato o meno. D'altra parte Monit può interagire con l'applicazione in diversi modi, ad esempio colpendo un endpoint di stato http, per gestire gli scenari in cui il processo potrebbe essere in esecuzione ma l'app si trova in uno stato di malfunzionamento o guasto che indica che il processo deve essere riavviato. – Egg

+0

Oggigiorno Redis ha la sua funzionalità pid (pidfile in redis.conf) - http://download.redis.io/redis-stable/redis.conf – Willem

risposta

68

Se start-stop-daemon è disponibile sulla vostra macchina, vi consiglio vivamente di utilizzarlo per avviare il processo. start-stop-daemon gestirà l'avvio del processo come utente senza privilegi senza forking da sudo o su (recommended in the upstart cookbook) E ha anche il supporto integrato per la gestione dei file pid. Ad esempio:

/etc/init/app_name.conf

#!upstart 
description "Redis Server" 

env USER=redis 

start on startup 
stop on shutdown 

respawn 

exec start-stop-daemon --start --make-pidfile --pidfile /var/run/app_name.pid --chuid $USER --exec /usr/local/bin/redis-server /etc/redis/redis.conf >> /var/log/redis/redis.log 2>&1 

In alternativa si potrebbe gestire manualmente il file pid utilizzando il post-start script strofa per crearlo e post-stop script strofa per eliminarlo. Ad esempio:

/etc/init/app_name.conf

#!upstart 
description "Redis Server" 

env USER=redis 

start on startup 
stop on shutdown 

respawn 

exec sudo -u $USER sh -c "/usr/local/bin/redis-server /etc/redis/redis.conf 2>&1 >> /var/log/redis/redis.log" 

post-start script 
    PID=`status app_name | egrep -oi '([0-9]+)$' | head -n1` 
    echo $PID > /var/run/app_name.pid 
end script 

post-stop script 
    rm -f /var/run/app_name.pid 
end script 
+1

Mi manca qualcosa o il 'start-stop-daemon'? la versione non funziona mai correttamente? Do not Upstart non registra il PID di 'start-stop-daemon' e assume che il lavoro sia terminato quando viene restituito' start-stop-daemon'? Questo è il comportamento che vedo nei test e, per quanto posso dire, è di progettazione. – cqcallaw

+0

start-stop-daemon funziona come una middle-man trasparente tra upstart e il processo specificato nel parametro --exec di start-stop-daemon. Tutti i comandi di upstart e il monitoraggio PID dovrebbero comportarsi come se fossero collegati direttamente al processo in --exec. Potresti fornire qualche informazione in più sul tipo di test che sembra produrre risultati diversi? – Egg

+0

Devi anche chownare $ USER nel file pid? –

21

primo esempio di Uovo con start-stop-daemon è il modo di andare.

Se si sceglie 2nd, suggerirei $$ per ottenere il PID.

#!upstart 
description "Redis Server" 

env USER=redis 

start on startup 
stop on shutdown 

respawn 

script 
    echo $$ > /var/run/app_name.pid 
    exec sudo -u $USER sh -c "/usr/local/bin/redis-server /etc/redis/redis.conf 2>&1 >> /var/log/redis/redis.log" 
end script 

post-stop script 
    rm -f /var/run/app_name.pid 
end script 
+0

questa era l'unica soluzione che funzionava per i miei problemi di logstash. Si noti inoltre che lo script inizialmente non è riuscito perché setuid richiede sudo apt-get install super. Deve essere una dipendenza interrotta apt nello script upstart in bundle. – darKoram

Problemi correlati