Команда jobs в linux

Отслеживание активных процессов

Существует несколько различных инструментов для просмотра/перечисления запущенных в системе процессов. Двумя традиционными и хорошо известными из них являются команды ps и top:

Команда ps

Отображает информацию об активных процессах в системе, как показано на следующем скриншоте:

Для получения дополнительной информации о процессах, запущенных текущим пользователем, применяется опция :

Столбцы, присутствующие в выводе команды , имеют следующие значения:

   UID — идентификатор пользователя, которому принадлежит процесс (тот, от чьего имени происходит выполнение).

   PID — идентификатор процесса.

   PPID — идентификатор родительского процесса.

   C — загрузка CPU процессом.

   STIME — время начала выполнения процесса.

   TTY — тип терминала, связанного с процессом.

   TIME — количество процессорного времени, потраченного на выполнение процесса.

   CMD — команда, запустившая этот процесс.

Также можно отобразить информацию по конкретному процессу, используя команду , например:

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

    — показывает информацию о процессах по всем пользователям;

    — показывает информацию о процессах без терминалов;

    — показывает дополнительную информацию о процессе по заданному UID или имени пользователя;

    — отображение расширенной информации.

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

Обратите внимание на выделенный заголовок. Команда поддерживает функцию сортировки процессов по соответствующим столбцам

Например, чтобы отсортировать список процессов по потреблению ресурсов процессора (в порядке возрастания), введите команду:

Результат:

Если вы ходите выполнить сортировку по потреблению памяти (в порядке убывания), то добавьте к имени интересующего столбца знак минуса:

Результат:

Еще один очень популярный пример использования команды — это объединение её и для поиска заданного процесса по его имени:

Результат:

Команда top

Команда top отображает информацию о запущенных процессах в режиме реального времени:

Рассмотрим детально:

   PID — идентификатор процесса.

   USER — пользователь, которому принадлежит процесс.

   PR — приоритет процесса на уровне ядра.

   NI — приоритет выполнения процесса от до .

   VIRT — общий объем (в килобайтах) виртуальной памяти (физическая память самого процесса; загруженные с диска файлы библиотек; память, совместно используемая с другими процессами и т.п.), используемой задачей в данный момент.

   RES — текущий объем (в килобайтах) физической памяти процесса.

   SHR — объем совместно используемой с другими процессами памяти.

   S (сокр. от «STATUS») — состояние процесса:

   S (сокр. от «Sleeping») — прерываемое ожидание. Процесс ждет наступления события.

   I (сокр. от «Idle») — процесс бездействует.

   R (сокр. от «Running») — процесс выполняется (или поставлен в очередь на выполнение).

   Z (сокр. от «Zombie») — зомби-процесс.

   %CPU — процент используемых ресурсов процессора.

   %MEM — процент используемой памяти.

   TIME+ — количество процессорного времени, потраченного на выполнение процесса.

   COMMAND — имя процесса (команды).

Также в сочетании с основными символами состояния процесса (S от «STATUS») вы можете встретить и дополнительные:

    — процесс с высоким приоритетом;

    — процесс с низким приоритетом;

    — многопоточный процесс;

    — фоновый процесс;

    — лидер сессии.

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

Команда glances

Команда glances — это относительно новый инструмент мониторинга системы с расширенными функциями:

Примечание: Если в вашей системе отсутствует данная утилита, то установить её можно с помощью следующих команд:

RHEL/CentOS/Fedora

Debian/Ubuntu/Linux Mint

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

Чтобы выполнить команду в фоновом режиме, добавьте символ амперсанда ( ) в конце команды:

Идентификатор задания оболочки (заключенный в квадратные скобки) и идентификатор процесса будут напечатаны на терминале:

Вы можете одновременно запускать несколько процессов в фоновом режиме.

Фоновый процесс будет продолжать записывать сообщения в терминал, из которого вы вызвали команду. Для подавления и сообщения используют синтаксис следующий:

означает перенаправление на и к .

Используйте утилиту для отображения состояния всех остановленных и фоновых заданий в текущем сеансе оболочки:

   Вывод включает в себя номер задания, идентификатор процесса, состояние задания и команду, запустившую задание:

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

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

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

Linux jobs и команды по управлению ими

CTRL+Z работает с большинством процессов — переводит их в подвешенное состояние — останавливает и отправляет на задний план. Все остановленные команды можно посмотреть введя в терминале jobs

Запустим второй процесс

Сейчас выполняются оба находясь при этом в фоне:

— Stopped ping ya.ru + 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.

Команда fg

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

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

fg

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

Ctrl+C

Поддерживать выполнение фоновых процессов после выхода из оболочки

Если ваше соединение прерывается или вы выходите из сеанса оболочки, фоновые процессы завершаются. Есть несколько способов сохранить процесс после завершения сеанса интерактивной оболочки.

Одним из способов является удаление задания из управления заданиями оболочки с помощью встроенной оболочки:

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

Убедитесь, что задание удалено из таблицы активных заданий с помощью команды. Для просмотра списка всех запущенных процессов, в том числе отключенных, используйте команду.

Другой способ сохранить процесс запущенным после выхода из оболочки — использовать .

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

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

   Вывод команды перенаправляется в файл.

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

Вещи, которые мы покрыли

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

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

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. Но эти два числа не являются корректными командами!

Альтернативы

Есть ряд программ, которые позволяют вам иметь несколько интерактивных сессий одновременно.

Screen

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

Tmux 

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

Команда fg

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

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

  фг 

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

  Ctrl + C, 

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

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

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

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

«Убийство» процесса

Предположим, что запущенное приложение не отвечает («зависло»). Как тогда от него избавится? Разумеется с помощью команды kill. Попробуем завершить с ее помощью оставшийся процесс xload. Для начала нам нужно определить сам процесс и для этого мы можем воспользоваться командами jobs или ps. Команда jobs сообщает нам номер задачи, а ps уникальный номер процесса (PID).

Попробуем оба способа. Для начала определим номер задачи с помощью команды jobs. Потом выполним команду kill передав ей номер задачи, приписав перед ним знак процента (%), который значит, что мы хотим завершить задачу с указанным номером.

1
2
3
4
5
6

 
$ jobs
+  Running                 xload &
$ kill %1
+  Terminated              xload
 

Окно xload исчезло, так как выполнение программы было завершено с помощью команды kill.

Теперь вновь запустим xload в фоновом режиме. Определим номер процесса (PID) с помощью команды ps и завершим процесс командой kill. На этот раз команде kill передадим номер процесса (PID). В отличии от номера задачи, перед ним не нужно вставлять никаких символов.

1
2
3
4
5
6
7
8
9
10
11

 
$ xload &
25082
$ ps
  PID TTY          TIME CMD
2345 pts/1    00:00:01 bash
25082 pts/1    00:00:00 xload
25092 pts/1    00:00:00 ps
$ kill 25082
+  Terminated              xload
 

Процесс завершился и окно программы xload исчезло.

Вещи, которые мы покрыли

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

Ограничение процессов

Управление процессами в Linux позволяет контролировать практически все. Вы уже видели что можно сделать, но можно еще больше. С помощью команды ulimit и конфигурационного файла /etc/security/limits.conf вы можете ограничить процессам доступ к системным ресурсам, таким как память, файлы и процессор. Например, вы можете ограничить память процесса Linux, количество файлов и т д.

Запись в файле имеет следующий вид:

<домен> <тип> <элемент> <значение>

  • домен — имя пользователя, группы или UID
  • тип — вид ограничений — soft или hard
  • элемент — ресурс который будет ограничен
  • значение — необходимый предел

