Um arquivo contendo uma identificação 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 fornecido para o processo.
Quando você tem o ID do processo, é necessário fazer uma verificação adicional, 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 em execução na porta TCP / 22 e outro sshd em execução na porta TCP / 2222, o pgrep fornecerá dois IDs de processo ao procurar por sshd ... quando o sshd normal tiver 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 , canalizar através de um ou vários pipes 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 sair.