Wiele programów, takich jak sshd, tworzy pliki .pid w / var / run /, które zawierają ich identyfikatory procesów. Czy te pliki są wiarygodne w celu ustalenia, czy proces jest uruchomiony? Domyślam się, że pliki te są tworzone ręcznie przez proces i dlatego pozostaną w systemie plików, jeśli program się zawiesi.
11
Jldupont ma rację, stwierdzając, że pliki .pid nie są wiarygodne w określaniu, czy proces jest uruchomiony, ponieważ plik może nie zostać usunięty w przypadku awarii.
Pomijając warunki wyścigu, często używam pgrep, gdy muszę wiedzieć, czy proces jest uruchomiony. Mógłbym wtedy odnieść dane wyjściowe do plików .pid, jeśli uzna to za konieczne.
źródło
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:
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ą
dowiedzieć się, czy plik się kończy.
źródło
Sprawdzanie istnienia procesu z tym samym pid, co plik, nie jest niezawodne.
Ale wiele implementacji pliku pidfile blokuje również plik pid, więc jeśli proces umrze, blokada zniknie. Pod warunkiem, że mechanizm blokujący jest niezawodny, sprawdzanie, czy plik jest nadal zablokowany, jest stosunkowo niezawodnym mechanizmem do określania, czy oryginalny proces nadal działa.
źródło
Jldupont ma rację.
Możesz jednak wysłać procesowi sygnał 0 (kill -s 0 pid), aby sprawdzić, czy proces nadal trwa (zakładając, że masz uprawnienia do wysyłania takiego sygnału - ogólnie tylko właściciel procesu może wysłać to sygnał).
źródło
Zgadzam się z jschmier.
W niektórych systemach nie masz dostępu do pgrep. W takim przypadku możesz
ps -aef | grep <pid>
sprawdzić, czy proces naprawdę działa.źródło