Um arquivo que contém um id de processo não é confiável para determinar se um processo está sendo executado ou não. É apenas uma fonte confiável, para descobrir o último ID de processo dado para o processo.
Quando você tem o id do processo, você precisa fazer uma verificação mais detalhada, se o processo estiver realmente em execução.
Aqui está um exemplo:
#!/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
O pgrep é um bom comando, mas você terá problemas quando tiver várias instâncias em execução. Por exemplo, quando você tem um sshd regular rodando na porta TCP / 22 e você tem outro sshd rodando na porta TCP / 2222, então o pgrep irá entregar dois ids de processo quando procurar por sshd ... quando o normal O sshd tem seu pid em /var/run/sshd.pid e o outro pode ter seu pid em /var/run/sshd-other.pid você pode diferenciar claramente os processos.
Eu não recomendo usar apenas ps , canalizando um ou vários canais com grep e grep -v tentando filtrar todas as outras coisas que não lhe interessam ... é um pouco como usar
find . | grep myfile
para descobrir se um arquivo sai.