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

Оболочка на компьютере Linux.

Фатмавати Ахмад Дзэнури / Shutterstock.com



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

Все о процессах

Каждый раз, когда программа выполняется в Linux или Unix-подобной операционной системе, запускается процесс. Процесс - это имя внутреннего представления исполняемой программы в памяти компьютера. Для каждой активной программы есть свой процесс. Фактически, существует процесс почти для всего, что работает на вашем компьютере. Это включает в себя компоненты вашего графическая среда рабочего стола (GDE) такие как ГНОМ или ГДЕ , и система демоны которые запускаются при запуске.





Почему Около все, что работает? Ну, встроенные модули Bash, такие как компакт диск , pwd , и псевдоним не нужно запускать (или порождать) процесс при их запуске. Bash выполняет эти команды в экземпляре оболочки Bash, запущенной в окне вашего терминала. Эти команды бывают быстрыми именно потому, что для их выполнения не требуется запускать процесс. (Вы можете ввести help в окне терминала, чтобы увидеть список встроенных модулей Bash.)

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



Грязный пример

Начнем с простого ping трассировка бега . Мы собираемся ping домен How-To Geek. Это будет выполняться как процесс переднего плана.

ping

Реклама

Получаем ожидаемые результаты, прокручивая окно терминала вниз. В окне терминала мы больше ничего делать не можем, пока Ctrl+C это работает. Чтобы завершить команду, нажмите Ctrl+C.



ping

Видимый эффект Ctrl+Z выделено на скриншоте. Ctrl+C дает краткое изложение и затем останавливается.

Давай повторим это. Но на этот раз мы нажмем Ctrl+Z вместо jobs. Задача не будет завершена. Это станет фоновой задачей. Мы получаем возвращенное нам управление окном терминала.

ps T

Видимый эффект от удара - выделено на скриншоте.

На этот раз нам говорят, что процесс остановлен. «Остановлен» не означает прекращен. Это как машина на знаке остановки. Мы его не утилизировали и не выбросили. Он все еще в дороге, неподвижен, ждет, чтобы уйти. Процесс теперь является фоном работа .

T команда перечислит вакансии которые были запущены в текущем терминальном сеансе. А поскольку задания (неизбежно) являются процессами, мы также можем использовать jobs команда, чтобы увидеть их. Давайте воспользуемся обеими командами и сравним их результаты. Мы будем использовать + option (терминал), чтобы вывести список только тех процессов, которые выполняются в этом окне терминала. Обратите внимание, что дефис использовать не обязательно ps с Ss вариант.

T ping

Ctrl+Z команда сообщает нам:

    [один]: Число в квадратных скобках - это номер задания. Мы можем использовать это для ссылки на задание, когда нам нужно управлять им с помощью команд управления заданием. +: Знак плюса ps T показывает, что это задание, которое будет выполняться, если мы используем команду управления заданием без конкретного номера задания. Это называется заданием по умолчанию. Заданием по умолчанию всегда является последнее, добавленное в список заданий. Остановлен: Процесс не запущен. пинг www.howtogeek.com: Командная строка, запустившая процесс.

R команда сообщает нам:

    PID: Идентификатор процесса. У каждого процесса есть уникальный идентификатор. Телетайп: Псевдотелетайп (окно терминала), из которого был запущен процесс. ГОСУДАРСТВО: Статус процесса. ВРЕМЯ: Количество процессорного времени, потребляемого процессом. КОМАНДА: Команда, запустившая процесс.

Это общие значения для столбца STAT:

    D: Непрерывный сон. Процесс находится в состоянии ожидания, обычно ожидая ввода или вывода, и его нельзя прервать. я: Праздный. р: Бег. S: Непрерывный сон. Т: Остановлен сигналом управления заданием. С УЧАСТИЕМ: Процесс зомби. Процесс был остановлен, но его родительский процесс не очистил его.
Реклама

За значением в столбце STAT может следовать один из этих дополнительных индикаторов:

    <: Высокоприоритетная задача (не нравится другим процессам). N: Низкоприоритетный (приятен для других процессов). L: process имеет страницы, заблокированные в памяти (обычно используются процессами реального времени). s: Лидер сеанса. Лидер сеанса - это процесс, запустивший группы процессов. Оболочка - это лидер сеанса. L: Многопоточный процесс. +: Процесс переднего плана.

Мы видим, что Bash находится в состоянии +. Заглавная буква S говорит нам, что оболочка Bash спит, и ее можно прервать. Как только он нам понадобится, он ответит. Строчная буква s говорит нам, что оболочка является лидером сеанса.

