Połączyłem polecenie zwrócenia identyfikatora procesu działającego demona:
ps aux | grep daemon_name | awk "{ print \$2 }"
Działa idealnie i zwraca PID, ale zwraca również drugi PID, który prawdopodobnie jest procesem, który teraz uruchamiam. Czy istnieje sposób, aby wykluczyć moje polecenie z listy zwróconych PID?
Testowałem to kilka razy i wydaje się, że moje polecenie jest zawsze drugim PID na liście, ale nie chcę pobierać tylko pierwszego PID, na wypadek, gdyby był niedokładny.
Odpowiedzi:
-v
Przełącznik grep odwraca wynik, wykluczając go z kolejki. Więc zrób to tak:UPD . Możesz także użyć
-C
przełącznika, aby określić nazwę polecenia w następujący sposób:Ten ostatni
-o
określa, które kolumny informacji chcesz umieścić na liście.pid
wyświetla tylko kolumnę id procesu. A znak równości=
popid
oznacza, że nie będzie tytułu kolumny dla tego, więc otrzymujesz tylko wyraźne liczby - PID.Mam nadzieję że to pomoże.
źródło
Możesz użyć sztuczki klasy postaci. „[d]” nie pasuje do „[d]” tylko „d”.
Wolę to niż używanie
| grep -v grep
.źródło
| grep -v grep
będzie łatwiej ją zrozumieć, kiedy ponownie odwiedzę mój kod."[d]" does not match "[d]" only "d"
?grep
polecenie nie będzie pasować dops
wiersza wyjściowegogrep
samego polecenia (co tak nazywało się „drugim PID” w pierwotnym pytaniu). Wyrażeniea[xy]d
ma nie pasuje do tekstua[xy]d
, ale robi dopasowania tekstuaxd
lub tekstayd
. Dlatego wyrażenie[f]oo
pasuje do tekstu,foo
ale nie do tekstu[f]oo
. Mam nadzieję, że to jasne.Unikaj analizowania
ps
wyników, jeśli istnieją bardziej niezawodne alternatywy.źródło
pgrep
wyszukuje według podłańcuchu, a jednocześniepidof
dokładnie dopasowuje - dokładnie to, czego potrzebowałem! dzięki!Ta
ps -C
opcja nie jest uniwersalna na wszystkich systemach opartych na Uniksie, ale jeśli działa na twoich systemach. Zamiast tego całkowicie unikałbym grep:ps aux | awk '/daemon_name/ && !/awk/ { print $2 }'
Nie trzeba niczego uciekać w pojedynczym cudzysłowie.
ps aux
da ci pełną listę procesów w większości systemów opartych na Uniksie iawk
zazwyczaj jest instalowana domyślnie.źródło
Służy
pgrep
do wyszukiwania pid procesu według nazwy:Z dodatkową nazwą procesu w wyniku (
-l
):Wyszukaj i wyświetl nazwę procesu (
-l
) i argumenty (-f
):Dobrą rzeczą
pgrep
jest to, że nigdy nie zgłosi się jako dopasowanie. Ale nie musisz pobierać pid,pgrep
a następnie zabijać odpowiedni proceskill
.pkill
Zamiast tego użyj :Podaj
SIGKILL
sygnał (-9
lub-KILL
) zamiastSIGTERM
(domyślnie):Poszukaj nazwy procesu (
-l
) i argumentów (-f
), poproś o potwierdzenie (-I
) przed zabiciem go przezSIGKILL
sygnał (-9
lub-KILL
):Zauważ, że
-I
opcja jest dostępna tylko w niektórych wersjachpkill
, np. Tej w OS X Mavericks.źródło
Jeśli korzystasz z bash, możesz to zrobić w następujący sposób, korzystając z
ps -eaf
źródło
ps -eaf | grep "process_name" | awk '{print $2}'
ten wiersz zwraca pid (identyfikator procesu) z wyłączeniem „grep”
źródło