Intereting Posts
Как включить ярлыки для программы установки gnome и приложений для винных приложений в dmenu? Как увеличить количество предыдущего командного текста bash будет прокручиваться до? Изменение UID файлов в / proc Как перенести файлы из определенных каталогов во вновь созданные каталоги на основе их расширения? Как заставить Konqueror быть файловым менеджером по умолчанию? Как ограничить количество соединений на хост, проходящих через маршрутизатор / мост? Отключить обработку пакетов TCP ядром Linux на определенном порту Xmonad не меняет рабочее пространство Пропуск среднего отображения с помощью cryptsetup luksOpen Выполнить команду на основе результата предыдущей команды (без сбоя всего оператора) Можно ли использовать косвенность для установки переменных? Проверка вывода команды, не совсем работающей с помощью скрипта BASH Как узнать, поддерживает ли моя система текущее время системы? CentOS с AutoSSH, уточнение переадресации портов Правило Удева не работает над Debian

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

Я просто проверил, похоже, у 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