Řešení 1:
zjednodušeně řečeno ne :Proces (např. démon) může spadnout a nemá čas vymazat svůj soubor .pid.
Technika, jak si být jisti stavem programu:použijte explicitní komunikační kanál, jako je soket. Zapište port soketu do souboru a zadejte supervisor
proces vyhledat.
Můžete také využít služeb DBus na Linuxu:zaregistrujte si konkrétní jméno a nechte svůj supervizor (ať už to nazýváte jakkoli) toto jméno zkontrolovat.
Existuje mnoho technik.
Je třeba si zapamatovat jednu věc:OS není odpovědný za správu souborů PID.
Řešení 2:
Jldupont má pravdu, když uvádí, že soubory .pid nejsou spolehlivé pro určení, zda je proces spuštěn, protože soubor nemusí být v případě havárie odstraněn.
Pomineme-li závodní podmínky, často používám pgrep když potřebuji vědět, zda nějaký proces běží. Pokud bych to považoval za nutné, mohl bych výstup porovnat se souborem (soubory) .pid.
Řešení 3:
Soubor obsahující ID procesu není spolehlivý, určete, zda je proces spuštěn nebo ne. Je to jen spolehlivý zdroj, jak zjistit poslední dané ID procesu pro proces.
Když máte ID procesu, musíte provést další kontrolu, zda proces skutečně běží.
Zde je příklad:
#!/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 je pěkný příkaz, ale budete mít potíže, když budete mít spuštěno více instancí. Například když máte běžný sshd spuštěný na portu TCP/22 a máte jiný sshd spuštěný na portu TCP/2222, pak pgrep dodá dvě ID procesu při hledání sshd ... když normální sshd má své pid v /var/run/sshd.pid a druhý může mít své pid v /var/run/sshd-other.pid, můžete procesy jasně rozlišit.
Ne doporučujeme používat pouze ps , procházející jedním nebo více potrubími pomocí grep a grep -v snažíte se odfiltrovat všechny ostatní věci, které vás nezajímají... je to trochu jako používání
find . | grep myfile
zjistit, zda se soubor ukončí.
Řešení 4:
Není spolehlivé jednoduše zkontrolovat existenci procesu se stejným pid, jaký je obsažen v souboru.
Ale mnoho implementací pidfile také zamyká pidfile, takže pokud proces zemře, zámek zmizí. Za předpokladu, že je zamykací mechanismus spolehlivý, je kontrola, zda je soubor stále uzamčen, relativně spolehlivým mechanismem pro určení, zda původní proces stále běží.