Команда ping находится в состоянии ps T. Это говорит нам, что bg был остановлен сигналом управления заданием. В этом примере это был bg раньше мы помещали его на задний план.

ping команда имеет состояние ping, что означает выполнение. Ctrl+C указывает, что этот процесс является членом группы переднего плана. Итак, ping команда выполняется на переднем плане.

Команда bg

fg Команда используется для возобновления фонового процесса. Его можно использовать с номером задания или без него. Если вы используете его без номера задания, задание по умолчанию выводится на передний план. Процесс по-прежнему работает в фоновом режиме. Вы не можете отправлять в него какие-либо данные.

Если мы выдадим bg команда, мы возобновим нашу fg команда:

ping

Реклама

ping команда возобновляется, и мы снова видим прокручиваемый вывод в окне терминала. Вам отображается имя команды, которая была перезапущена. Это выделено на скриншоте.

возобновлен фоновый процесс ping с выводом в окно терминала

Но у нас есть проблема. Задача выполняется в фоновом режиме и не принимает ввод. Так как же нам это остановить? ping ничего не делает. Мы можем видеть это, когда набираем его, но фоновая задача не получает этих нажатий клавиш, поэтому продолжает весело пинговать.

Фактически, мы сейчас находимся в странном смешанном режиме. Мы можем печатать в окне терминала, но то, что мы набираем, быстро сметается прокручивающимся выводом из Ctrl+C команда. Все, что мы печатаем, действует заранее.

Чтобы остановить нашу фоновую задачу, нам нужно вывести ее на передний план, а затем остановить.

Команда fg

Ctrl+C команда выведет фоновую задачу на передний план. Так же, как Ctrl+Z команда, ее можно использовать с номером задания или без него. Использование его с номером задания означает, что он будет работать с конкретным заданием. Если он используется без номера задания, используется последняя команда, отправленная в фоновый режим.

Если мы наберем kill наш kill команда будет выведена на передний план. Вводимые нами символы смешиваются с выводом из kill -l команда, но они обрабатываются оболочкой, как если бы они были введены в командной строке как обычно. Фактически, с точки зрения оболочки Bash, именно это и произошло.

kill

Реклама

И теперь, когда у нас есть Ctrl+C команда, запущенная на переднем плане еще раз, мы можем использовать Ctrl+D убить его.

kill

Нам нужно посылать правильные сигналы

Это было не совсем красиво. Очевидно, что выполнение процесса в фоновом режиме работает лучше всего, когда процесс не производит вывода и не требует ввода.

Но, беспорядочно или нет, наш пример действительно выполнил:

  • Помещение процесса на задний план.
  • Восстановление процесса в работающее состояние в фоновом режиме.
  • Возвращение процесса на передний план.
  • Завершение процесса.

Когда вы используете Ctrl+Z и kill , вы отправляете сигналы процессу. Эти стенографические способы использования Ctrl+Z команда. Есть 64 разных сигнала что bg может отправить. Используйте & в командной строке, чтобы перечислить их. jobs не единственный источник этих сигналов. Некоторые из них автоматически вызываются другими процессами в системе.

Вот некоторые из наиболее часто используемых.

    SIGHUP: Signal 1. Автоматически отправляется процессу при закрытии терминала, в котором он запущен. SIGINT: Signal 2. Отправлено процессу, который вы нажали kill. Процесс прерывается и требует прекращения. ТАК МНОГО: Signal 3. Отправляется процессу, если пользователь отправляет сигнал выхода jobs. СИГКИЛЛ: Signal 9. Процесс немедленно прекращается и не пытается полностью завершить работу. Процесс не идет изящно. SIGTERM: Signal 15. Это сигнал по умолчанию, отправляемый kill. Это стандартный сигнал завершения программы. SIGTSTP: Signal 20. Отправляется процессу, когда вы используете %. Он останавливает процесс и переводит его в фоновый режим.

Мы должны использовать kill команда для выдачи сигналов, которым не назначены сочетания клавиш.

Дальнейший контроль работы

Процесс перешел в фоновый режим с помощью SIGTERM находится в остановленном состоянии. Мы должны использовать kill команда, чтобы запустить его снова. Запустить программу как работающий фоновый процесс очень просто. Добавьте амперсанд kill до конца командной строки.

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

Реклама

пока правда; делать эхо How-To Geek Loop Process; сон 3; Выполнено &

Нам сообщают номер задания и идентификатор процесса. Номер нашей работы - 1, а идентификатор процесса - 1979. Мы можем использовать эти идентификаторы для управления процессом.

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

