Лекция №14 - Процессы, задачи. Команды fg, bg, jobs, top, nohup

В этой лекции мы закончим тему процессов и сигналов в Linux и перейдем к теме монтирования файловых систем. На прошлой лекции мы неоднократно использовали знак & (амперсанд) в конце команды (sleep 100 &). Знак амперсанда в конце команды означает, что запускаемый процесс нужно будет перевести в фоновый режим.Если запустить команду sleep 100 без знака &, то мы не получим приглашение в командной строке пока не будет завершен процесс sleep.

Запущенные из консоли с помощью амперсанда команды, работают в фоновом режиме и называются задачами (jobs). Можно сказать, что задачи это процессы, привязанные к командному интерпретатору. Такие задачи помимо традиционного PID имеют еще свою нумерацию начинающуюся с единицы. Просмотреть запущенные задачи интерпретатора, можно командой jobs. В примере ниже показана ситуация когда есть две задачи и выполнение одного из них остановлено.

1
2
3
$ jobs
[1]+  Stopped                 top
[2]-  Running                 sleep 100 &

Наберите в консоли команду top. Эта команда показывает в реальном времени существующие процессы, но не все, а только ту часть которая помещается на экране. Чуть позже мы вернемся к этой команде. Пока вы можете заметить, что top не возвращает управление командному интерпретатору. Можно либо выйти из программы (нажав q) или остановить процесс комбинацией клавиш ctrl+z (не путайте комбинации ctrl+c - завершение процесса и ctrl+z - остановка процесса). Остановленный процесс top мы и видели на примере выше. Для того, чтобы возобновить работу данного процесса (задачи) есть две команды: fg и bg, сокращения от английских слов foreground (передний план) и background (задний план). Синтаксис простой: fg номер задачи. Команда fg, работает не только с остановленными задачами, но и с задачами вообще. В нашем примере команда fg 2 выведет процесс sleep на передний план и приглашение командного интерпретатора станет недоступным (так как будто мы запустили команду sleep без символа &). Команда fg 2 возобновит работу процесса top и выведет его на передний план. Команда fg без параметра возобновит работу последнего процесса остановленного комбинацией ctrl+z, а если таковых не окажется, то выведет на передний план последнюю задачу (задачу с большим порядковым номером). Задача, которая будет восстановлена (отображена) командой fg без параметра отмечена знаком + в выводе результатов команды jobs. Команда bg предназначена для восстановления работы остановленных процессов (задач) в фоновом режиме.

Отметьте для себя также, что задачи имеют свою нумерацию для каждого терминала (консоли). Если вы зарегистрируетесь в другой консоли и запустите в фоновом режиме процесс, то номер задачи будет начинаться с единицы. Также вы не найдете справки по командам fg и bg (man fg, man bg). Потому, что эти команды являются частью bash. И упоминание о них вы найдете в man bash.

Любые процессы запущенные из командного интерпретатора являются дочерними для него. И PPID таких процессов будет равен PID соответствующего командного интерпретатора. Если выйти из командного интерпретатора, то все процессы запущенные из него (в том числе и находящиеся в фоновом режиме) будут завершены. Зарегистрируйтесь в двух консолях и запустите во второй несколько процессов, перейдите в первую и выполните команду ps al:

1
2
3
4
5
6
7
8
9
$ ps al
F   UID   PID  PPID PRI  NI    VSZ   RSS WCHAN  STAT TTY        TIME COMMAND
0  1000 13180  1053  20   0   6292  3552 wait   Ss   pts/0      0:00 bash
0  1000 16442  1054  20   0   6292  3560 wait   Ss   pts/1      0:00 bash
0  1000 16460 16442  20   0   2952   628 signal T    pts/1      0:00 sleep 200
0  1000 16461 16442  20   0  18416  4392 signal T    pts/1      0:00 mocp
0  1000 16469 16442  20   0   2952   628 hrtime S    pts/1      0:00 sleep 1000
0  1000 16470 16442  20   0   2468  1208 poll_s S+   pts/1      0:00 top
0  1000 16473 13180  20   0   2424   828 -      R+   pts/0      0:00 ps al

В примере у нас запущено два командных интерпретатора bash с PID равными 13180 и 16442. Далее идут 4-е процесса, которые были запущены из второго командного интерпретатора - их можно определить по PPID равному 16442. Теперь выйдите (команда exit) из второго интерпретатора и снова выполните команду ps al в первом интерпретаторе:

