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

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

Я использую RHEL 7.5 и у меня есть программа Java, которая включает файл с номером PID. Если процесс убит, файл все еще существует, и я делаю скрипт для проверки того, является ли PID, который хранится в этом файле, живым или нет, но у меня есть сомнения или проблема.

Существует PID 445 и существует 2445. Так как же мне получить только 445?

Я попробовал следующую команду:

ps -ax | egrep "^ 445"

Но ничего не вернулось.

Два процесса:

ps -ax | grep -v grep | egrep "445"

  445 pts/2    Sl     3:50 /opt/
 2445 ?        S      0:00 dbus-launch

решение1

Использовать -p:

-p proclist
Запишите информацию для процессов, идентификационные номера которых указаны в proclist. […]

(источник)

В твоем случае:

ps -p 445

POSIX говорит, psчто должен возвращать положительный статус выхода, если «произошла ошибка». Каждый psпротестированный мной считает, proclistчто не содержит хотя бы один PIDсуществующийпроцесс как "ошибочный". Это полезно. Пример:

ps -p 445 >/dev/null && echo "Process exists."

Примечания:

решение2

Проверить, запущен ли процесс в скриптах Bash, можно следующим образом kill -0:

if [ -f ${pid_file} ] && kill -0 $(cat ${pid_file}) 2>/dev/null; then
  exit
else
  rm -rf ${pid_file}
  exit
fi

Равен ${pid_file}пути к файлу с PID в нем. Проверяет, -f ${pid_file}существует ли файл PID. Затем kill -0 $(cat ${pid_file})проверяет, запущен ли процесс.

Что сводится к следующему:

  • Если процесс запущен, просто ничего не делайте, просто выйдите из скрипта.
  • В противном случае (если процесснетзапускается, просто удалите PID-файл.

Магия в этом kill -0объясняется на странице руководстваkill:

Еслисигравно 0, то сигнал не отправляется, но проверка ошибок все равно выполняется; это можно использовать для проверки существования идентификатора процесса или идентификатора группы процессов.

Связанный контент