У мене є postgres і пасажир встановлений з доморощеного, і використовувати OS X вбудований в Apache. У мене є кілька рейок програми, які використовують postgres, якими керує пасажир, який у свою чергу управляється apache.
Наразі Apache запускається запуск launchd з /System/Library/LaunchDaemons/org.apache.httpd.plist
, apache починає пасажир через /etc/apache2/other/passenger.conf
і після того, як я увійшов до системи, postgres запускається через ~/Library/LaunchAgents/homebrew.mxcl.postgresql.plist
.
Все починається відмінно і працює відмінно, поки мені потрібно закрити або перезавантажити мій Mac; тоді я стикаюся з проблемою, як запускає все. В основному Launchd надсилає SIGTERM кожному користувальницькому процесу, а потім через 20 секунд ( http://www.opensource.apple.com/source/launchd/launchd-842.92.1/src/core.c ) надсилає SIGKILL, але postgres розглядає SIGTERM як сигнал "розумного вимкнення" ( http://www.postgresql.org/docs/9.5/static/server-shutdown.html ) і чекає, поки всі існуючі сесії закриються перед виходом. Проблема полягає в тому, що сесії належать до рельсових додатків, що працюють під пасажиром, і тому не вимикаються, поки апач не вимкнеться. А Apache не вимикається, поки система не вимикається. Що означає postgres отримує SIGKILL
і залишає його postmaster.pid
Файл, що лежить навколо, що запобігає запуску postgres до наступного завантаження, поки я rm
цей файл.
Був би переміщення postgres's launchd пластик /Library/LaunchDaemons/
бути кращою ідеєю? Це потенційно призведе до того, що postgres та apache будуть вимикатися одночасно, що дає 20 секунд, щоб зупинитися, має бути достатньо часу для postgres вийти чисто. Але я міг би пропустити простіше рішення.