Ho postgres e passeggero installati da homebrew, e uso l'os x integrato in apache. Ho diverse app per i binari che utilizzano postgres gestite dai passeggeri che a loro volta sono gestite da apache.
Attualmente apache viene avviato da launchd all'avvio da /System/Library/LaunchDaemons/org.apache.httpd.plist
, apache avvia passeggero tramite /etc/apache2/other/passenger.conf
e una volta che ho effettuato l'accesso a postgres viene avviato tramite ~/Library/LaunchAgents/homebrew.mxcl.postgresql.plist
.
Tutto inizia bene e funziona alla grande fino a quando ho bisogno di chiudere o riavviare il mio Mac; poi mi imbatto in un problema con il modo in cui launchd abbatte tutto. Fondamentalmente Launchd invia SIGTERM ad ogni processo utente e poi 20 secondi dopo ( link ) invia SIGKILL, ma postgres considera SIGTERM come un segnale di "spegnimento intelligente" ( link ) e attende che tutte le sessioni esistenti si chiudano prima di uscire. Il problema è che le sessioni sono di proprietà delle app su rotaia in esecuzione su passeggero e pertanto non si spegneranno finché Apache non si spegne. E l'apache non si spegne fino a quando il sistema non si sta spegnendo. Ciò significa che postgres ottiene SIGKILL
ed e lascia il suo postmaster.pid
file in giro che impedisce a postgres di avviarsi al prossimo avvio fino a quando I rm
quel file.
Lo spostamento di launchd di postgres su /Library/LaunchDaemons/
sarebbe un'idea migliore? Potrebbe potenzialmente far sì che postgres e apache si chiudano contemporaneamente, il che con 20 secondi di interruzione dovrebbe essere sufficiente per consentire a Postgres di uscire in modo pulito. Ma potrei mancare una soluzione più semplice.