Linux jobs и команды по управлению ими
CTRL+Z работает с большинством процессов — переводит их в подвешенное состояние — останавливает и отправляет на задний план. Все остановленные команды можно посмотреть введя в терминале jobs
Запустим второй процесс
Сейчас выполняются оба находясь при этом в фоне:
[1]- Stopped ping ya.ru
[2]+ Stopped top
Теперь можно переместить одно из заданий на передний план указав его номер
ping ya.ru
64 bytes from www.yandex.ru (93.158.134.3): icmp_seq=4 ttl=57 time=30.3 ms
64 bytes from www.yandex.ru (93.158.134.3): icmp_seq=5 ttl=57 time=29.0 ms
64 bytes from www.yandex.ru (93.158.134.3): icmp_seq=6 ttl=57 time=29.0 ms
64 bytes from www.yandex.ru (93.158.134.3): icmp_seq=7 ttl=57 time=29.6 ms
При переводе на передний план вывод производится в основной терминал, более ничего не меняется и задание выполняется в любом случае
Можно таким же образом вывести команду на задний план
Вывод команды таким образом продолжит быть присоединенным к терминалу, результат tail -f снова выведется в консоль как только в лог будет записываться информация (сэмулировать ситуацию можно перезапустив какой-либо демон подключившись к системе через другой терминал).
При выполнении в bg таким образом для нескольких команд их вывод в терминал будет смешиваться случайным образом, что может быть не очень удобно.
Удалить процесс можно указывая его номер со знаком процента
Работа с Linux jobs является типичной операцией поручному управлению системными процессами. Читайте подробнее про ps aux.
Администрирование систем Linux. Фоновые задачи
Глава 3. Фоновые задачи
3.1. Фоновые процессы
Список задач, запущенных с помощью вашей текущей командной оболочки и выполняющихся в фоновом режиме, может быть выведен с помощью команды jobs . По умолчанию у вас не должно быть каких-либо задач, выполняющихся в фоновом режиме.
Данная команда jobs будет использоваться несколько раз на протяжении данной главы.
3.1.2. Сочетание клавиш Control-Z
Исполнение некоторых процессов может быть остановлено с помощью комбинации клавиш Ctrl-Z . Данная комбинация клавиш позволяет отправить сигнал SIGSTOP ядру Linux , что приведет к остановке исполнения процесса.
В том случае, если данная комбинация клавиш используется при работе с текстовым редактором vi(m) , процесс текстового редактора vi(m) продолжает исполняться в фоновом режиме. Процесс vi(m) , исполняющийся в фоновом режиме, может быть обнаружен в выводе команды jobs .
Процессы, которые запускаются в фоновом режиме благодаря символу & , размещенному в конце строки команды, также отображаются в выводе команды jobs .
3.1.4. Команда jobs -p
Команда jobs поддерживает интересный параметр -p , предназначенный для вывода идентификаторов процессов, исполняющихся в фоновом режиме.
Вызов команды fg позволяет перевести процесс из фонового режима в текущую командную оболочку. Номер фоновой задачи для переноса в текущую командную оболочку является параметром команды fg .
Задачи из фонового режима, исполнение которых было приостановлено , могут быть снова запущены в фоновом режиме с помощью команды bg . Команда bg осуществляет отправку сигнала SIGCONT соответствующему процессу.
Ниже приведен пример запуска процесса sleep в фоновом режиме (исполнение которого было остановлено с помощью сочетания клавиш Ctrl-Z ) с последующей повторной активацией этого процесса в фоновом режиме с помощью команды bg .
3.2. Практическое задание: фоновые процессы
1. Используйте команду jobs , чтобы удостовериться в том, что никакие процессы не выполняются в фоновом режиме.
2. Используйте текстовый редактор vi для создания небольшого текстового файла. Переведите процесс vi в фоновый режим и остановите его исполнение.
3. Используйте команду jobs , чтобы убедиться в том, что исполнение процесса vi в фоновом режиме остановлено.
4. Выполните команду find / > allfiles.txt 2>/dev/null в фоновом режиме. Остановите исполнение этой команды в фоновом режиме перед тем, как будет закончен обход файловой системы.
5. Запустите два процесса sleep с длительным периодом ожидания в фоновом режиме.
6. Выведите информацию обо всех задачах , исполняющихся в фоновом режиме.
7. Используйте утилиту kill для остановки исполнения одного из процессов с именем sleep .
8. Инициируйте продолжение исполнения процесса find в фоновом режиме (убедитесь в том, что исполнение продолжилось).
9. Переведите один из процессов с именем sleep назад в текущую командную оболочку.
10. (Общий вопрос, ответ может быть дан при наличии свободного времени. ) Дайте детальные пояснения по поводу источников чисел из следующего примера. В каких условиях переменные заменяются на их значения? Какая командная оболочка осуществляет эту замену?
3.3. Корректная процедура выполнения практического задания: фоновые процессы
1. Используйте команду jobs , чтобы удостовериться в том, что никакие процессы не выполняются в фоновом режиме.
jobs (возможно одни из процессов cat все еще исполняется?)
2. Используйте текстовый редактор vi для создания небольшого текстового файла. Переведите процесс vi в фоновый режим и остановите его исполнение.
(в процессе работы с vi нажмите ctrl-z)
3. Используйте команду jobs , чтобы убедиться в том, что исполнение процесса vi в фоновом режиме остановлено.
4. Выполните команду find / > allfiles.txt 2>/dev/null в фоновом режиме. Остановите исполнение этой команды в фоновом режиме перед тем, как будет закончен обход файловой системы.
5. Запустите два процесса sleep с длительным периодом ожидания в фоновом режиме.
6. Выведите информацию обо всех задачах , исполняющихся в фоновом режиме.
7. Используйте утилиту kill для остановки исполнения одного из процессов с именем sleep .
8. Инициируйте продолжение исполнения процесса find в фоновом режиме (убедитесь в том, что исполнение продолжилось).
bg 2 (проверьте состояние задачи с указанным идентификатором в списке фоновых задач)
9. Переведите один из процессов с именем sleep назад в текущую командную оболочку.
fg 3 (и снова проверьте состояние задачи с указанным идентификатором в списке фоновых задач)
10. (Общий вопрос, ответ может быть дан при наличии свободного времени. ) Дайте детальные пояснения по поводу источников чисел из следующего примера. В каких условиях переменные заменяются на их значения? Какая командная оболочка осуществляет эту замену?
Текущая командная оболочка bash будет заменять имена переменных $$ и $PPID при разборе строки команды перед исполнением команды echo.
Теперь имена переменных экранированы с помощью двойных кавычек, но текущая командная оболочка bash все также будет заменять имена переменных $$ и $PPID при разборе строки команды перед исполнением команды bash -c.
А теперь имена переменных экранированы с помощью одинарных кавычек. Текущая командная оболочка bash не будет заменять имена переменных $$ и $PPID. Команда bash -c будет выполнена перед заменой имен переменных на их значения. Вторая же командная оболочка bash будет осуществлять замену имен переменных $$ и $PPID на их значения.
При использовании обратных кавычек командная оболочка все также будет осуществлять замену имен переменных на их значения перед исполнением встроенной команды echo. Результатом исполнения этой команды echo будут являться идентификаторы двух процессов. Эти идентификаторы будут переданы команде bash -c. Но эти два числа не являются корректными командами!
Linux: jobs, fg, bg — управление фоновыми процессами
Запущенный процесс в обычном режиме работает в режиме «foreground«, т.е. — «на переднем плане» или, другими словами, «в приоритетном режиме». В таком режиме он принимает команды с управляющего терминала, в котором он запущен, и на него же выводит информацию stdout и stderr . Кроме того, он делает недоступным командную строку.
Что бы запустить задачу в фоновом режиме — в конце команды необходимо добавить знак & , например:
Отобразить список текущих фоновых задач можно командой jobs :
Либо — запустить её в обычном режиме, после чего нажать комбинацию ctrl+Z, отправив ей сигнал TSTR . Подробнее о сигналах — в статье Linux&FreeBSD: команды kill, nohup — сигналы и управление процессами. После этого — она появится в списке jobs с новым номером:
Теперь, что бы продолжить её выполнение в фоновом режиме — введите команду bg (background):
Кроме обычных PID , у задач в фоне имеется собственный номер, который всегда начинается с единицы (если нет других фоновых задач). Кроме того, jobs отображает состояние процесса — Running, Stopped, Done, Exit .
Например, по окончании архивирования — статус задачи станет Done :
Если команду jobs запустить из каталога отличного от того, в котором была запущена сама задача — jobs укажет её wd — working directory. так же, необходимо учитывать, что для каждого управляющего терминала номера задач в jobs будут независимы и начинаться с единицы.
Что бы вывести задачу из фонового режима — используется команда fg (foreground), которой можно либо передать номер задачи в качестве аргумента, либо — запустить без аргументов. В последнем случае — будет выведена задача, отмеченная знаком + в списке jobs , т.е. — последняя отправленная «в фон» задача.
Вернёт на экран утилиту top и переведёт её в режим Running .
IgorKa — Информационный ресурс
Немного обо всем и все о немногом, или практический опыт системного администратора.
Пн | Вт | Ср | Чт | Пт | Сб | Вс |
---|---|---|---|---|---|---|
« Окт | Дек » | |||||
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 | 29 |
30 |
Лекция №14 — Процессы, задачи. Команды fg, bg, jobs, top, nohup
В этой лекции мы закончим тему процессов и сигналов в Linux и перейдем к теме монтирования файловых систем. На прошлой лекции мы неоднократно использовали знак & (амперсанд) в конце команды (sleep 100 &). Знак амперсанда в конце команды означает, что запускаемый процесс нужно будет перевести в фоновый режим. Если запустить команду sleep 100 без знака &, то мы не получим приглашение в командной строке пока не будет завершен процесс sleep.
Запущенные из консоли с помощью амперсанда команды, работают в фоновом режиме и называются задачами (jobs). Можно сказать, что задачи это процессы, привязанные к командному интерпретатору. Такие задачи помимо традиционного PID имеют еще свою нумерацию начинающуюся с единицы. Просмотреть запущенные задачи интерпретатора, можно командой jobs. В примере ниже показана ситуация когда есть две задачи и выполнение одного из них остановлено.
Наберите в консоли команду 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:
В примере у нас запущено два командных интерпретатора bash с PID равными 13180 и 16442. Далее идут 4-е процесса, которые были запущены из второго командного интерпретатора — их можно определить по PPID равному 16442. Теперь выйдите (команда exit) из второго интерпретатора и снова выполните команду ps al в первом интерпретаторе:
Как видим завершился не только процесс с PID 16442, но и все процессы потомки (PPID 16442). Еще одно подтверждение того, что процесс-потомок не может существовать без родительского процесса.
Но, что делать если необходимо запустить процесс, и выйти из консоли так чтобы процесс продолжал работать в системе? Выход один — передать процесс-потомок другому процессу, который будет для него родительским. Такая возможность реализована в команде nohup. Данная команда позволяет запускать процессы, который будут оторваны от терминала если, терминал будет закрыт. Проводим эксперимент. Запускаем любую команду (например ping) через nohup в одной консоли и не выходя из нее смотрим на процессы:
Видим, что сейчас процесс ping имеют PPID равный 17427 (то есть это потомок командного интерпретатора bash) и PID 17450. Теперь выйдем из командного интерпретатора bash с PID 17427 и снова посмотрим на процессы:
Как видим несмотря на то, что мы вышли из командного интерпретатора, процесс с PID 17450 остался в системе и принял в качестве родительского, процесс с PID равным 1, то есть процесс init. Процесс 17450 будет существовать до тех пор пока будет существовать процесс init, или пока мы сами не завершим его работу с помощью команды kill.
Команда ps показывает очень подробную информацию о процессах, но она почти бесполезна если нужно отследить работу процесса в реальном времени, просмотреть какие ресурсы и в каком количестве занимает процесс. Для этого существует другая команда — top. Команда top работает в интерактивном режиме и в режиме реального времени отображает работу процессов. Чтобы запустить нужно просто набрать команду — top. Выход — клавиша q. Процессы отображены не все, а только верхняя часть таблицы процессов отсортированная по какому-либо критерию (столбцу). Информацию которую выводит команда top можно условно разбить на две части: верхнюю с общей информацией о системе и ресурсах, и нижнюю таблицу процессов. В верхней части можно увидеть информацию о том сколько дней работает система, сколько занято оперативной памяти, сколько запущено процессов и другая информация:
По умолчанию процессы отсортированы по уровню загрузки процессора. Если необходимо изменить порядок сортировки, нужно нажать комбинацию клавиш 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 еще много возможностей, подробнее смотрите в справке. На этом будем заканчивать тему процессов и сигналов. Следующая лекция будет посвящена монтированию файловых систем.