Створення демонів для mac os x засобами launchd - leonid shevtsov

Демон - додаток, що запускається самостійно і працює у фоновому режимі, а також автоматично перезапускається після падіння і володіє іншими приємними пляшками.

Навіщо тобі, простому девелоперу, знадобиться писати демона? Ну, наприклад, щоб не запускати-перезапускати сервера додатків, щоб вони не висіли в терміналі, і т.п.

Ну, наприклад, у мене встановлений nginx. і я хочу включити в нього додаток, написане на JRuby. Найпростіший спосіб запустити додаток на JRuby - це Rackup. ну або взагалі WEBrick який-небудь. Підключити його до nginx нескладно. Розберемося, як зробити так, щоб цей сервер не доводилося запускати вручну.

В OS X демони управляються утилітою launchd. Після убунтовского Upstart вона мене дуже порадувала, тому, власне, і пишу цю статтю.

Launchd розрізняє системні і призначені для користувача демони. У них різний набір привілеїв, наприклад, призначені для користувача демони не можуть відкривати сокети на "системний" порт, наприклад, на 80-й. Зате призначені для користувача демони запросто встановлюються і працюють без sudo, що, втім, на твоїй особистій машині майже нічого не означає. Тому я буду розглядати призначені для користувача демони.

Для управління launchd є утиліта launchctl. Вона знайома користувачам Homebrew, тому що він просить вручну реєструвати всі встановлювані сервіси, наприклад, СУБД. launchctl забирає інформацію про сервіси з конфігов, їх ми і будемо писати.

Файли launchctl

Придумуємо ім'я для сервісу. Традиційно вони називаються в обернено-доменно-іменному-порядку, тобто я б міг назвати свій me.shevtsov.leonid.jrubyapp.

/Library/LaunchAgents/me.shevtsov.leonid.jrubyapp.plist наступного змісту:

Вгружаем сервіс в систему

Перевіряємо, що сервіс запущений:

Що можна робити з демоном

Що мені сподобалося в launchd - крім запуску демона при старті системи, можна повісити його на ряд інших подій. Наприклад, на зміну каталогу (WatchPaths), або на монтування томи (StartOnMount), по кроноподобному розкладом (StartCalendarInterval). Причому, зауваж, сервіс сам знає, за яким розкладом себе викликати - йому не доводиться записувати цю конфігурацію в зовнішній файл (тобто, кронтаб).

Мені здалося, що launchd набагато зручніше і гнучкіше ніж Upstart.

Формат конфігураційних файлів описаний в мане по launchctl.plist.

перезапуск демона

За документації, після виклику (Нерекомендовані) команди stop будь-який сервіс, крім запускаються на вимогу, буде перезапущений.