Хранение процесса, бегущего за PuTTY или терминалом, было закрыто [копируют]

Я выполняю сервер Node.js прочь Raspbian (Debian) машина, и я хотел бы запустить и остановить сервер удаленно. Это для меня означает использовать PuTTY для доступа к оболочке, кроме тех случаев, когда я закрываюсь из терминала PuTTY, или это испытывает таймаут, мой сервер понижается с ним, потому что я просто выполняю свой сервер на переднем плане.

Существует ли способ сохранить это движением, но все еще иметь способ уничтожить процесс впоследствии?

64
05.03.2017, 17:56
4 ответа

Вашему вопросу немного недоставало деталей, таким образом, я предполагаю, что Вы подразумеваете ввод команды для запуска сервера на консоли Pi, и это выполнилось на переднем плане.

Если это верно, у Вас есть пять опций, приказанных сложностью реализовать:

  1. Использование @f-tussel's отвечает. Так как Вы плохо знакомы с GNU/Linux, & символ говорит оболочке, что это должно выполнить процесс в фоновом режиме и возвратить Вас подсказке сразу, вместо того, что это обычно делает (который является ожиданием команды для окончания прежде, чем возвратить Вас подсказке). Это технически называют, разветвляя команду к фону.

  2. Сделайте то, что Вы сделали прежде, но делаете это в a screen процесс. В основном это влечет за собой установку screen (sudo apt-get install screen в Вашей системе Debian), и затем когда-то перед вводом команды для запуска сервера, Вы выполняетесь screen. Это открывает новую оболочку, с которой можно затем снова соединиться позже, даже если Соединение на замазке умирает. Таким образом, это будет действовать, как будто Вы никогда не разъединялись.

    Если Вы незнакомы с screen, можно хотеть сделать некоторое чтение на Википедию и в страницах справочника. Можно также выполнить это то же самое с tmux.

  3. Используйте навсегда node.js модуль. См. https://stackoverflow.com/questions/4797050/how-to-run-process-as-background-and-never-die для того, где я получил это.

  4. Поместите свой сервер в a screen процесс в фоновом режиме. Это означает создание нового screen сессия в фоновом режиме, но никогда не присоединяет к нему. И, вместо того, чтобы выполнить оболочку, экранный процесс будет выполнять Ваш сервер. Вот то, что Вы введете:

    screen -d -m exec_your_server --put-args-here
    

    Если Вам нравится, можно сделать это выполнение при начальной загрузке. В основном необходимо поместить экранную команду в файл /etc/rc.local или /etc/rc.d/rc.local, Я забываю который. Если Вы сталкиваетесь с проблемой, делающей это, задаете новый вопрос.

    Снова, можно сделать это с tmux также.

  5. Запишите сервисный сценарий. Так как Вы находитесь на Debian и являетесь новыми, Вы, по-видимому, используете значение по умолчанию init тот Debian обеспечивает, который является System V Init. Я никогда не смотрел на сервисные файлы для System V Init, только systemd и маленькая Выскочка, таким образом, я не могу помочь Вам здесь. Задайте новый вопрос, если Вы хотите преследовать это.

    Это - наименьшее количество "hacky" пути, по моему скромному мнению, и это - то, что необходимо рассмотреть выполнением при выполнении долгосрочного сервера поскольку можно затем управлять им как другие сервисы на систему посредством команд как sudo service your_server stop, и т.д. При выполнении его, этот путь запустит сервер при начальной загрузке автоматически, и Вам не нужно screen потому что это также автоматически происходит в фоновом режиме.

    Это также автоматически выполняется как корень, который опасен - необходимо поместить логику в сервер для отбрасывания полномочий, которые Вы имеете путем становления непривилегированным пользователем, которого Вы создали специально для сервера. (Это - то, в случае, если сервер поставлен под угрозу - воображают, мог ли кто-то выполнить вещи как корень через Ваш сервер! Eugh. Этот вопрос делает задание OK разговора об этом.)

47
27.01.2020, 19:32

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

$  proc &

попытка использовать:

$ nohup proc &

nohup будет препятствовать тому, чтобы процесс был завершен, когда терминал разъединится. HTH.

49
27.01.2020, 19:32
  • 1
    ответа Спасибо Iv замеченный nohup также в моих поисках - это просто опечатка? Или что-то другое. Iv также замеченное использование 'экранной' команды является hohup лучшая альтернатива? –  Spencer 05.09.2013, 08:32
  • 2
    @Spencer они оба делают разные вещи. Я пишу ответ, который объясняет экран, если это полезно. –  strugee 05.09.2013, 08:35
  • 3
    Спасибо, да anythings, полезные, потому что плохо, вероятно, используют его в будущем –  Spencer 05.09.2013, 08:38
  • 4
    @Spencer: да, это была опечатка в первой строке (теперь исправленный). Ниже его был записан правильно. –  F. Tusell 05.09.2013, 10:22
  • 5
    , но если Вы используете ssh host "nohup nice command.sh &" ssh не закрылся бы впоследствии, пока command.sh не закончен. Это корректно? И как каждый решает его? –  benni 02.03.2017, 13:17

Используйте supervisord, если Вы действительно серьезны.

Основной способ сделать это для выполнения двоичного файла как:

$ nohup node app &
$ echo $! > node-instance.pid

Затем когда Вы хотите уничтожить его,

$ kill `cat node-instance.pid`

Но я использовал бы supervisord. Это позволяет Вам, делают много необычных вещей.

6
27.01.2020, 19:32
  • 1
    Что Вы имеете в виду "действительно серьезный?" –  Spencer 05.09.2013, 15:51
  • 2
    @Spencer: человек 'действительно серьезен', когда каждый думает, что было бы лучше, если бы было больше стандартизованного способа рабочих процессов демона. –  onur güngör 06.09.2013, 08:40
  • 3
    Кажется, имеет ошибку в echo node-instance.pid, когда это должно быть что-то как cat node-instance.pid, Я предполагаю. –  Luciano 20.10.2016, 19:33
  • 4
    @Luciano не нет никакой ошибки. Вы будете видеть, что это работает, когда Вы пробуете. echo TEST > node-instance.pid и затем cat node-instance.pid –  onur güngör 21.10.2016, 09:39
  • 5
    Именно это я сказал: cat filename, в порядке. Но echo filename ? –  Luciano 21.10.2016, 11:59

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

$ command &
$ disown

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

Другое решение состояло бы в том, чтобы создать сервисный файл и включить его так, можно запустить, остановиться, перезапуск или безотносительно с простой командой. (но я действительно не знаю, использует ли debian systemd, так как я нахожусь на archlinux),

5
27.01.2020, 19:32
  • 1
    Debian не использует systemd. Debian использует System V init, хотя можно установить Выскочку и systemd, если Вы хотите с некоторыми протестами. Я не могу найти вопрос на U&L о проблемах с Выскочкой, но видеть wiki.debian.org/systemd#Known_Issues_and_Workarounds - это - в основном то же, при попытке использовать Выскочку. –  strugee 06.09.2013, 00:24
  • 2
    это добилось цели для меня (ubuntu) –  aldo.roman.nurena 24.11.2014, 12:45

Теги

Похожие вопросы