Запущено додаток через SSH, командний рядок тепер відсутній, що відбудеться далі?


1

Контекст: Це дуже базове питання

Використовуючи Putty і SSH вперше, щоб зробити серйозну настройку сервера і запустити в ситуацію, коли я почав процес, який я не хочу зупинятися.

Процес є gunicorn HTTP-сервер WSGI (працює на Centos 6.3).

Команда, яку я використовував для запуску процесу (згідно з їхніми Швидкий старт ):

gunicorn -w 4 myapp:app

На цьому етапі робочого сеансу я втратив командний рядок. Це повинно бути таким невирішеним питанням, що воно навіть не входить у свідомість досвідченого користувача. Але, на жаль, на моєму досвіді, мені залишилося декілька фундаментальних питань:

  • Чи означає те, що я втратив командний рядок, що процес все ще працює?
  • Як повернутися до командного рядка, не вбиваючи цей процес?
  • Як я можу повернутися і відстежувати процес пізніше?
  • Як я можу врешті-решт вбити цей процес?

Будь-яка допомога цінується, спасибі!

enter image description here

Відповіді:


2

Можна використовувати

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

Це буде

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


EDIT:

Для моніторингу програми в цілому було б добре контролювати вихід програми.

Таким чином, ми можемо змінити команду таким чином:

  • дублювати вихідні стандартні помилки до стандартного потоку виводу 2>&1. Детальніше про цю конструкцію можна знайти тут: Що робити "2 & gt; & amp; 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


Ви можете налаштувати його відповідно до ваших подальших потреб.

4

Чи означає те, що я втратив командний рядок, що процес все ще працює?

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

Як повернутися до командного рядка, не вбиваючи цей процес?

Якщо термінал ще живий, натисніть CTRL + Z, щоб повернутися до командного рядка, а потім написати bg розмістити gunicorn у фоновому режимі (і використовувати 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 знайти його під і вбити його, kill <the pid>. Або подивіться в документації сервера можна написати "pid-файл", коли він запускається, так що ви зможете знайти ідентифікатор процесу в цьому файлі пізніше.

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

Потім вам доведеться керувати / контролювати його вручну, тобто вбивати його, як я вже згадував вище, контролювати його через файл журналу, який він виробляє - або будь-який інтегрований webapp моніторингу або команди gnuicorn.

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


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)

1

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


1

Просуваючись вперед, ви можете знайти екран gnu дуже корисні під час роботи над терміналом, подібним до putty.Or або навіть краща альтернатива екран gnu - tmux , який стає все більш і більш популярним зараз завдяки своїм потужним, послідовним, добре документованим командним інтерфейсом.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.