Monthly Archives: Февраль 2020

Запуск приложения в режиме «daemon» в Linux

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

Первый способ

Запустить в сессии программы screen, которая не завершается при выходе пользователя.

screen -d -m команда

использованные параметры:
-d -m — Запустить новый сеанс screen, но не подключаться к нему.

Так же можно использовать параметр:
-S имя — задать имя сессии screen для удобства поиска сессии по имени.

Пример:
screen -d -m -S backgroud_ping ping 127.0.0.1

1 screen -d -m -S backgroud_ping ping 127.0.0.1

Эта команда запустит пинг адреса 127.0.0.1 и присвоит сессии имя backgroud_ping.

Для возврата к приложению и получению управления нужно:

посмотреть список активный сессий screen: screen -ls

1 screen -ls

в выводе консоли мы увидим имя и PID процесса: There is a screen on: 1218.backgroud_ping (13.05.2016 15:43:34) (Detached) 1 Socket in /var/run/screen/S-root.

123 There is a screen on:        1218.backgroud_ping     (13.05.2016 15:43:34)   (Detached)1 Socket in /var/run/screen/S-root.

запущенная сессия будет иметь имя backgroud_ping, и в данном случае, PID будет 1218.

теперь остается подключиться к процессу screen, это делается командой: screen -r номер_PID

1 screen -r номер_PID

в нашем случае это будет: screen -r 1218

1 screen -r 1218

Мы получили обратно управление над приложением.

Второй способ

Использовать утилиту nohup, которая запустит приложение с игнорированием сигналов потери связи (SIGHUP), что позволит продолжить выполнение приложения после выхода пользователя из системы. nohup команда &

1 nohup команда &

вывод будет перенаправлен вместо консоли в файл nohup.out, который будет находиться в папке из которой производился запуск. Посмотреть вывод консоли можно командой: tail -f nohup.out

1 tail -f nohup.out

Пример: nohup ping 127.0.0.1 &

1 nohup ping 127.0.0.1 &

В данном случае вернуться к приложению и получить управление нельзя. его можно только завершить командой kill.

Третий способ

Использовать утилиту start-stop-daemon, которая создана для запуска в фоне приложений, которые сами не умеют переходить в фон. start-stop-daemon -S -b -x путь_и_имя_исполняемого_файла -m -p путь_и_имя_pid_файла

1 start-stop-daemon -S -b -x путь_и_имя_исполняемого_файла -m -p путь_и_имя_pid_файла

использованные параметры:
-S — запустить;
-b — запустить в фоне;
-x — полный путь и имя исполняемого файла;
-m — создать PID-файл с номером процесса;
-p — путь и имя PID-файла.
Если требуется запустить программу с параметрами, то параметры указываются в конце, после двойного тире (подробнее — в примере).

Пример: start-stop-daemon -S -b -x /bin/ping -m -v -p /run/ping.pid — -I eth0 127.0.0.1

1 start-stop-daemon -S -b -x /bin/ping -m -v -p /run/ping.pid — -I eth0 127.0.0.1

В данном примере мы запускаем утилиту ping с параметрами (-I eth0 127.0.0.1) и создаем PID-файл (/run/ping.pid).

Для остановки программы использутся другие параметры: start-stop-daemon -K -x путь_и_имя_исполняемого_файла

1 start-stop-daemon -K -x путь_и_имя_исполняемого_файла

или start-stop-daemon -K -p путь_и_имя_pid_файла

1 start-stop-daemon -K -p путь_и_имя_pid_файла

использованные параметры:
-K — остановить;
-x — найти по имени запущенной программы;
-p — найти по PID-файлу .

Пример: start-stop-daemon -K -p /run/ping.pid

1 start-stop-daemon -K -p /run/ping.pid

Находим номер процесса, записанный в файл /run/ping.pid и останавливаем его.

Более правильно всегда использовать PID-файлы, потому что имя запускаемой программы не всегда равно имени запущенного процесса.

Источник: https://blackdiver.net/it/linux/4164