1
2
3
4
$ ps al
F   UID   PID  PPID PRI  NI    VSZ   RSS WCHAN  STAT TTY        TIME COMMAND
0  1000 13180  1053  20   0   6292  3556 wait   Ss   pts/0      0:00 bash
0  1000 16679 13180  20   0   2424   824 -      R+   pts/0      0:00 ps al

Как видим завершился не только процесс с PID 16442, но и все процессы потомки (PPID 16442). Еще одно подтверждение того, что процесс-потомок не может существовать без родительского процесса.

Но, что делать если необходимо запустить процесс, и выйти из консоли так чтобы процесс продолжал работать в системе? Выход один - передать процесс-потомок другому процессу, который будет для него родительским. Такая возможность реализована в команде nohup. Данная команда позволяет запускать процессы, который будут оторваны от терминала если, терминал будет закрыт. Проводим эксперимент. Запускаем любую команду (например ping) через nohup в одной консоли и не выходя из нее смотрим на процессы:

1
$ nohup ping 127.0.0.1 &
1
2
3
4
5
6
$ ps alx
F   UID   PID  PPID PRI  NI    VSZ   RSS WCHAN  STAT TTY        TIME COMMAND
4       0 17326       1  20   0   7908  3208 wait   Ss   tty2       0:00 /bin/login --    
4  1000 17427 17326  20   0   6304  3560 wait   S    tty2       0:00 -bash
4  1000 17450 17427  20   0   1848   556 wait_f S    tty2       0:00 ping 127.0.0.1
0  1000 17517 13180  20   0   2424   848 -      R+   pts/0      0:00 ps alx

Видим, что сейчас процесс ping имеют PPID равный 17427 (то есть это потомок командного интерпретатора bash) и PID 17450. Теперь выйдем из командного интерпретатора bash с PID 17427 и снова посмотрим на процессы:

1
2
3
$ ps alx
F   UID   PID  PPID PRI  NI    VSZ   RSS WCHAN  STAT TTY        TIME COMMAND
4  1000 17450     1  20   0   1848   556  poll_s        S    ?          0:00 ping 127.0.0.1

Как видим несмотря на то, что мы вышли из командного интерпретатора, процесс с PID 17450 остался в системе и принял в качестве родительского, процесс с PID равным 1, то есть процесс init. Процесс 17450 будет существовать до тех пор пока будет существовать процесс init, или пока мы сами не завершим его работу с помощью команды kill.

Команда ps показывает очень подробную информацию о процессах, но она почти бесполезна если нужно отследить работу процесса в реальном времени, просмотреть какие ресурсы и в каком количестве занимает процесс. Для этого существует другая команда - top. Команда top работает в интерактивном режиме и в режиме реального времени отображает работу процессов. Чтобы запустить нужно просто набрать команду - top. Выход - клавиша q. Процессы отображены не все, а только верхняя часть таблицы процессов отсортированная по какому-либо критерию (столбцу). Информацию которую выводит команда top можно условно разбить на две части: верхнюю с общей информацией о системе и ресурсах, и нижнюю таблицу процессов. В верхней части можно увидеть информацию о том сколько дней работает система, сколько занято оперативной памяти, сколько запущено процессов и другая информация:

1
2
3
4
5
top - 17:09:05 up 2 days,  1:48,  6 users,  load average: 0.08, 0.05, 0.04
Tasks: 189 total,   1 running, 188 sleeping,   0 stopped,   0 zombie
Cpu(s):  4.7%us,  1.5%sy,  0.0%ni, 93.8%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:   1024756k total,   785880k used,   238876k free,    16372k buffers
Swap:  1140544k total,   287012k used,   853532k free,   365048k cached

По умолчанию процессы отсортированы по уровню загрузки процессора. Если необходимо изменить порядок сортировки, нужно нажать комбинацию клавиш Shift+o или Shift+f. После нажатия этой комбинации клавиш будет отображено окно в котором можно выбрать столбец по которому необходимо отсортировать таблицу. Например, чтобы отсортировать таблицу по объему занимаемой памяти нужно нажать комбинацию Shift+o, затем клавишу n и нажать Enter. Чтобы изменить порядок сортировки (убывание/возрастание), необходимо нажимать комбинацию Shift+r.

Чтобы получить краткую справку о программе top нужно нажать клавишу h.

