Привет. У меня демоны очень простые (пока что)
На данный момент мне нужна очень простая библиотека для написания демона.
Задача демона вообще элементарна. Он тупо делает репликацию данных с редиса в mysql.
Что посоветуете? (демоны не когда до этого не писал поэтому не знаю как должна выглядеть библиотека и т.д.)
Владимир Грабко: Вот, это и надо было писать в теме. Обычно эти вещи делаются не самим приложением, а оберткой, которая производит деплой. А команды наиболее универсально можно принимать через REST.
У Go из-за goroutine, которые всегда запускаются даже в простейшем приложении есть проблемы при демонизации "в лоб".
Упомянутые библиотеки это решают хитрым перезапуском программы.
Oleg Shevelev: уверен, что в англоязычных источниках этих статей на порядок больше. и что? здесь нет прямой ссылки на статью, поэтому и статьи как бы и не существует.
А если вам известна эта статья, то отчего же вы даете такой не соответствующий действительности совет, как "попробуйте стандартные"?
v- smerti:
а я то думаю что вы так реагируете странно. да вы просто не понимаете о чем я пишу. не-не-не. жевать не буду. учитесь, учитесь, это полезно.
Oleg Shevelev:
а он и с горутинами нормально уживается? точнее, они с ним. те горутины, что в базе runtime не дохнут, как при обычной демонизации?
Oleg Shevelev:
Такие запускалки я использовал еще лет 10 назад, знаю.
Вопрос в другом: все равно ли горутинам? У go есть проблемы с демонизацией, ему отдельный подход нужен. Или не как демон запускается?
Oleg Shevelev:
разумеется, я прежде чем высказывать свое мнение прочитал. там написано - запуск-остановка и контроль демонов.
вопрос - вы так настоятельно советуете. вы уже проверили это для go. go весьма капризен по части демонизации из-за организации системных go-рутин (запускаемых даже в простой программа func main() {}).
вот я и спрашиваю вас как человека несомненно более знающего, проверяли ли вы возможность запуска этим старт-стопом конкретно программы на golang или ваши предложения старт-стопа не основаны на собственных или чужих проверках с Go?
abcyu: похоже вы действительно троль. И так, ликбез для вас:
1. да, Golang приложения запускаются точно так же как и все остальные
2. да, я использовал это в продакшине, так же использую supervisord для аналогичных целей если требуется перезапуск в случае возможных падений
3. start-stop-daemon просто делает по сути exec любого приложения что требуется запустить как демон, переходит сам в режим демона и отвязывается от консоли
4. любая демонизация по своей сути:
- это запуск дочернего процесса
- отвязывание дочернего процесса от текущего (основного) процесса
- завершение основного процесса
Иными словами start-stop-daemon и другие подобные софтины работают практически по одному и тому же принципу и сделаны именно для того что бы создавать демоны из любой программы, выполняя лишь одну функцию - отвязка от консоли.
Всё остальное к вопросу не имеет никакого отношения, ни горутины, ни рантайм, ни язык на котором написано приложение.
Oleg Shevelev:
Не все так просто с отвязкой. У Go с этим большие проблемы. Специфика запуска go-рутин. После простой отвязки от родителя программа на go становится не полнофункциональна.
Тут же приведены ссылки на статью Хабра где это подробно разжевано.
Именно поэтому эмуляция демона за счет внешних утилит для go хорошо подходит.
Oleg Shevelev: про обычный exec на самом деле. если golang не демонизируется, а просто запускается внешним демоном, то это эмуляция.
да, эмуляция работает нормально с Go.
abcyu: :) А вот сами дойти до этого почитав о том что такое start-stop-daemon не могли?:) Я уже не говорю о том что бы взять и почитать его исходный код... что бы не было причин с кем-то спорить.
Зачем тратить время? Проблему я решил для себя - библиотеку соответствующую использую, ее названием поделился. Но интересуют и альтернативными решения.
Проверять самому все что пишут в интернете - большая потеря времени. Тем более, что в интернете полно безответственных заявлений. Ваше сообщение показалось таковым.
Обращать серьезное внимание, тратить время целесообразно только на те решения, которые сопровождаются компетентными комментариями или по крайней мере автор заявления утверждает что сам проверил. Именно таких комментариев и добивался от вас.
abcyu: да проблема была в том что вы не компетентны в вопросе и судите, вам это даже v- smerti указал назвав вас троллем. Для тех кто хоть немного в курсе как вообще этот механизм (демонизация) работает изначально (в Си если угодно) таких вопросов как у вас не возникает, тем более подозрений о которых вы говорите:)
Oleg Shevelev:
вот именно такие ваши мысли и вызывают подозрение, что вы не понимаете о чем пишете, и ваши рекомендации не соответствуют действительности.
если Go демонизировать как C то полноценно не взлетит, в том то все и дело. не запускаются нормально системные go-routine, те, что запускаются до func main()
v- smerti:
Намекал, блин, 100 раз прямым текстом.
Ладно. Жую:
Если вы породите демона в классическом Сишном стиле, используя вызов "fork",
то go-рутины, стартовавшие в секциях инициализации используемых вами пакетов, не будут работать.
В Go этого невозможно потому, что go-рутины, заблокированные системными вызовами в потоках, кроме текущего потока, не функционируют. Так как дочерний процесс не наследует потоки.
При том, что го-рутины, дочерние к main(), вполне нормально функционируют.
Для вашего случая это, как минимум 2 места:
Насколько я помню, секция инициализации используется в пакете интерфейса к БД, как раз который вам нужен. И в пакете обработке системных сигналов, который нужен для реализации полноценного демона.
Именно поэтому для Go или используют внешние программы, эмулирующие демонов, а по факту просто запускающие go-программу в обычном режиме.
Или гошные пакеты, реализующие обходящий проблему костыль.
Если реализовать демона в классическом Сишном стиле, то будет работать гошный демон только с примитивным функционалом.
Как только вам понадобится что-то более менее серьезное - вы обнаружите, что оно почему-то не работает в режиме демона, хотя и работало пока программа была обычной.
Oleg Shevelev:
Теперь - да.
А зачем Вы ссылались на демонизацию по методу Си, где го-рутин в принципе нет:
"Для тех кто хоть немного в курсе как вообще этот механизм (демонизация) работает изначально (в Си если угодно) таких вопросов как у вас не возникает, тем более подозрений о которых вы говорите:)"
abcyu: разве там не написанно причин почему ссылаюсь?:) Потому что вопросов не было бы по отношению к start-stop-daemon и другим подобным приложениям:)