pgrep для процессов, которые не связаны с терминалом в Ubuntu

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

Когда я делаю ps aux | less Команда, я вижу в поле TTY много процессов с ? персонаж.

Я хотел бы получить эти идентификаторы процесса. Есть ли способ сделать это с pgrep?

Я попытался просмотреть документацию здесь, но она мне не очень понятна.

2 ответа

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

Есть ли способ сделать это с pgrep?

Нет, но есть способ ps и его варианты

  • a … this option causes ps to list all processes with a terminal …
  • -N Select all processes except those that fulfill the specified conditions (negates the selection). …
  • o format Specify user-defined format. …

Итак, чтобы получить только те идентификаторы процесса без строки заголовка:

ps a -N opid=

С помощью find

pgrep --inverse -t \
  "$(find /dev/ -type c -regex '.*tty[0-9]+' -printf '%f ')"

find Команда вызывается путем подстановки команды. Поскольку подстановка команды заключена в двойные кавычки, вывод передается preg как одно слово.

Опции:

  • -type c выбирает только символьные специальные файлы (можно проверить с помощью stat -c '%F' /dev/tty*);
  • -regex '.*tty[0-9]+' выбирает только файлы, соответствующие регулярному выражению, вот и все (.*) с последующим одним или несколькими (+) цифры ([0-9]);
  • -printf '%f ' выводит имя файла с пробелом (find печатает завершающий символ новой строки по умолчанию). поскольку -t опция принимает список имен TTY (без "/dev/" префикс), разделенные запятыми или пробелами, мы можем поставить либо пробел, либо запятую после имени файла (%f).

Использование расширения имени файла

cd /dev
ttys=( tty[0-9][0-9]?[0-9]? )
cd - >/dev/null
pgrep -a --inverse -t "${ttys[*]}"

tty[0-9][0-9]?[0-9]? расширен до tty сопровождаемый одной, двумя или тремя цифрами (? делает предыдущий шаблон необязательным).

ttys=( words ) строит массив из IFS разделенные слова (IFS также известен как "разделитель поля ввода").

"${ttys[*]}" раскрывается в одно слово, состоящее из элементов массива, разделенных первым символом из IFS (по умолчанию это пробел).

Другие вопросы по тегам