Жесткие ограничения устанавливаются суперпользователем и не могут быть изменены обычными пользователями. Мягкие, soft ограничения могут меняться пользователями с помощью команды ulimit.

Рассмотрим основные ограничения, которые можно применить к процессам:

  • nofile — максимальное количество открытых файлов
  • as — максимальное количество оперативной памяти
  • stack — максимальный размер стека
  • cpu — максимальное процессорное время
  • nproc — максимальное количество ядер процессора
  • locks — количество заблокированных файлов
  • nice — максимальный приоритет процесса

Например, ограничим процессорное время для процессов пользователя sergiy:

Посмотреть ограничения для определенного процесса вы можете в папке proc:

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

Вот опции команды:

  • -S — мягкое ограничение
  • -H — жесткое ограничение
  • -a — вывести всю информацию
  • -f — максимальный размер создаваемых файлов
  • -n — максимальное количество открытых файлов
  • -s — максимальный размер стека
  • -t — максимальное количество процессорного времени
  • -u — максимальное количество запущенных процессов
  • -v — максимальный объем виртуальной памяти

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

Теперь смотрим:

Установим лимит оперативной памяти:

Напоминаю, что это ограничение будет актуально для всех программ, выполняемых в этом терминале.

Работа процессов в фоне

Запуск скрипта в фоне linux — это одно, но надо чтобы он ещё работал после закрытия терминала. Закрытие терминала путем нажатия на крестик в верхнем углу экрана влечет за собой завершение всех фоновых процессов. Впрочем, есть несколько способов сохранить их  после того как связь с интерактивной оболочкой прервется. Первый способ — это удаление задачи из очереди заданий при помощи команды disown:

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

Убедиться, что задачи больше нет в списке заданий, можно, использовав уже знакомую утилиту jobs -l. А чтобы просмотреть перечень всех запущенных процессов (в том числе и отключенных) применяется команда

Второй способ сохранить запущенные процессы после прекращения работы терминала — команда nohup. Она выполняет другую команду, которая была указана в качестве аргумента, при этом игнорирует все сигналы SIGHUP (те, которые получает процесс при закрытии терминала). Для запуска команды в фоновом режиме нужно написать команду в виде:

Как видно на скриншоте, вывод команды перенаправляется в файл nohup.out. При этом после выхода из системы или закрытия терминала процесс не завершается. Существует ряд программ, которые позволяют запускать несколько интерактивных сессий одновременно. Наиболее популярные из них — Screen и Tmux.

  • Screen либо GNU Screen — это терминальный мультиплексор, который позволяет запустить один рабочий сеанс и в рамках него открыть любое количество окон (виртуальных терминалов). Процессы, запущенные в этой программе, будут выполняться, даже если их окна невидимы или программа прекратила работу.
  • Tmux — более современная альтернатива GNU Screen. Впрочем, возможности Tmux не имеют принципиальных отличий — в этой программе точно так же можно открывать множество окон в рамках одного сеанса. Задачи, запущенные в Tmux, продолжают выполняться, если терминал был закрыт.

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 .

Управление процессами Linux, запуск в фоновом режиме.

Все запущенные программы в системе Linux называются процессами.У каждого пользователя есть права управления только теми процессами , которые были запущены под данным пользователем. Но, пользователь root имеет права на управление любыми процессами системы.

Управление процессами возможно следующими командами:

 & - запуск программы в фоновом режиме;  
 + - приостановка текущего процесса;  
 bg – перевод приостановленного процесса в фоновый режим;  
 fg – возврат процесса из фонового режима;  
 jobs – список процессов в фоновом режиме;  
 ps – список программ, выполняемых на терминале;  
 kill, killall – принудительное завершение процессов;  
 top – вывод динамической информации о процессах;  
 nice- изменение приоритета;
Перевод программы в фоновый режим.

Программа может быть запущена в двух вариантах: в фоновом режиме (background) bg и на переднем плане (foreground) fg.Что бы запустить программу или скрипт в фоновом режиме нужно добавить символ & в конце строки-команды, через пробел:

~# /srv/tools/script.sh &

Если вы хотели запустить процесс в фоновом режиме, но забыли добавить в конец команды &, то в можно просто перевести процесс в фоновый режим через команду bg:1. Забыли запустить программу в фоновом режиме:

~# /srv/tools/script.sh

2. Приостанавливаем процесс:

CTRL-Z

3. Вводим команду bg, которая запустит процесс, но уже в фоновом режиме:

bg

Список фоновых процессов можно посмотреть через команду:

jobs
Вывод процесса из фонового режима.

Если вам нужно вернуть программу из фонового режима на передний план, делаем следующее.Если нам нужно вывести последний запущенный в фоне процесс, то просто вводим команду:fg.

Если нам нужно вывести из фонового режима определенный процесс, то вводим:

fg %3

, где %3 это номер запущенного процесса из команды jobs.

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 .

Об авторах

Daniel Robbins

Дэниэль Роббинс — основатель сообщества Gentoo и создатель операционной системы Gentoo Linux. Дэниэль проживает в Нью-Мехико со свой женой Мэри и двумя энергичными дочерьми. Он также основатель и глава Funtoo, написал множество технических статей для IBM developerWorks, Intel Developer Services и C/C++ Users Journal.

Chris Houser

Крис Хаусер был сторонником UNIX c 1994 года, когда присоединился к команде администраторов университета Тэйлора (Индиана, США), где получил степень бакалавра в компьютерных науках и математике. После он работал во множестве областей, включая веб-приложения, редактирование видео, драйвера для UNIX и криптографическую защиту. В настоящий момент работает в Sentry Data Systems. Крис также сделал вклад во множество свободных проектов, таких как Gentoo Linux и Clojure, стал соавтором книги The Joy of Clojure.

Aron Griffis

Эйрон Гриффис живет на территории Бостона, где провел последнее десятилетие работая в Hewlett-Packard над такими проектами, как сетевые UNIX-драйвера для Tru64, сертификация безопасности Linux, Xen и KVM виртуализация, и самое последнее — платформа HP ePrint. В свободное от программирования время Эйрон предпочитает размыщлять над проблемами программирования катаясь на своем велосипеде, жонглируя битами, или болея за бостонскую профессиональную бейсбольную команду «Красные Носки».

Процесс Init

Процесс Init — это родительский процесс для всех процессов в системе, это первая программа, которая исполняется при загрузке системы Linux; он управляет всеми другими процессами в системе. Init запускается непосредственно ядром системы, поэтому он в принципе не имеет родительского процесса.

Процесс Init всегда получает ID 1. Он функционирует как приемный родитель для всех осиротевших процессов.

Для определения ID процесса можно использовать команду pidof:

# pidof systemd
# pidof top
# pidof httpd

Найти ID процесса и ID родительского процесса для системной оболочки можно с помощью команд:

$ echo $$
$ echo $PPID

Изменение приоритета процесса

В Linux все активные процессы имеют определенное значение приоритета (nice). Процессы с более высоким приоритетом обычно получают больше процессорного времени, чем процессы с более низким приоритетом.

Однако пользователь с привилегиями root может менять приоритет с помощью команд nice и renice.
В выводе команды top столбец NI отображает значения nice для процессов.

$ top  

Вы можете использовать команду nice, чтобы задать значение nice процесса. Не забывайте, что обычный пользователь может присвоить процессу значение nice от 0 до 20, только если это процесс ему принадлежит.
Отрицательные значения nice может использовать только пользователь root.

Для понижения приоритета процесса используется команда renice:

$ renice +8  2687
$ renice +8  2103 

Это все!

Другие статьи об управлении процессами в Linux вы найдете на странице
«Процессы в Linux-системе».

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

Команда ps

