Как заставить мой веб-сервер Golang работать в фоновом режиме?

Недавно я закончил учебник по веб-разработке Wiki (http://golang.org/doc/articles/wiki/). У меня было много удовольствия, и я хотел бы больше экспериментировать с сетевым/http-пакетом.

Однако я заметил, что когда я запускаю wiki с консоли, вики захватывают консоль. Если я закрываю консольный терминал или останавливаю процесс с помощью CTRL+Z, сервер останавливается.

Как я могу заставить сервер работать в фоновом режиме? Я думаю, что термин для этого работает в демоне.

Я запускаю это на Ubuntu 12.04. Спасибо за любую помощь.

Ответ 1

Простые/полезные вещи сначала

Если вы хотите запустить script без особых усилий, вы можете использовать службу upstart. См. Соответствующую страницу руководства и /etc/init/*.conf. После создания такого процесса вы можете запустить свой сервер, позвонив

service myserver start

Если вам нужны другие функции, например, определенные ограничения или управление разрешениями, вы можете попробовать xinetd.

Использование оболочки

Вы можете начать свой процесс следующим образом:

nohup ./myexecutable &

& указывает командам запускать команду в фоновом режиме, сохраняя ее в списке заданий. На некоторых оболочках задание убивается, если родительская оболочка выходит с использованием сигнала HANGUP. Чтобы предотвратить это, вы можете запустить свою команду, используя команду nohup, которая отбрасывает сигнал HANGUP.

Однако это не работает, если вызываемый процесс повторно подключает сигнал HANGUP.

Чтобы быть уверенным, вам нужно удалить этот процесс из списка заданий оболочки. Для двух хорошо известных оболочек это может быть достигнуто следующим образом:

bash:

./myexecutable &
disown <pid>

ЗШ:

./myexecutable &!

Устранение фонового задания

Обычно оболочка печатает PID процесса, который затем может быть убит с помощью команды kill, чтобы остановить сервер. Если ваша оболочка не печатает PID, вы можете получить ее с помощью

echo $!

непосредственно после выполнения. Это печатает PID разветвленного процесса.

Ответ 2

Вы можете использовать Supervisord для управления процессом.

Ответ 3

Ubuntu? Используйте upstart.

Создайте файл в /etc/init для вашего задания с именем your-service-name.conf

start on net-device-up
exec /path/to/file --option

Вы можете использовать start your-service-name, а также: stop, restart, status