Почему процесс чтения не отображается в ps -ef

Вопрос или проблема

Я открываю два терминала. В одном я запускаю:

$ read foo

Я не нажимаю RETURN, поэтому read блокируется. В другом окне терминала я ищу процесс:

$ ps -ef | grep foo
user        95292   94814  0 08:04 pts/11   00:00:00 grep foo

Однако запущенный процесс read не отображается? Что я делаю не так?

В моей оболочке read является встроенной командой:

$ type read
read is a shell builtin

Следовательно, запуск read foo не создает новый процесс, и поэтому ничего не отображается в ps -ef.

Ответ или решение

Почему команда read не отображается в выводе команды ps -ef?

Теория

Команда read в большинстве современных оболочек, таких как Bash, является встроенной командой (builtin). Это означает, что она выполняется непосредственно в контексте текущего экземпляра оболочки и не порождает новый процесс для выполнения. Инструмент ps, который используется для отображения информации о запущенных процессах, показывает только отдельные процессы, которые управляются ядром операционной системы. Встроенные команды оболочки не отображаются в списке, создаваемом ps -ef, именно из-за их особенности исполнения внутри текущей оболочки.

Использование встроенных команд является эффективным методом управления ресурсами, так как это снижает накладные расходы, связанные с созданием и управлением новыми процессами. Основное назначение команды read — получать входные данные от пользователя или из потока ввода и сохранять их в переменные. Когда вы выполняете read foo, процесс блокируется, ожидая ввода, но поскольку это часть встроенной команды, никакой внешний процесс не создается.

Пример

В вашей ситуации, вы открыли два терминала. В одном терминале вы выполнили команду read foo и, не нажимая клавишу RETURN, оставили read в блокирующем режиме, ожидающим ввода. В другом терминале вы выполнили команду ps -ef | grep foo, надеясь найти процесс read.

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

Рассмотрим простой пример:

$ read foo

Этот фрагмент кода ожидает ввод с клавиатуры, но это не означает создание нового процесса. Если вы выполните:

$ ps -ef | grep foo

Вы увидите только процесс команды grep, которая ищет строку "foo", но не сам read, так как он работает в рамке текущей оболочной сессии.

Применение

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

Для детализированного мониторинга того, что происходит внутри вашей shell сессии, вы могли бы использовать команды для отладки, такие как set -x, которая поможет вам увидеть, какие команды выполняются в вашей оболочке. Это полезно для отладки скриптов или для понимания последовательности выполнения команд в интерактивной сессии.

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

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

Оцените материал
Добавить комментарий

Капча загружается...