Чтобы отобразить процессы определенного пользователя необходимо в работающей программе top нажать клавишу u и затем набрать имя учетной записи и нажать Enter. Чтобы снова отобразить все процессы нажимаем u и ничего не набирая нажимаем Enter.

Очень удобно программу top использовать для удаления процессов которые загружают систему. Такие процессы (загружающие процессор на 100%) будут по умолчанию вверху таблицы. Смотрим PID процесса, нажимаем клавишу k, пишем PID и нажимаем Enter. Затем пишем номер сигнала 9 и еще раз Enter.

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

Читать другие лекции по курсу Администратор ПК с Linux

Статьи и новости схожей тематики:

Комментариев: 14

  1. sergkarpenko:

    во, а я все думал как просмотреть команды в висящие в фоне, оказывается jobs есть :)

    Ответить

    Igorka Reply:

    Неужели ты прочитал здесь, что-то чего не знал? Вот это да! :)

    Ответить

  2. sergkarpenko:

    тут, теоретически подозреваю что почитать man bg, то что то там будет, но я его последнее время ленюсь читать

    Ответить

  3. sergkarpenko:

    да, man bg оказывается и нет такого :)
    зато есть man ps, там много полезного, в частности pstree есть внизу

    Ответить

    Igorka Reply:

    Ну да нет. Я так и написал. Есть в man bash упоминание о bg и fg.

    Ответить

    Igorka Reply:

    В man top тоже есть много полезного. По этим командам (top и ps) можно отдельные статьи писать.

    Ответить

  4. Сергей:

    Приветствую Автора и всех, кто здесь пишет.
    Хочу сказать полезная информация.
    Сам осваиваю линукс (Убунту), про top не знал. Полезная вещь.

    Можно на заказ спросить?

    Про оптимизацию системы немного слов. И особенно хотелось бы знать следующее.
    В нескольких статьях, которые я встречал, говориться об уменьшении количества консолей tty их 6 по умолчанию в Ubuntu 9.04 на которой я сейчас.
    Согласно советам я отредактировал etc/default/console-setup
    указав ACTIVE-COSOLES=”/dev/tty[1-2]”
    и файлы tty 3-4-5-6 поправил закоментировав строки
    start on runlevel …

    После этой процедуры процессов становится меньше но по нажатию ALT F3 и тд остаются пустые консоли, не реагирующие на клавиатуру. Как их можно убрать? Раздражают они :)

    Ответить

    Igorka Reply:

    Спасибо за отзыв. Только не совсем понял, что нужно убрать? Сделать так чтобы находясь во второй консоли и нажав на ALT+F3 не переходить на несуществующую консоль, а оставаться во второй консоли?

    Ответить

  5. Сергей:

    Кстати, Ubuntu 9.04 server установлен
    А то наверно в десктопной версии по другому tty консоли работаю как нибудь?
    Я начал с серверной версии поход за линукс :)

    Ответить

    Igorka Reply:

    Вот здесь http://igorka.com.ua/2009/11/22/otklyuchit-konsol-v-ubuntu/ описал как дома решил, завтра проверю еще на рабочем компьютере.

    Ответить

  6. IgorKa - Информационный ресурс » Архив сайта » Отключить консоль в Ubuntu:

    [...] дней назад посетитель сайта Сергей оставил комментарий с вопросом об отключении консолей в Ubuntu. Вопрос [...]

  7. Сергей:

    “переходить на несуществующую консоль, а оставаться во второй консоли?”
    -хотя бы!.
    Не могу найти информацию по этим “мертвым консолям”
    Еще ведь можно листать АЛЬТ-вправо , АЛЬТ-Влево. и , получается по любому листаешь те же 6 консолей, 1->2->3->4->5->6->1 и тд. , 4 из которых в моем случае не реагируют на клавиатуру!. Я понимаю что процессы getty не запустились и tty не активна и не потребляет время процессора(что в общем то преподносится как оптимизация для сервера). Но эти “мертвые консоли” как то можно убрать наверное? чтобы было 1->2->1 итд. А то просто криво как то получается.

    Ответить

    Igorka Reply:

    Выше написал :) Отпишите получилось ли так как я описал, отключить консоль?

    Ответить

  8. Dimon:

    кстати говоря, “pstree -p” - дерево процессов выдается с указанием PID

    Ответить

Оставьте свой отзыв