ls

вывод процесса фонового цикла, перемежающийся с выводом других команд

Чтобы остановить наш процесс, мы можем использовать SIGKILL чтобы напомнить себе номер задания, а затем используйте kill.

SIGINT сообщает, что наш процесс - это работа номер 1. Чтобы использовать этот номер с SISQUIT перед ним должен стоять знак процента SIGSTP.

& SIGTERM

СВЯЗАННЫЙ: Как работают сигналы Linux: SIGINT, SIGTERM и SIGKILL

SIGKILL отправляет

ping www.howtogeek.com
сигнал, номер сигнала 15, процессу, и он завершается. При следующем нажатии клавиши Enter отображается состояние задания. Он перечисляет процесс как завершенный. Если процесс не отвечает на
Ctrl+C
команда, вы можете поднять ее на ступеньку выше. Используйте
ping www.howtogeek.com
с
Ctrl+Z
, сигнал номер 9. Просто поместите цифру 9 между
jobs
введите номер задания.

ps T

Вещи, которые мы рассказали

    Ctrl + C: Посылает
    bg
    , сигнал 2, процессу - если он принимает ввод - и приказывает ему завершить работу. Ctrl + D: Посылает
    fg
    , сигнал 3, процессу - если он принимает ввод - и приказывает ему выйти. Ctrl + Z: Посылает процессу
    Ctrl+C
    , сигнал 20, и приказывает ему остановиться (приостановить) и перейти в фоновый процесс. рабочие места: Список фоновых заданий и их номер. bg job_number : Перезапускает фоновый процесс. Если вы не укажете номер задания, будет использоваться последний процесс, который был преобразован в фоновую задачу. фг job_number : выводит фоновый процесс на передний план и перезапускает его. Если вы не укажете номер задания, будет использоваться последний процесс, который был преобразован в фоновую задачу.
  • командная строка & : Добавление амперсанда
    jobs
    до конца командной строки выполняет эту команду как запущенную фоновую задачу.
  • убить% job_number : Посылает
    kill %1
    , сигнал 15 процессу, чтобы завершить его. убить 9 % job_number : Посылает
    kill 9 %1
    , сигнал 9, процессу и внезапно завершает его.

СВЯЗАННЫЙ: Как убить процессы из терминала Linux

Команды Linux
Файлы деготь · pv · Кот · такс · chmod · рукоятка · разница · sed · С участием · человек · толкать · popd · fsck · тестовый диск · seq · fd · пандок · компакт диск · $ ПУТЬ · awk · присоединиться · jq · складывать · уникальный · journalctl · хвостик · государство · ls · fstab · выбросил · меньше · chgrp · Chown · rev · Посмотрите · струны · тип · переименовать · застегивать · распаковать · устанавливать · размонтировать · установить · fdisk · mkfs · rm · rmdir · rsync · df · gpg · мы · нано · mkdir · от · пер · пластырь · конвертировать · rclone · крошить · SRM
Процессы псевдоним · экран · верхняя · Ницца · Ренис · прогресс · Strace · система · tmux · чш · история · в · партия · бесплатно · который · dmesg · usermod · пс · chroot · xargs · tty · мизинец · lsof · vmstat · тайм-аут · стена · да · убийство · спать · судо · его · время · groupadd · usermod · группы · lshw · неисправность · перезагружать · останавливаться · выключение · пароль · lscpu · crontab · Дата · bg · фг
Сети netstat · пинг · трассировка · ip · SS · кто · fail2ban · бмон · ты · Палец · nmap · ftp · завиток · wget · ВОЗ · кто я · В · iptables · ssh-keygen · ufw

СВЯЗАННЫЙ: Лучшие ноутбуки с Linux для разработчиков и энтузиастов

ПРОЧИТАЙТЕ СЛЕДУЮЩИЙ Фотография профиля Дэйва Маккея Дэйв Маккей
Дэйв Маккей впервые использовал компьютеры, когда в моде была перфолента, и с тех пор он занимается программированием. Проработав более 30 лет в ИТ-индустрии, он теперь работает журналистом в области информационных технологий. За свою карьеру он работал программистом-фрилансером, менеджером международной группы разработчиков программного обеспечения, менеджером проекта ИТ-услуг, а в последнее время - специалистом по защите данных. Его статьи были опубликованы на сайтах howtogeek.com, cloudsavvyit.com, itenterpriser.com и opensource.com. Дэйв - евангелист Linux и сторонник открытого исходного кода.
Прочитать полную биографию

Интересные статьи