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ć /procsystemu 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 pssam otrzymuje informacje, /procale ponieważ dotyczy to kodu produkcyjnego, chcę być pewien.
Czy mogą więc wystąpić przypadki, w których uruchomiony proces nie ma /proc/PIDkatalogu lub /proc/PIDkatalog istnieje, a proces nie jest uruchomiony? Czy istnieje powód, dla którego wolisz parsowanie psniż sprawdzanie istnienia katalogu?
kill -0jest 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.
killfunkcja perla wykorzystująca sygnał 0, który nie zabija, ale mówi, czy możesz to zrobić (tzn. potrzebujesz zgody na sygnalizowanie tego procesu).