Поддерживать работу сервера на экземпляре EC2 после завершения ssh

В настоящее время у меня есть два сервера, работающих на экземпляре EC2 (MongoDB и bottlepy). Все работает, когда я SSHed к экземпляру и начал эти два сервера. Однако, когда я закрыл сеанс SSH (экземпляр все еще запущен), я потерял эти два сервера. Есть ли способ сохранить работу сервера после выхода из системы? Я использую Bitvise Tunnelier для Windows 7. Экземпляр, который я использую, - Ubuntu Server 12.04.3 LTS.

Ответ 1

Если вы не хотите запускать какой-либо процесс как услугу (или через модуль apache), вы можете (например, я использую IRC) использовать gnome -screen Install screen http://hostmar.co/software-small.

screen продолжает работать на вашем сервере, даже если вы закрываете соединение - и, следовательно, каждый процесс, который вы начали внутри, тоже будет работать.

Ответ 2

Для тех, кто приземляется здесь из поиска Google, я хотел бы добавить tmux в качестве другой опции. tmux широко используется для этой цели и предварительно установлен в новых экземплярах Ubuntu EC2.

Вот отличный ответ Хэмиш Даунер, заданный похожим вопросом на askubuntu.com:

Я бы использовал терминальный мультиплексор, который был самым известным, и tmux, являющийся более поздней реализацией идеи. Я использую tmux и рекомендую вам сделать это.

В основном tmux будет запускать терминал (или набор терминалов) на компьютере. Если вы запустите его на удаленном сервере, вы можете отключиться от него, не закончив его. Затем, когда вы снова входите в систему, вы можете снова подключиться и просмотреть весь пропущенный результат.

Чтобы запустить его в первый раз, просто введите

tmux

Затем, когда вы хотите отключиться, вы делаете Ctrl + B, D (т.е. нажмите Ctrl + B, затем отпустите обе клавиши, а затем нажмите d.

При повторном входе в систему вы можете запустить

tmux attach

и вы снова подключитесь к tmux и увидите все результаты, которые произошли. Обратите внимание, что если вы случайно потеряете соединение ssh (скажем, ваша сеть опускается), tmux все равно будет работать, хотя может показаться, что он все еще подключен к соединению. Вы можете указать tmux отсоединиться от последнего соединения и подключиться к вашему новому соединению, запустив

tmux attach -d

Фактически вы можете использовать параметр -d все время. На серверах у меня это в моем > .bashrc

alias tt='tmux attach -d'

Итак, когда я вхожу в систему, я могу просто набрать tt и снова подключиться. Вы можете пойти еще дальше > , если хотите, и проинтегрировать команду в псевдоним для ssh. Я запускаю почтовый клиент > внутри tmux на сервере, и у меня есть локальный псевдоним:

alias maileo='ssh -t mail.example.org tmux attach -d'

Это делает ssh на сервере и запускает команду в конце - tmux attach -d Параметр -t гарантирует, что терминал будет запущен - если команда будет предоставлена, то она не будет запущена в терминале по умолчанию. Поэтому теперь я могу запустить maileo в локальной командной строке и подключиться к серверу и сеансу tmux. Когда я отсоединяюсь от tmux, соединение ssh также убивается.

Это показывает, как использовать tmux для вашего конкретного варианта использования, но tmux может сделать гораздо больше, чем это. Этот tmux tutorial научит вас немного больше, и там будет еще много.

Ответ 3

Было бы неплохо, если бы вы предоставили больше информации о своей среде, но предположив, что Ubuntu Linux вы можете запускать службы в фоновом режиме или как демоны.

sudo service mongodb start
nohup python yourbottlepyapp.py &

(Используйте nohup, если хотите, в сеансе ssh и хотите, чтобы он не закрывал файловые дескрипторы)

Вы также можете запустить приложение bottle.py с помощью Apache mod_wsgi. (Работает под службой apache) Дополнительная информация здесь: http://bottlepy.org/docs/dev/deployment.html

Надеюсь, что это поможет.

Дополнение: (ваш процесс по-прежнему выполняется после выхода из сеанса ssh)

Возьмем этот пример time.py

 import time
 time.sleep(3600)

Затем запустите:

 $ python3 time.py &
 [1] 3027
 $ ps -Af | grep -v grep | grep  time.py
 ubuntu    3027  2986  0 18:50 pts/3    00:00:00 python3 time.py
 $ exit

Затем ssh возвращается на сервер

 $ ps -Af | grep -v grep | grep  time.py
 ubuntu    3027     1  0 18:50 ?        00:00:00 python3 time.py

Продолжающийся процесс (уведомление без tty)

Ответ 4

Вы хотите, чтобы запущенные службы отключились от управляющего терминала. Я бы предложил использовать nohup для этого, например.

ssh my.server "/bin/sh -c nohup /path/to/service"

вам может потребоваться разместить & там (в кавычках), чтобы запустить его в фоновом режиме.

Как прокомментировали другие, если вы запускаете правильные сценарии инициализации для запуска/остановки служб (или команды ubuntu service), вы не должны видеть эту проблему.