Piszę skrypt Perla, który analizuje pliki dziennika w celu zebrania PID, a następnie sprawdza, czy ten PID jest uruchomiony. Próbuję wymyślić najlepszy sposób na sprawdzenie tego. Oczywiście mógłbym zrobić coś takiego:
system("ps $pid > /dev/null") && print "Not running\n";
Jednak wolę unikać połączenia systemowego, jeśli to możliwe. Dlatego pomyślałem, że mogę użyć /proc
systemu plików (przenośność nie stanowi problemu, zawsze będzie działał w systemie Linux). Na przykład:
if(! -d "/proc/$pid"){
print "Not running\n";
}
Czy to jest bezpieczne? Czy zawsze mogę założyć, że jeśli nie ma /proc/$pid/
katalogu, powiązany PID nie jest uruchomiony? Spodziewam się tego, skoro i tak AFAIK ps
sam otrzymuje informacje, /proc
ale ponieważ dotyczy to kodu produkcyjnego, chcę być pewien.
Czy mogą więc wystąpić przypadki, w których uruchomiony proces nie ma /proc/PID
katalogu lub /proc/PID
katalog istnieje, a proces nie jest uruchomiony? Czy istnieje powód, dla którego wolisz parsowanie ps
niż sprawdzanie istnienia katalogu?
kill -0
jest najlepsza), to powie ci tylko, czy jest uruchomiony proces z danym PID . Nie mówi ci, czy proces będzie nadal działał o jedną milisekundę później, ani nie mówi, czy jest to proces, który Cię interesuje, czy proces niepowiązany, któremu przypisano ten sam PID po śmierci interesującego procesu . Prawie zawsze błędem jest sprawdzenie, czy dany PID działa : jest bardzo niewiele okoliczności, w których nie jest to podatne na warunki wyścigowe.
kill
funkcja perla wykorzystująca sygnał 0, który nie zabija, ale mówi, czy możesz to zrobić (tzn. potrzebujesz zgody na sygnalizowanie tego procesu).