Фоновый запуск приложения linux

Запуск программ в фоновом режиме на Linux

При работе в ОС семейства Linux бывают случаи, когда необходимо запустить некий долгий процесс, например поиск файла, и при этом вернуться к работе в консоли. Вполне разумным решением будет открыть несколько терминалов и выполнить каждую задачу индивидуально, но что если мы не ищем легких путей? В этом случае разумным было бы запустить процесс в фоновом режиме. Рассмотрим как это сделать двумя способами.

Для начала следует разобрать синтаксис командной строки. Запуск одной программы/скрипта и т.д. выполняем явным указанием, например:

Для запуска одной программы по завершении другой используется логический оператор && (двойной амперсанд), например:

Не очень удачный пример, так как можно было использовать перенаправление “|”, приблизительно это выглядело бы так:

Все эти примеры замечательны для использования в скриптах, однако запуск “долгих” процессов сделает терминал недоступным, как это было отмечено выше. В этом случае поможет следующий пример:

Именно одинарный & в конце строки, указанный через пробел.

Запуск программ в фоновом режиме на Linux

Как видно, первая строка запускает процесс, но так как в системе мало txt-файлов, процесс завершается. Последующее нажатие Enter в терминале сообщает, что процесс успешно выполнен.

Рассмотрим другой вариант. Воспользуемся утилитой ping, результаты будем писать в файл.

Запуск программ в фоновом режиме на Linux

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

Завершение процесса через killall покажет что процесс не завершился самостоятельно, а был “убит”.

Контролировать фоновые процессы, в данном случае, можно командой:

Выбор нового пароля

Сама команда jobs покажет сколько процессов выполняется и что именно выполняется, но различные ключи помогают отобразить больше информации. Ключ -l покажет еще и системный идентификатор процесса (PID). Ключ -p выведет только PID’ы, без описания.

Для перехода в приоритетный режим можно использовать команду fg 1 или %1.

Запуск программ в фоновом режиме на Linux

Воспользоваться утилитой-мультиплексором screen. В некоторых дистрибутивах требуется установка.

Источник

Команда nohup в Linux

В Linux команда nohup (HangUP) поддерживает работу процессов даже после выхода из оболочки или терминала.

Примеры использования команды nohup в Linux

Команда предотвращает получение процессами или заданиями сигнала SIGHUP, который отправляется процессу при закрытии или выходе из терминала.

Синтаксис

Ввод и вывод

Если стандартный ввод является терминалом, то он берётся из нечитаемого файла.

Если стандартный вывод является терминалом, то вывод добавляется в nohup.out , при наличии возможности, в противном случае — сюда:

Если стандартный поток ошибок является терминалом, то он перенаправляется в стандартный вывод. Запись вывода в ФАЙЛ осуществляется так:

Читайте также:  Linux подключение usb накопителя

Использование команды nohup в Linux

Проверка версии утилиты

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

oleg@mobile:~:$ nohup --v nohup (GNU coreutils) 9.1 Copyright (C) 2022 Free Software Foundation, Inc. Лицензия GPLv3+: GNU GPL версии 3 или новее. Это свободное ПО: вы можете изменять и распространять его. Нет НИКАКИХ ГАРАНТИЙ в пределах действующего законодательства. Автор программы — Jim Meyering. oleg@mobile:~:$

Запуск процесса

Для того чтобы процессы/задания выполнялись в оболочке и не были бы уничтожены при выходе из неё команда выполняется так:

oleg@mobile:~:$ nohup ~/Directory/convert.sh nohup: ввод игнорируется, вывод добавляется в 'nohup.out' oleg@mobile:~:$ 

В скрипт я внёс ошибку. Вывод команды был сохранен в nohup.out :

