Я столкнулся с проблемой со сценарием, который я начал через /etc/service
и использую runit
.
Мой сценарий в /etc/service/myApp/run
выглядит следующим образом:
#!/bin/bash
cd /src
forever -l forever.log -o out.log -e err.log -a start bin/www
То, что делает Forever , запускает мой сценарий как демон. Но, похоже, из-за этого рунт думает, что мой сервис закончился и снова запускается /etc/service/myApp/run
, и снова, и снова ...
Я также пытался запустить этот , а не в качестве демона, и он отлично работает на переднем плане, но у меня все еще есть проблема. У меня есть команда clean-shutdown для отправки на мой сервер в какой-то момент, который в конечном итоге отключит процесс переднего плана, и я не хочу, чтобы он перезапускался. Но, к моему ужасу, /etc/service/myApp/run
немедленно вызывается для перезапуска моего сервера: (
Я не являюсь администратором sys, поэтому для меня большая часть этой стороны нова. Все, что я хочу, - это мой скрипт для запуска при загрузке и не автоматический перезапуск. Спасибо за вашу помощь.
РЕДАКТИРОВАТЬ: я обновил свой вопрос, чтобы включить тот факт, что здесь используется runit
. Я вижу, что runit контролирует процессы, чтобы поддерживать службы. Мой вопрос все еще остается, хотя.
Это очень легко. Как Вы уже заметили, навсегда является ненужным здесь, поскольку runit уже менеджер по сервису, и уже запускает и перезапускает Вашу программу.
Как Вы также уже заметили, существует несколько правил для какой run
программы должны сделать. Они не должны разветвлять и выходить из основной программы. runit менеджер по сервису, как большинство менеджеров daemontools-службы-помощи-семьям (там являющийся всей семьей программного обеспечения, что вся работа как это), ожидает что процесс, работающий run
программа является dæmon. Не его родитель. Не краткий ночной рейс это разветвляется и выходит. Но сам фактический dæmon.
run
программаСуществуют различные языки сценариев, которые делают запись такого run
программирует пустяк. Laurent Bercot execline
тот. Мой nosh
программа - другой. Предположение этого bin/www
фактическая исполняемая программа для Вашего dæmon, еды run
сценарий посмотрел бы что-то как:
#!/bin/nosh fdmove -c 2 1 chdir /src bin/www
execline сценарий столь же краток. Но сценарий оболочки не это намного дольше. Если Ваш run
программа является сценарием оболочки, вещь помнить состоит в том, чтобы наложить программную оболочку с Вашей dæmon программой в том же процессе. Команда оболочки для того, чтобы сделать это exec
и сценарий оболочки таким образом смотрит что-то как:
#!/bin/sh -e exec 2>&1 cd /src exec bin/www
Я настоятельно рекомендую, если программа не требует полномочий суперпользователя, выполнить ее через chpst
программа (и -u
опция), так, чтобы это запустилось как непривилегированный пользователь — для лучших результатов, тот, который выделен этому сервису.
Несколько человек собрали и опубликовали комплекты run
программы, за эти годы, и большая часть run
программы настолько коротки и просты. Так как у Вас есть runit, можно запустить с собственного набора Gerrit Pape run
программы.
Когда дело доходит до запуска и остановки сервиса, снова большинству менеджеров daemontools-службы-помощи-семьям нужно сказать прекратить перезапускать сервис автоматически. Они все идут с инструментом, чтобы сделать это. Просто необходимо использовать его в Вашем clean-shutdown
сценарий.
sv
программа: sv down /etc/service/MyApp
s6-svc
программа: s6-svc -d /etc/service/MyApp
perpctl
программа: perpctl d /etc/service/MyApp
svc
программа: svc -d /etc/service/MyApp
svc
программа: svc -d /etc/service/MyApp
service-control
программа: service-control --down /etc/service/MyApp
который также искажается как svc
: svc -d /etc/service/MyApp
Я сказал, что это было семейство наборов инструментов. На самом деле под покрытиями все эти инструменты говорят главным образом тот же протокол.
Это приносит мне к большей точке. Все эти наборы инструментов не эксклюзивны. Просто, потому что у Вас есть runit, который не мешает Вам использовать execline
если Вы хотите. Или можно выполнить a nosh
сценарий при менеджере по сервису s6.
Вы попытались записать файлы журнала с навсегда. Снова, не используйте навсегда. Это не правильный способ пойти о входе с runit. Перенаправление стандартного вывода и ошибки непосредственно в файлы делает Ваши журналы невозможными вращаться, ограничение размера, и иначе управлять без решительной интерференции в операцию Вашего dæmon.
менеджеры daemontools-службы-помощи-семьям все делают вход при наличии вывода одного основного соединенного сервиса, через обычный канал, к входу другого сервиса журнала. Этот канал настраивается менеджером по сервису. Вы не делаете этого сами.
Сервис журнала является другим сервисом. Это выполняет один из многих доступных инструментов, которые просто читают из их стандартного входа и пишут в строго ограниченный размером, автоматически циклически повторенный, по запросу rotateable, набор файлов журнала в каталоге журнала.
Эти программы multilog
,multilog
, s6-log
, tinylog
, cyclog
, и svlogd
который последний является тем, что Вы найдете, что это прибывает в инструментарий с runit.
На самом деле Вы могли бы найти это, кто бы ни настроил /etc/service/MyApp
уже настроил сервис журнала в /etc/service/MyApp/log
. В противном случае сервисный сценарий журнала очень прост:
#!/bin/sh -e exec chpst -uMyApp-log svlogd -t ./main
Просто создайте названную учетную запись пользователя MyApp-log
, mkdir /etc/service/MyApp/log/main
, chown MyApp-log /etc/service/MyApp/log/main
и Вы отсутствуете. (Отметьте это main
может быть символьная ссылка на где-то в другом месте, где Вы делаете каталог вместо этого. Вы не должны помещать журналы под /etc
с runit. Я поместил свои каталоги журнала под /var/log/sv
.)
Вы не делаете ничего вообще к Вашему основному сервису к журналам цикла и ограничения размера. Циклическое повторение и ограничение размера происходят независимо в сервисном процессе журнала.