Лекция №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 еще много возможностей, подробнее смотрите в справке. На этом будем заканчивать тему процессов и сигналов. Следующая лекция будет посвящена монтированию файловых систем.
sergkarpenko:
во, а я все думал как просмотреть команды в висящие в фоне, оказывается jobs есть :)
Ответить
Igorka Reply:
ноября 13, 2009 at 20:10
Неужели ты прочитал здесь, что-то чего не знал? Вот это да! :)
Ответить
sergkarpenko:
тут, теоретически подозреваю что почитать man bg, то что то там будет, но я его последнее время ленюсь читать
Ответить
13 ноября 2009, 20:43sergkarpenko:
да, man bg оказывается и нет такого :)
зато есть man ps, там много полезного, в частности pstree есть внизу
Ответить
Igorka Reply:
ноября 13, 2009 at 21:07
Ну да нет. Я так и написал. Есть в man bash упоминание о bg и fg.
Ответить
Igorka Reply:
ноября 13, 2009 at 21:09
В man top тоже есть много полезного. По этим командам (top и ps) можно отдельные статьи писать.
Ответить
Сергей:
Приветствую Автора и всех, кто здесь пишет.
Хочу сказать полезная информация.
Сам осваиваю линукс (Убунту), про 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:
ноября 20, 2009 at 12:20
Спасибо за отзыв. Только не совсем понял, что нужно убрать? Сделать так чтобы находясь во второй консоли и нажав на ALT+F3 не переходить на несуществующую консоль, а оставаться во второй консоли?
Ответить
Сергей:
Кстати, Ubuntu 9.04 server установлен
А то наверно в десктопной версии по другому tty консоли работаю как нибудь?
Я начал с серверной версии поход за линукс :)
Ответить
Igorka Reply:
ноября 22, 2009 at 23:32
Вот здесь http://igorka.com.ua/2009/11/22/otklyuchit-konsol-v-ubuntu/ описал как дома решил, завтра проверю еще на рабочем компьютере.
Ответить
IgorKa - Информационный ресурс » Архив сайта » Отключить консоль в Ubuntu:
[...] дней назад посетитель сайта Сергей оставил комментарий с вопросом об отключении консолей в Ubuntu. Вопрос [...]
22 ноября 2009, 23:30Сергей:
“переходить на несуществующую консоль, а оставаться во второй консоли?”
-хотя бы!.
Не могу найти информацию по этим “мертвым консолям”
Еще ведь можно листать АЛЬТ-вправо , АЛЬТ-Влево. и , получается по любому листаешь те же 6 консолей, 1->2->3->4->5->6->1 и тд. , 4 из которых в моем случае не реагируют на клавиатуру!. Я понимаю что процессы getty не запустились и tty не активна и не потребляет время процессора(что в общем то преподносится как оптимизация для сервера). Но эти “мертвые консоли” как то можно убрать наверное? чтобы было 1->2->1 итд. А то просто криво как то получается.
Ответить
Igorka Reply:
ноября 22, 2009 at 23:35
Выше написал :) Отпишите получилось ли так как я описал, отключить консоль?
Ответить
Dimon:
кстати говоря, “pstree -p” - дерево процессов выдается с указанием PID
Ответить
30 июля 2010, 13:58