oleg@mobile:~:$ cat nohup.out mkdir: невозможно создать каталог «thumbnails»: Файл существует convert: unable to open image '*.jpg': Нет такого файла или каталога @ error/blob.c/OpenBlob/3569. convert: no images defined `thumbnails/*.jpg.png' @ error/convert.c/ConvertImageCommand/3342. oleg@mobile:~:$ 

Вывод можно также перенаправить в другой файл:

oleg@mobile:~:$ nohup ~/Directory/convert.sh > output.txt nohup: ввод игнорируется и поток ошибок перенаправляется на стандартный вывод oleg@mobile:~:$ cat output.txt mkdir: невозможно создать каталог «thumbnails»: Файл существует convert: unable to open image '*.jpg': Нет такого файла или каталога @ error/blob.c/OpenBlob/3569. convert: no images defined `thumbnails/*.jpg.png' @ error/convert.c/ConvertImageCommand/3342. oleg@mobile:~:$ 

Можно перенаправить в файл и стандартную ошибку и вывод с использованием атрибута 2>&1 :

oleg@mobile:~:$ nohup ~/Directory/convert.sh > output.txt 2>&1 oleg@mobile:~:$ cat output.txt nohup: ввод игнорируется mkdir: невозможно создать каталог «thumbnails»: Файл существует convert: unable to open image '*.jpg': Нет такого файла или каталога @ error/blob.c/OpenBlob/3569. convert: no images defined `thumbnails/*.jpg.png' @ error/convert.c/ConvertImageCommand/3342. oleg@mobile:~:$ 

Запуск процесса в фоновом режим

Для запуска процесса в фоновом режиме в конце команды добавляется символ & . Для примера пингуем linuxcookbook.ru и отправляем его в фоновый режим:

oleg@mobile:~:$ nohup ping linuxcookbook.ru & [1] 122843 oleg@mobile:~:$ nohup: ввод игнорируется, вывод добавляется в 'nohup.out' oleg@mobile:~:$ cat nohup.out PING linuxcookbook.ru (139.162.132.20) 56(84) bytes of data. 64 bytes from li1398-20.members.linode.com (139.162.132.20): icmp_seq=1 ttl=52 time=43.5 ms 64 bytes from li1398-20.members.linode.com (139.162.132.20): icmp_seq=2 ttl=52 time=41.2 ms 64 bytes from li1398-20.members.linode.com (139.162.132.20): icmp_seq=3 ttl=52 time=37.3 ms 64 bytes from li1398-20.members.linode.com (139.162.132.20): icmp_seq=4 ttl=52 time=40.2 ms 64 bytes from li1398-20.members.linode.com (139.162.132.20): icmp_seq=5 ttl=52 time=36.5 ms 64 bytes from li1398-20.members.linode.com (139.162.132.20): icmp_seq=6 ttl=52 time=39.1 ms 64 bytes from li1398-20.members.linode.com (139.162.132.20): icmp_seq=7 ttl=52 time=39.5 ms 64 bytes from li1398-20.members.linode.com (139.162.132.20): icmp_seq=8 ttl=52 time=38.7 ms 64 bytes from li1398-20.members.linode.com (139.162.132.20): icmp_seq=9 ttl=52 time=41.1 ms . oleg@mobile:~:$

Для проверки работы процесса в фоне применяется команда pgrep с опцией -a :

oleg@mobile:~:$ pgrep -a ping 122843 ping linuxcookbook.ru oleg@mobile:~:$ 

Остановка запущенного процесса

Для остановки запущенного процесса используется команда kill , за которой следует идентификатор (ID) процесса:

oleg@mobile:~:$ kill 122843 oleg@mobile:~:$ 

Выводы

Из приведённых примеров использования в Linux команды nphup следует:

  • все процессы, запущенные с помощью этой команды, будут игнорировать сигнал SIGHUP даже после выхода из оболочки;
  • как только задание запущено или выполнено, стандартный ввод будет недоступен для пользователя;
  • файл nohup.out используется по умолчанию для stdout и stderr .
Читайте также:  Heroes 3 complete linux

Источник

Как управлять фоновыми процессами в Linux

Светящаяся башня на фоне более темных высотных зданий ночью.

Если вы только начинаете работать с Linux и уже пробовали вводить команды в терминале, вы могли заметить, что для ввода каждой новой команды вам приходится ждать, пока уже начатый процесс завершится. Так происходит потому, что по умолчанию при запуске команды процесс начинается в активном окне терминала, — пишет сайт hexx.in.ua в своем переводе статьи «How to manage background processes in Linux».

Что делать, когда надо запустить другую команду? Можно открыть еще одну сессию терминала, но можно обойтись и без этого. Давайте рассмотрим, как управлять фоновыми и приоритетными процессами в Linux.

Но сначала давайте разберемся, что такое фоновый и приоритетный процесс.

Приоритетный процесс — это та задача, которую в настоящее время выполняется в активном окне терминала. То есть, приоритетным в каждой сессии терминала может быть только один процесс. Прежде чем начать новый приоритетный процесс, придется подождать окончания предыдущего.

Примером может быть выполнение любой команды в текущей сессии.

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

Наиболее распространенный пример процесса, работающего в фоне, — веб-сервер.

Давайте попробуем запустить команду vmstat.

shaikh@shaikhu-com:~$ vmstat 5 procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu----- r b swpd free buff cache si so bi bo in cs us sy id wa st 0 0 0 3045156 167484 2449380 0 0 80 56 469 1138 19 5 76 0 0 1 0 0 3044644 167492 2450152 0 0 0 92 299 604 2 1 98

Эта команда показывает использование памяти и cpu в режиме реального времени. В качестве опции указываем 5 — это задержка перед выводом обновленных данных. Команда каждые 5 секунд будет выводить новую строку с данными, пока вы не прервете ее выполнение (пока не завершите начатый процесс). Для этого надо нажать CTL + C. А если вы хотите поставить процесс на паузу или остановить, надо нажать CTL + Z.

bg: перемещение задачи в фон

Предположим, вы хотите переместить в фон задание, выполнение которого уже началось (чтобы можно было делать в терминале что-то другое). Для этого надо нажать CTL + Z, а затем запустить команду bg (сокращение от background).

Давайте запустим выполнение какой-то приоритетной задачи. Например, будем записывать CPU-статистику в файл. Как видите, мы не можем ввести какую-то другую команду, поскольку эта задача выполняется в активном окне терминала (оно приоритетное).

shaikh@shaikhu-com:~$ vmstat 5 >> vmstat.txt

Давайте поставим эту задачу на паузу, нажав CTL + Z, а затем выполним команду bg.

shaikh@shaikhu-com:~$ vmstat 5 >> vmstat.txt ^Z [1]+ Stopped vmstat 5 >> vmstat.txt shaikh@shaikhu-com:~$ bg [1]+ vmstat 5 >> vmstat.txt & shaikh@shaikhu-com:~$

Теперь эта задача выполняется в фоне, а терминал свободен для введения новых команд.

Как сразу приступить к выполнению команды в фоне

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

shaikh@shaikhucom:~$ sleep 400 & [2] 11122 shaikh@shaikhucom:~$

jobs: команда для проверки задач в текущем терминале

С помощью этой команды можно вывести все задачи, которые запущены в текущем терминале.

shaikh@shaikhucom:~$ jobs [1]- Running vmstat 5 >> vmstat.txt & [2]+ Running sleep 400 & shaikh@shaikhucom:~$

Номера в квадратных скобках [n] это номера (или идентификаторы) задач. Нумерация начинается с единицы. Знак «+» указывает на процесс, который был запущен последним, а «-» — на предпоследний процесс.

Читайте также:  Best linux windows gaming

Если вы хотите увидеть идентификаторы самих процессов, надо использовать опцию -l:

shaikh@shaikhucom:~$ jobs -l [1]- 10216 Running vmstat 5 >> vmstat.txt & [2]+ 11122 Running sleep 400 & shaikh@shaikhucom:~$

Номера 10216 и 11122 — это идентификаторы процессов.

Возможные опции, которые можно использовать с командой jobs:

  • -l — вывести список идентификаторов процессов в дополнение к обычной информации
  • -n — перечислить только процессы, изменившие статус с последнего сообщения
  • -r — ограничить вывод только запущенными задачами
  • -s — ограничить вывод только остановленными задачами.

kill% n: прекращение выполнения задания с идентификатором n

Для прерывания заданий используется команда kill. Чтобы указать, какое именно задание надо прекратить выполнять, используется знак %, за которым следует номер задания.

haikh@shaikhu-com:~$ jobs [1]- Running vmstat 5 >> vmstat.txt & [2]+ Running sleep 400 & shaikh@shaikhucom:~$ kill %2 shaikh@shaikhucom:~$ jobs [1]+ Running vmstat 5 >> vmstat.txt & shaikh@shaikhucom:~$

Как видите, теперь у нас только один процесс в фоне. Причем знак «+» показывает, что это последняя из запущенных задач.

fg: команда для перемещения задачи в интерактивный режим

Чтобы переместить задачу в активное окно терминала (на передний план), используется команда fg (сокращение от foreground). По умолчанию (то есть, если не указать никаких опций), на передний план переместится процесс, который был запущен последним.

shaikh@shaikhucom:~$ jobs [1] Running vmstat 5 >> vmstat.txt & [2]- Running sleep 400 & [3]+ Running sleep 500 & shaikh@shaikhucom:~$ fg sleep 500 [2] Done sleep 400 shaikh@shaikhucom:~$

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

Команда ps позволяет увидеть все процессы

Чтобы увидеть все активные процессы, используйте команду ps. При этом можно добавить следующие опции:

  • ps ax — чтобы увидеть все процессы, недавно активные в системе. Список будет очень длинным, поэтому добавьте в конвейер less или more.
  • ps T — чтобы увидеть все процессы, выполняемые в текущем терминале.
shaikh@shaikhucom:~$ ps T PID TTY STAT TIME COMMAND 5786 pts/0 Ss 0:00 bash 10216 pts/0 S 0:00 vmstat 5 12983 pts/0 R+ 0:00 ps T shaikh@shaikhucom:~$

Выводы

Мы рассмотрели команды, которые позволяют управлять фоновыми и приоритетными процессами:

  • bg и fg — для перемещения задач в фон и обратно, в активное окно;
  • jobs — для вывода списка активных задач в текущем терминале;
  • kill — для прерывания процесса;
  • ps — для вывода списка активных и запущенных процессов.

Мы также научились запускать задачи в фоне, добавив к команде знак &.

Источник

Оцените статью
Adblock
detector