
Я использую 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."
Примечания:
- PID завершенных процессов могут/будут повторно использованы в конечном итоге, поэтому даже если PID используется, это может быть не тот процесс, который вас интересует.
- Если PID в файле относится к периоду до недавней (пере)загрузки, то процесс, очевидно, больше не существует, даже если PID сейчас используется. (Подсказка:настроить программу так, чтобы файл был на
tmpfs
).
решение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, то сигнал не отправляется, но проверка ошибок все равно выполняется; это можно использовать для проверки существования идентификатора процесса или идентификатора группы процессов.