Предназначена для вывода информации о выполняемых процессах. Данная команда имеет много
параметров, о которых вы можете прочитать в руководстве (man ps). Здесь я опишу лишь наиболее
часто используемые мной:

Параметр Описание
-a отобразить все процессы, связанных с терминалом (отображаются процессы всех пользователей)
-e отобразить все процессы
-t список терминалов отобразить процессы, связанные с терминалами
-u идентификаторы пользователей отобразить процессы, связанные с данными идентификаторыми
-g идентификаторы групп отобразить процессы, связанные с данными идентификаторыми групп
-x отобразить все процессы, не связанные с терминалом

Например, после ввода команды ps -a вы увидите примерно следующее:

Для вывода информации о конкретном процессе мы можем воспользоваться командой:

В приведенном выше примере используется перенаправление ввода вывода между программами ps и grep, и как результат получаем информацию обо всех процессах содержащих в строке запуска «httpd».
Данную команду (ps -ax | grep httpd) я написал только лишь в демонстрационных целях — гораздо проще использовать параметр -С программы ps вместо перенаправления ввода вывода и параметр -e вместо -ax.

Программа top

Предназначена для вывода информации о процессах в реальном времени. Процессы сортируются по максимальному занимаемому процессорному времени, но вы можете изменить порядок сортировки (см. man top). Программа также сообщает о свободных системных ресурсах.

Что такое процесс?

Начнем с того, что разберемся в терминах. По сути, процесс — это каждая программа. Как я уже говорил для каждой запускаемой программы создается отдельный процесс. В рамках процесса программе выделяется процессорное время, оперативная память и другие системные ресурсы. У каждого процесса есть свой идентификатор, Proccess ID или просто PID, по ним, чаще всего и определяются процессы Linux. PID определяется неслучайно, как я уже говорил, программа инициализации получает PID 1, а каждая следующая запущенная программа — на единицу больше. Таким образом PID пользовательских программ доходит уже до нескольких тысяч.

На самом деле, процессы Linux не настолько абстрактны, какими они вам сейчас кажутся. Их вполне можно попытаться пощупать. Откройте ваш файловый менеджер, перейдите в корневой каталог, затем откройте папку /proc. Видите здесь кучу номеров? Так вот это все — PID всех запущенных процессов. В каждой из этих папок находится вся информация о процессе.

Например, посмотрим папку процесса 1. В папке есть другие под каталоги и много файлов. Файл cmdline содержит информацию о команде запуска процесса:

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

3.2. Практическое задание: фоновые процессы

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

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

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

4. Выполните команду в фоновом режиме. Остановите исполнение этой команды в фоновом режиме перед тем, как будет закончен обход файловой системы.

5. Запустите два процесса с длительным периодом ожидания в фоновом режиме.

6. Выведите информацию обо , исполняющихся в фоновом режиме.

7. Используйте утилиту для остановки исполнения одного из процессов с именем .

8. Инициируйте продолжение исполнения процесса в фоновом режиме (убедитесь в том, что исполнение продолжилось).

9. Переведите один из процессов с именем назад в текущую командную оболочку.

10. (Общий вопрос, ответ может быть дан при наличии свободного времени…) Дайте детальные пояснения по поводу источников чисел из следующего примера. В каких условиях переменные заменяются на их значения? Какая командная оболочка осуществляет эту замену?

$ echo $$ $PPID
4224 4223
$ bash -c "echo $$ $PPID"
4224 4223
$ bash -c 'echo $$ $PPID'
5059 4224
$ bash -c `echo $$ $PPID`
4223: 4224: команда не найдена...

Команда bg

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

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

  Б.Г. 

Команда возобновляется, и мы снова видим результат прокрутки в окне терминала. Имя команды, которая была перезапущена, отображается для вас. Это выделено на скриншоте.

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

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

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

Рейтинг
( Пока оценок нет )
Понравилась статья? Поделиться с друзьями:
Мой редактор ОС
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: