1

Контекст: это очень простой вопрос

Используя Putty и SSH в первый раз, чтобы выполнить серьезную настройку сервера и столкнуться с ситуацией, когда я запустил процесс, который не хочу останавливать.

Процесс представляет собой HTTP-сервер gunicorn WSGI (работает на Centos 6.3).

Команда, которую я использовал для запуска процесса (согласно их быстрому запуску):

gunicorn -w 4 myapp:app

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

  • Означает ли тот факт, что я потерял командную строку, процесс все еще выполняется?
  • Как мне вернуться в командную строку, не убивая процесс?
  • Как мне вернуться и следить за процессом позже?
  • Как мне в итоге убить процесс?

Любая помощь приветствуется, спасибо большое!

5 ответов5

4

Означает ли тот факт, что я потерял командную строку, процесс все еще выполняется?

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

Как мне вернуться в командную строку, не убивая процесс?

Если терминал еще жив, нажмите CTRL+Z, чтобы вернуться в командную строку, затем напишите bg чтобы поместить gnuicorn в фоновом режиме (и используйте fg чтобы вернуться к процессу, чтобы вы могли его убить - например, с помощью CTRL+C). ,

Запустив его как gunicorn -w 4 myapp:app & немедленно поместит процесс в фоновый режим оболочки - хотя в зависимости от сервера он все равно может быть убит при завершении сеанса ssh. Запуск nohup gunicorn -w 4 myapp:app & обеспечит запуск процесса даже после отключения. Прочитайте справочную страницу nohup

Другой вариант - запустить процесс в терминале, который позволяет подключиться к нему. Это то, что позволяет вам экран GNU или tmux - эффективно позволяя отключить сеанс ssh, подключиться позже и снова присоединиться к существующему сеансу терминала.

Как мне вернуться и следить за процессом позже?

Вы не можете, если вы не запустите процесс внутри экрана GNU или сеанса tmux - в этом случае документы / руководства по экрану или tmux сообщат вам подробности - или вы запустили сервер для запуска в качестве службы / в фон.

Как мне в итоге убить процесс?

Большинство серверных программ будут иметь интерфейс управления (например, команды, которые вам нужно будет выполнить), и вам нужно будет найти соответствующую информацию в документации.

Или они интегрируются в процедуры запуска и управления службами linux/unix, и в этом случае вы управляете ими как любыми другими службами, например, /sbin/service fooserver start /sbin/service fooserver stop в некоторых дистрибутивах linux.

Или вы должны сделать это вручную. Найдите процесс, запустив ps -ef |grep fooserver чтобы найти его pid, и убейте его, kill <the pid> . Или посмотрите в документации, может ли ошибка написать «pid-файл» при запуске, чтобы позже вы могли найти идентификатор процесса в этом файле.

Теперь кажется, что по крайней мере у gunicorn есть аргумент -D, который используется, чтобы поместить сервер в фоновом режиме, отсоединив его от терминала, чтобы он не был убит при разрыве соединения ssh/putty. Смотрите http://gunicorn.org/configure.html#server-mechanics

Затем вам придется управлять / контролировать его вручную, то есть уничтожать, как я уже упоминал выше, отслеживать его через файл журнала, который он создает - или любые встроенные веб-приложения для мониторинга или команды, которые может иметь gnuicorn.

Здесь очевидно, что кто-то должен упаковать gnuicorn для конкретного варианта linux/ * nix и написать соответствующие сценарии и конфигурационные файлы, чтобы интегрировать его в собственное управление службами дистрибутива. (например, стандартный скрипт в /etc/init.d/ для запуска и остановки сервера, используемый во многих linux'ах)

3

1) Да, процесс запущен.

2) Вы можете запустить процесс в фоновом режиме, запустив его как

gunicorn -w 4 myapp:app &

3) Вы можете найти идентификатор процесса (pid) с помощью

ps aux | grep gunicorn

4) Чтобы убить процесс, вы можете убить его с помощью

kill (the pid you found in 3)

Чтобы принудительно остановить процесс, запустите

kill -9 (the pid you found in 3)
2

Вы могли бы использовать

nohup gunicorn -w 4 myapp:app &> /dev/null &

Это будет

  • выполнить gunicorn -w 4
  • отправить процесс в фоновом режиме - это & в конце. Вы можете просматривать фоновые задания с помощью jobs и выводить их на передний план с помощью fg $id если они, например, ожидают взаимодействия
  • отключить процесс, перенаправив стандартную ошибку и стандартный вывод в /dev/null , чтобы он не отображался в вашей оболочке &> /dev/null
  • убедитесь, что процесс не будет убит, если родитель (здесь ваша оболочка) заканчивается. nohup


РЕДАКТИРОВАТЬ:

Для мониторинга программы в целом было бы хорошо контролировать вывод программы.

Таким образом, мы можем изменить команду следующим образом:

  • дублировать стандартный вывод ошибок в стандартный поток вывода 2>&1 . Подробнее об этой конструкции можно узнать здесь: что делает «2> & 1» в командной строке?
  • перенаправить стандартный поток вывода в наш файл >~/gunicorn.log

Последняя команда будет выглядеть так:

nohup gunicorn -w 4 myapp:app 2>&1 >~/gunicorn.log &


Чтобы убить процесс, вы можете запустить серию этих команд:
ps aux | grep gunicorn

затем определите PID (я бы назвал его $PID) процесса gunicorn и остановите его:

kill $PID

или насильно останови

kill -9 $PID


Вы можете настроить его для ваших дальнейших потребностей.
1

Прочтите команду nohup(1) для запуска фоновых процессов и возможности отключения сеанса терминала.

1

В дальнейшем вы можете обнаружить, что экран GNU весьма полезен при работе с терминалом, например, замазкой.Или даже лучшая альтернатива для экрана gnu - tmux, которая становится все более популярной благодаря мощным, согласованным, хорошо документированным интерфейсам команд.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .