Я получаю странный вывод, включая мой старый вывод make-файла и дерево процессов при запуске команды под Linux в Linux

ps axuwfw

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

ps axuwfw | grep -v grep | grep -i screen

ps axuwfw | grep -v grep | grep -i tmux

Вышеупомянутые две команды возвращают 431 и 7 в примере отсюда, но в моей системе он возвращает некоторые ранее запущенные старые выходные данные make-файла и усеченное дерево процессов.

1 ответ1

6
ps axuwfw

Это комбинация нескольких опций в стиле BSD (все они на странице руководства, man ps):

  • a: включить процессы от других пользователей
  • x: включить процессы без терминала
  • u: показать ориентированные на пользователя информационные поля
  • w: широкий вывод (132 столбца вместо 80)
  • f: "лес": древовидное представление процессов
  • w: еще более широкий вывод (без ограничений)

Другими словами, он просто показывает текущие запущенные процессы.

Однако, если вы видите старые процессы там, проверьте их поле "STAT" - если оно говорит Z , процесс завершился, но его родитель еще не "пожинал" его; процесс "зомби". Обычно это указывает на то, что родительский процесс либо слегка глючит, либо зависает / падает.

Также обратите внимание, что не все операционные системы принимают эти параметры. На SysV это может быть ps -ef .

ps axuwfw | grep -v grep | grep -i screen

| это труба. Он перенаправляет вывод одной команды на вход другой. Это должно сделать более очевидным, что вышесказанное - не просто одна странная магическая команда; это три команды, связанные.

  1. Первая команда, ps axuwfw , уже была объяснена.

  2. grep , для поиска / фильтрации текста. grep foo будет печатать только те строки ввода, которые содержат текст "foo". С опцией -v вторая команда - grep -v … - выполняет противоположное - печатает строки, которые не совпадают. (Опять же, обратитесь к man grep или grep --help .)

    Этот конкретный вызов необходим, потому что все процессы в конвейере выполняются одновременно, поэтому ps… покажет все процессы grep… и ps axu | grep screen приведет к тому, что grep… также будет соответствовать своей записи в дополнение к желаемой. Поэтому добавляется второй grep… чтобы явно игнорировать строки, в которых есть "grep".

    (Конечно, есть лучшие инструменты, такие как pgrep -alf screen , но многие люди все еще используют этот тип конвейера ps|grep|grep… только потому, что его легко объединить, зная только ps и grep .)

  3. Третья команда, grep -i screen , снова просто извлекает строки, содержащие "screen".

    Как описано на странице руководства и в выводе grep --help , добавление опции -i делает поиск нечувствительным к регистру, поэтому он также выводит строки, в которых есть "Screen" или "SCREEN".

Короче говоря, полная команда просто печатает те строки ps… которые говорят о "экранной" программе.

«Выше две команды возвращают 431 и 7 в примере отсюда…»

Они не Они возвращают информацию о процессах с именем "screen" или "tmux". Число, указанное в примере, представляет собой количество возвращаемых процессов.

Автор слайд-шоу не включал полный вывод (что на самом деле не актуально); они только включали общее количество в качестве сводки, демонстрируя, что количество "экранных" пользователей в 60 раз больше, чем "tmux".

Если вы хотите, чтобы команда фактически подсчитывала для вас строки, вы можете а) добавить опцию -c (count) к последней команде grep… или b) передать ее через | wc -l (Либо работает.)


«… Но в моей системе это возвращает мусор».


Возвращает некоторые ранее запущенные старые файлы makefile и усеченное дерево процессов.

Это не мусор - это именно тот результат, о котором вы просили.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .