Просмотр список процессов

04.01.2022 Автор: Mohira Абдукаримова

В одной строке можно указать список команд, которые будут запускаться одну за другой. Это делается путем ввода списка команд, используя точку с запятой (;) между командами:

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

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

Чтобы указать, была ли создана подоболочка, здесь необходима команда, использующая переменную среды. Требуется команда echo $BASH_SUBSHELL. Если он возвращает 0, значит, подоболочки нет. Если он возвращает 1 или более, подоболочка была создана.

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

В самом конце вывода команд можно увидеть, что отображается число ноль (0). Это означает, что подоболочка не была создана для выполнения этих команд.

Результаты будут другими при использовании списка процессов. Список выполняется с прикрепленным к концу echo $BASH_SUBSHELL:

В этом случае номер один (1) отображается в конце вывода. Это означает, что подоболочка действительно была создана и использовалась для выполнения этих команд.

Таким образом, список процессов представляет собой группу команд, заключенную в круглые скобки, которая создает подоболочку для выполнения команды (команд). Вы даже можете создать подоболочку внука, вставив круглые скобки в список процессов:

В первом списке процессов отображается номер один (1), обозначающий дочернюю подоболочку, как и следовало ожидать. Однако во втором списке процессов в примере команда echo $BASH_SUBSHELL была заключена в дополнительные круглые скобки. Эти дополнительные круглые скобки привели к созданию дочерней подоболочки для выполнения команды. Таким образом, была отображена цифра два (2), указывающая на подоболочку внутри подоболочки.

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

Творчески используя подоболочки

В интерфейсе командной строки интерактивной оболочки у вас есть более продуктивные способы использования подоболочки. Списки процессов, сопроцессы и каналы (описанные в главе 11) используют подоболочки. Каждый из них можно эффективно использовать в интерактивной оболочке. Один из эффективных методов подоболочки в интерактивной оболочке использует фоновый режим. 

Исследование фонового режима

Выполнение команды в фоновом режиме позволяет обработать команду и освобождает ваш интерфейс командной строки. Классической командой для демонстрации фонового режима является команда sleep.

Команда sleep принимает в качестве параметра количество секунд, в течение которых процесс будет ждать (спать). Эта команда часто используется для создания пауз в сценариях оболочки. Команда sleep 10 заставляет сеанс приостанавливаться на 10 секунд, а затем возвращает командную строку командной строки оболочки:

Чтобы перевести команду в фоновый режим, к ее концу прикрепляется символ &. Перевод команды sleep в фоновый режим позволяет провести небольшое исследование с помощью команды ps:

Команде sleep было приказано спать на 3000 секунд (50 минут) в фоновом режиме (&). Когда он был переведен в фоновый режим, два информационных элемента отображались до того, как было возвращено приглашение командной строки командной строки. Первый информационный элемент — это номер фонового задания (1), отображаемый в скобках. Второй элемент — это идентификатор процесса фонового задания (2542).

Команда ps использовалась для отображения различных процессов. Обратите внимание на то, что в списке есть команда sleep 3000. А его PID во втором столбце — это тот же PID, который отображался, когда команда перешла в фоновый режим, 2542.

В дополнение к команде ps вы можете использовать команду jobs для отображения информации о фоновом задании. Команда jobs отображает ваши процессы (задания), запущенные в настоящее время в фоновом режиме:

Команда jobs показывает номер задания (1) в скобках. Он также отображает текущий статус задания (Выполняется), а также саму команду (sleep 3000&).

Вы можете увидеть еще больше информации, используя параметр -l (нижний регистр L) в команде jobs. Параметр -l отображает PID команды в дополнение к другой информации:

Если у вас запущено более одного фонового процесса, есть дополнительная полезная информация, показывающая, какое фоновое задание было запущено последним. Рядом с номером задания, которое было запущено последним, на экране команды jobs отображается знак «плюс» (+). А второй самый новый процесс будет иметь знак минус (-), чтобы предоставить вам дополнительную информацию.

Когда фоновое задание завершено, его статус завершения отображается при следующем нажатии клавиши Enter в командной строке:

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

Отвод списков процессов на задний план

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

Как указывалось ранее, список процессов — это команда или серия команд, выполняемых в подоболочке. Использование списка процессов, включая команды sleep и echo переменной $BASH_SUBSHELL, работает так, как и следовало ожидать:

В предыдущем примере возникает двухсекундная пауза, отображается номер один (1), указывающий на один уровень подоболочки (дочерняя оболочка), а затем возникает еще одна двухсекундная пауза перед возвратом приглашения. 

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

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

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

Конечно, список процессов для команд sleep и echo предназначен только для примера. Создание файлов резервных копий с помощью tar — более практичный пример эффективного использования списков фоновых процессов:

Перевод списка процессов в фоновый режим — не единственный способ творчески использовать подоболочки в интерфейсе командной строки. Совместная обработка — еще один метод.

Совместная обработка

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

Для выполнения совместной обработки команда coproc используется вместе с командой, которая должна выполняться в подоболочке:

Совместная обработка выполняется почти так же, как перевод команды в фоновый режим, за исключением того факта, что она создает под-оболочку. При вводе команды coproc и ее параметров было запущено фоновое задание. На экране отображались номер фонового задания (1) и идентификатор процесса (2689).

Команда jobs позволяет отображать статус совместной обработки:

Из предыдущего примера видно, что в подоболочке выполняется фоновая команда coproc COPROC sleep 10. COPROC — это имя, присвоенное процессу командой coproc. Вы можете задать имя самостоятельно, используя расширенный синтаксис команды:

При использовании расширенного синтаксиса имя совместной обработки было установлено на My_Job. Расширенный синтаксис немного сложен. Убедитесь, что вы поставили пробел после первой фигурной скобки ({) и перед началом вашей команды. Также команда должна заканчиваться точкой с запятой (;). И вы должны поставить пробел после точки с запятой и перед закрывающей фигурной скобкой (}).

Совместная обработка позволяет получить очень интересную информацию и отправлять / получать информацию процессу, запущенному в подоболочке. Единственный раз, когда вам нужно назвать сопроцесс — это когда у вас запущено несколько сопроцессов и вам нужно общаться со всеми ними. В противном случае просто позвольте команде coproc установить имя по умолчанию, COPROC.

Вы можете быть действительно умным и комбинировать совместную обработку со списками процессов, создавая вложенные подоболочки. Просто введите свой список процессов и поместите перед ним команду coproc:

Создание подоболочки может быть дорогостоящим и медленным. Создание вложенных подоболочек — тем более!

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

relojes imitacion replique montre replika klockor