Mam .pid
plik i muszę sprawdzić, czy proces jest uruchomiony. Do tej pory znalazłem dwie opcje
kill -0 `cat something.pid`
który wypisuje błąd, jeśli pid nie działa. Wiem, że można to przekierować /dev/null
, ale sprawia, że myślę, że nie jest to najlepsze rozwiązanie.
Drugim rozwiązaniem byłoby użycie ps
, które jednak drukuje również na STDOUT
ps -ef `cat something.pid`
Czy przekierowanie wyjścia /dev/null
i zwyczajne użycie zwróconego kodu stanu jest normalne , czy jest to znak, że robię coś źle i potrzebuję innego polecenia?
kill -0
tak, jak jest to zgodne ze standardem (POSIX).Odpowiedzi:
w przypadku większości dystrybucji Linuksa wyliczenie / proc / {pid} jest dobrym sposobem na uzyskanie informacji o uruchomionych procesach i zwykle o tym, jak polecenia przestrzeni użytkownika, takie jak „ps”, komunikują się z jądrem. Na przykład możesz to zrobić;
Edycja: powinieneś sprawdzić, czy kpid jest ustawiony, ale jest to bardziej przydatne, ponieważ zwróci „nie istnieje” dla unset $ {kpid}
źródło
${kpid}
istniejeJak zauważył Anders, powinieneś używać
kill -0
do zachowania zgodności z POSIX.W systemach Linux można również sprawdzić, czy istnieje plik w systemie plików / proc, np.
źródło
Jeśli jest to w skrypcie (który, jak zakładam, jest tak, ponieważ martwisz się drukowaniem na standardowe wyjście), możesz to zrobić w następujący sposób:
Do
ps -p
szuka proces z PID określonej w something.pid (the$()
składnia jest nieco nowsza wersja grawis. Grawis potrzebuje ucieczki w pewnych okolicznościach, które nowa forma nie). Do2>&1
przekierowania stderr do tego polecenia, jak również.Jeśli
ps -p
polecenie nie znajdzie procesu z tym PID, kończy działanie z błędem> 0, a więcelse
zostaje wykonane. W przeciwnym raziekill
oświadczenie. Możesz negować powyższe, jeśli chcesz, wykonując:Mam nadzieję, że to odpowiada na twoje pytanie. Oczywiście używaj niebezpiecznych poleceń, takich jak
kill
.źródło
Oto kilka opcji:
/etc/init.d/
) i korzystasz z dystrybucji opartej na Debianie, lepiej użyjstart-stop-daemon
: Powinieneś otrzymać kod wyjścia 0, jeśli jest uruchomiony.procps
pakietu:źródło
Jeśli masz plik pid, możesz użyć pgrep, aby sprawdzić, czy proces jest uruchomiony:
źródło