Файл, що містить ідентифікатор процесу, не є надійним. Визначати, працює процес чи ні. Це просто надійне джерело для з'ясування останнього заданого ідентифікатора процесу.
Коли у вас є ідентифікатор процесу, вам потрібно пройти подальшу перевірку, чи процес дійсно запущений.
Ось приклад:
#!/usr/bin/env sh
file="/var/run/sshd.pid"
processid=$(cat /var/run/sshd.pid)
if [ ! -f ${file} ]; then
echo "File does not exists: ${file}"
exit 1
fi
if [ ! -r ${file} ]; then
echo "Insufficient file persmissons: ${file}"
exit 1
fi
psoutput=$(ps -p ${processid} -o comm=)
if [ $? == 0 ];then
if [ ${psoutput} == "sshd" ]; then
echo "sshd process is realy running with process id ${processid}"
exit 0
else
echo "given process id ${processid} is not sshd: ${psoutput}"
exit 1
fi
else
echo "there is no process runing with process id ${processid}"
exit 0
fi
pgrep - хороша команда, але ви потрапите в проблеми, коли буде запущено кілька екземплярів. Наприклад, коли у вас звичайний sshd працює на порту TCP / 22 і у вас інший sshd працює на порту TCP / 2222, тоді pgrep доставить два ідентифікатори процесу при пошуку sshd ... коли звичайний sshd має свій pid в / var /run/sshd.pid та інші можуть мати свій pid у /var/run/sshd-other.pid, ви можете чітко диференціювати процеси.
Я не рекомендую використовувати лише ps , пропускаючи через одну або кілька труб за допомогою grep і grep -v, намагаючись відфільтрувати всі інші речі, які вас не цікавлять ... це трохи схоже на використання
find . | grep myfile
щоб з'ясувати, якщо файл виходить.