Plik zawierający identyfikator procesu nie jest wiarygodny, sprawdź, czy proces jest uruchomiony, czy nie. Jest to tylko wiarygodne źródło, aby dowiedzieć się, jaki jest ostatni podany identyfikator procesu.
Gdy masz identyfikator procesu, musisz wykonać późniejsze sprawdzenie, czy proces naprawdę działa.
Oto przykład:
#!/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 to fajne polecenie, ale będziesz mieć kłopoty, gdy uruchomisz wiele instancji. Na przykład, jeśli masz zwykły sshd działający na porcie TCP / 22 i masz inny sshd działający na porcie TCP / 2222, wtedy pgrep dostarczy dwa identyfikatory procesu podczas wyszukiwania sshd ... kiedy normalny sshd ma swój pid w / var /run/sshd.pid, a drugi może mieć swój pid w /var/run/sshd-other.pid, możesz wyraźnie odróżnić procesy.
I nie zaleca się używanie tylko ps , rurociągi za pośrednictwem jednej lub kilku rur z grep i grep -v próbuje odfiltrować wszystkie inne rzeczy, które nie interesuje ... to trochę jak za pomocą
find . | grep myfile
dowiedzieć się, czy plik się kończy.