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

Согласно странице ps :

За исключением случаев, описанных ниже, параметры выбора процесса являются аддитивными. Выбор по умолчанию отбрасывается, а затем выбранные процессы добавляются в набор процессов для отображения. Таким образом, процесс будет показан, если он соответствует любому из выбранных критериев выбора.

Я полагаю, это означает, что матчи «ИЛИ», а не «И».

Я разрабатываю свой собственный скрипт блокировки, который создает каталог (mutex mutex) и записывает информацию PPID и PID в файл в этом каталоге. Одной из функций скрипта является очистка устаревших файлов блокировки путем перебора всех файлов блокировки и извлечения $ PPID и $ PID. Затем он определяет, работает ли еще процесс PID $ PID и PPID $ PPID.

Однако с ps я получаю все процессы с PPID $ PPID, и я также получаю PID $ PID. Я хочу, чтобы он показывал мне только процесс с pid $ PID и ppid $ PPID

Я понимаю, что grep здесь интуитивно полезен, но есть ли «дешевый» способ использования? Возможно, еще одна утилита, связанная с процессом?


Procps-3.2.7-16.el5

3 Solutions collect form web for “ps, чтобы показать только процессы, которые соответствуют более чем одному условию (AND)”

Я просто проверил, похоже, у CentOS 6.6 pgrep нет опции -F , поэтому это неприменимо. Я оставлю этот ответ здесь, поскольку он может быть полезен в других случаях.


pgrep может быть тем, что вы хотите:

 -P, --parent ppid,... Only match processes whose parent process ID is listed. -F, --pidfile file Read PID's from file. This option is perhaps more useful for pkill than pgrep. 

Кажется, что pgrep с -F будет фильтровать PID, чтобы они совпадали с файлами в файле:

 $ pgrep libvirtd 1343 18471 $ pgrep -F /var/run/libvirtd.pid -P 1 1343 $ echo -n 18471 > other-libvirtd.pid $ pgrep -F other-libvirtd.pid -P 1 $ pgrep -F other-libvirtd.pid 18471 

Использование одного параметра ps и дальнейшая фильтрация с помощью grep или awk – разумный подход.

Пропустите параметр -o в ps и ограничьте поля теми, которые вам нужны. Используйте знак равенства после каждого имени поля, чтобы подавить строку заголовка. Если вам не нужно имя команды, не включайте comm или args , которые могут включать в себя новые строки (и в любом чувствительном к безопасности контексте, если они содержат новую строку, убедитесь, что ваш скрипт делает что-то разумное). Например, если вам нужен только PID и хотите, чтобы все процессы, принадлежащие определенной группе, выполнялись на определенном TTY, вы можете собирать PID с помощью

 pid_list=$(ps -t tty3 -o 'pid= gid=' | awk '$2 == 1234 || $2 == "somegroup"') 

В вашем случае это слишком много. Существует один процесс, который имеет заданный PID, поэтому условие -p $PID – это вся необходимая фильтрация. Получите PPID процесса этим PID и сравните его с ожидаемым значением. ps ничего не выдаст, если нет процесса с этим PID.

 read pid expected_ppid <"$pidfile" actual_ppid=$(ps -o ppid= -p "$pid") if [ "$actual_ppid" = "$expected_ppid" ]; then … 

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

Это решение Shell, которое не требует внешних утилит, кроме ps

 if [[ `ps --pid $PID -oppid=` = $PPID ]] then : still running else : not running fi 
  • Centos или Scientific Linux
  • YUM: обновление ключа GPG от репо
  • Чтобы grep точное слово
  • Не удалось отправить ssh с одного сервера Google RedHat / CentOS на другой
  • Мне нужно взять вывод команды и сделать ее именем файла, используя скрипт
  • kswapd0 занимает от 99% до 100% процессора в RHEL 6.3
  • Невозможно установить glibc и glibc-common, потому что они нужны друг другу
  • NFS изменяет право собственности
  • Команды для определения уровня использования сервера
  • Исключение разрешения на файл устройства (RHEL 6.1)
  • Не удается запустить экземпляр пользователя systemd
  • Interesting Posts

    Удаленная установка pip из python3 без рута

    Переменная TERM в chroot

    Проблема драйвера Nvidia на приостановление Linux Mint

    Как активировать режим AP в файлах конфигурации?

    Не удалось прочитать файл по какой-либо причине

    Как подтвердить успешный отчет об ошибках в Reportbug Debian?

    Почему все файлы обнаружены как приложение / октет-поток в nemo?

    Сумма альтернативных значений в столбце с использованием команды sed или nawk

    Каковы некоторые практические применения перенаправления STDIN?

    Создание правила UFW, позволяющего приложению использовать динамические порты

    Opensuse 11.4 очень медленный на 8 ГБ ОЗУ i5 процессор

    В AIX, как я могу получить полный путь к программе, связанной с портом?

    Deepin Обновление: конец паники ядра – не синхронизируется: VFS: невозможно смонтировать root fs в unknow-block (0,0)

    почему права собственности на файловую систему не влияют после монтирования?

    пароль root изменен автоматически

    Linux и Unix - лучшая ОС в мире.