В Linux, как предотвратить остановку фонового процесса после закрытия клиента SSH - PullRequest
279 голосов
/ 12 ноября 2008

Я работаю на машине с Linux через SSH (Putty). Мне нужно оставить процесс работающим ночью, поэтому я подумал, что могу сделать это, запустив процесс в фоновом режиме (с амперсандом в конце команды) и перенаправив стандартный вывод в файл. К моему удивлению, это не работает. Как только я закрываю окно Putty, процесс останавливается.

Как я могу предотвратить это?

Ответы [ 20 ]

5 голосов
/ 12 ноября 2008

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

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

5 голосов
/ 12 ноября 2008

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

nohup /bin/sh -c "echo \$\$ > $pidfile; exec $FOO_BIN $FOO_CONFIG  " > /dev/null

Nohup делает процесс, который вы запускаете, невосприимчивым к завершению, которое сеанс SSH и его дочерние процессы уничтожают при выходе из системы. Команда, которую я дал, предоставляет вам способ сохранить pid приложения в pid-файле, чтобы вы могли корректно уничтожить его позже и позволить процессу запускаться после выхода из системы.

4 голосов
/ 12 ноября 2008

Использовать экран. Он очень прост в использовании и работает как vnc для терминалов. http://www.bangmoney.org/presentations/screen.html

2 голосов
/ 14 августа 2013

Добавьте эту строку к вашей команде:> & - 2> & - <& - &. > & - означает закрытый стандартный вывод. 2> & - означает закрыть stderr. <& - означает закрытие стандартного ввода. & означает запуск в фоновом режиме. Это также работает для программного запуска задания через ssh: </p>

$ ssh myhost 'sleep 30 >&- 2>&- <&- &'
# ssh returns right away, and your sleep job is running remotely
$
2 голосов
/ 16 июня 2012

Существует также команда daemon пакета libslack с открытым исходным кодом.

daemon вполне настраивается и заботится обо всех утомительных вещах демона, таких как автоматический перезапуск, ведение журнала или обработка pidfile.

2 голосов
/ 30 мая 2012

Я бы также пошел за экранную программу (я знаю, что еще один ответ был на экране, но это завершение)

не только тот факт, что &, ctrl + z bg disown, nohup и т. Д. Может преподнести вам неприятный сюрприз, что когда вы выйдете из системы, работа все равно будет убита (я не знаю почему, но это случилось со мной, и это не не беспокойтесь, потому что я переключился на использование экрана, но я думаю, что решение anthonyrisinger, поскольку двойное разветвление решило бы это), также экран имеет преимущество major по сравнению с просто отступлением:

screen will background your process without losing interactive control to it

и между прочим, это вопрос, который я бы никогда не задал в первую очередь :) ... я использую screen с самого начала, чтобы что-то делать в любом unix ... я (почти) НИКОГДА не работаю в оболочке unix / linux без запуска экрана сначала ... и я должен остановиться сейчас, или я начну бесконечное представление о том, что хороший экран и что может сделать для вас ... посмотрите сами, оно того стоит;)

2 голосов
/ 15 ноября 2011

Если вы также хотите запускать X-приложения - используйте xpra вместе с "screen".

1 голос
/ 26 декабря 2017

В systemd / Linux systemd-run - хороший инструмент для запуска независимых от сеанса процессов. Ненавистники будут ненавидеть

1 голос
/ 06 февраля 2017

Принятый ответ предлагает использовать nohup . Я бы предпочел использовать pm2 . Использование pm2 над nohup имеет много преимуществ, таких как поддержание приложения в рабочем состоянии, поддержка файлов журнала для приложения и многие другие функции. Для более подробной информации проверьте это .

Для установки pm2 вам необходимо скачать npm . Для системы на основе Debian

sudo apt-get install npm

и для Redhat

sudo yum install npm

Или вы можете следовать этим инструкциям . После установки npm используйте его для установки pm2

npm install pm2@latest -g

Как только вы закончите, вы можете запустить ваше приложение по

$ pm2 start app.js              # Start, Daemonize and auto-restart application (Node)
$ pm2 start app.py              # Start, Daemonize and auto-restart application (Python)

Для мониторинга процесса используйте следующие команды:

$ pm2 list                      # List all processes started with PM2
$ pm2 monit                     # Display memory and cpu usage of each app
$ pm2 show [app-name]           # Show all informations about application

Управление процессами с использованием либо имени приложения, либо идентификатора процесса, либо управление всеми процессами вместе:

$ pm2 stop     <app_name|id|'all'|json_conf>
$ pm2 restart  <app_name|id|'all'|json_conf>
$ pm2 delete   <app_name|id|'all'|json_conf>

Файлы журналов можно найти в

$HOME/.pm2/logs #contain all applications logs

Двоичные исполняемые файлы также можно запускать с использованием pm2. Вы должны внести изменения в файл Джейсона. Измените "exec_interpreter" : "node" на "exec_interpreter" : "none". (см. Раздел атрибутов ).

#include <stdio.h>
#include <unistd.h>  //No standard C library
int main(void)
{
    printf("Hello World\n");
    sleep (100);
    printf("Hello World\n");

    return 0;
}

Компиляция кода выше

gcc -o hello hello.c  

и запустить его с np2 в фоновом режиме

pm2 start ./hello
1 голос
/ 12 ноября 2015

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

https://www.rackaid.com/blog/linux-screen-tutorial-and-how-to/#starting

...