Znalezienie identyfikatora procesu i jego zabicie

16

Kiedykolwiek muszę zabijać proces w tle, robię to ps -e | grep <process_name>

Która drukuje coś takiego 1766 ? 00:00:13 conky, a potem wykorzystywać identyfikator procesu, aby killto uczucie tak kill 1766.

Czy mogę to jakoś uprościć? Zrobić to szybciej? zmniejszyć ilość pisania?

Gautam
źródło
1
Otrzymałem odpowiedź, której chcę, ale poczekam chwilę, zanim zaakceptuję, aby społeczność mogła skorzystać z różnych dostępnych opcji.
Gautam,
Prosimy o uczynienie tego pytania bardziej ogólnym, jeśli to możliwe, aby więcej osób mogło skorzystać z odpowiedzi
Gautam

Odpowiedzi:

19

(TL DR: pgrep, pkill)

Wiele wariantów uniksowych jest dostarczanych wraz z pgreptowarzyszącym oprogramowaniem pkill: Solaris , Linux (część standardowych narzędzi procesowych , może być nieobecny we wbudowanych systemach Linux), FreeBSD , OpenBSD , NetBSD ,… ale tylko z MacPorts na OS X , nie AIX i tylko ostatnio w HP-UX . pgrepNarzędziowy przedstawia identyfikator procesu procesów dopasowanych nazwy użytkownika, oraz kilka innych kryteriów. Argument to pgrepjest interpretowany jako wyrażenie regularne, które musi pasować do części nazwy pliku wykonywalnego procesu (chyba że podasz opcję, aby to zmienić). Jeśli zadzwonisz pkillzamiastpgrep, narzędzie wysyła sygnał zamiast wyświetlać identyfikatory procesu.

Innym podobnym narzędziem jest pidof . W systemie Linux jest dostarczany przez SysVinit lub BusyBox (więc często można go znaleźć we wbudowanym systemie Linux, który nie ma pgrep); istnieją również porty w innych wariantach uniksowych. pidofNarzędzie ma mniej opcji, to przeważnie tylko mecze całych nazw plików wykonywalnych. Narzędzie towarzyszące killallwysyła sygnał do dopasowanych programów¹.

¹ Strzeż się, killallco ma inne znaczenie w systemie Solaris i prawdopodobnie w innych wariantach uniksowych; nie wpisuj killalljako root w systemie Solaris.

Gilles „SO- przestań być zły”
źródło
Wow, twoja odpowiedź jest bardzo szczegółowa, o wiele bardziej szczegółowa, dzięki. Jeśli to możliwe, edytuj pytanie, aby dopasować odpowiedź.
Gautam,
@GautamK Nie sądzę, że pytanie wymaga rozszerzenia. Jeśli tak, możesz go edytować samodzielnie.
Gilles „SO- przestań być zły”
Z odpowiedzi z największą liczbą głosów Twoja odpowiedź zawiera więcej szczegółów, więc akceptuję ją
Gautam
8
  • killall ProcessName (wada tego polecenia polega na tym, że nie zawsze znasz nazwę procesu programu).
  • pidof ProccessName i kill the result form pidof
  • ps xu | grep <process name> | grep -v grep | awk '{ print $2 }' | xargs kill -9 Wypróbuj ten jeden wiersz i użyj go ponownie z historii twojego basha lub lepiej stwórz dla niego alias.
Hanan N.
źródło
Drugi pidofwydaje się nieco łatwiejszy, ale nadal wymaga 2 kroków
Gautam,
Mogę wyszukać / utworzyć polecenie jednowierszowe, które robi to w jednym kroku (z grubszą nazwą procesu), ale wymagałoby to wpisania długiej linii (trudniejszej niż w dwóch powyższych krokach), lub można ją wpisać raz i ponownie wykorzystaj to z historii.
Hanan N.
@GautamK zaktualizowałem odpowiedź za pomocą opcji pojedynczego polecenia.
Hanan N.
6

Podczas gdy Hanan ma kilka dobrych sugestii, dodam pgrep/ pkill. Pozwalają na znacznie lepszą kontrolę nad tym, który proces znajdujesz, oraz wyrażeń regularnych, jeśli nie znasz dokładnego procesu, który musisz zabić.

PS Hanana pidofmożna karmić killbezpośrednio za pomocą backticks:

kill `pidof processname`
Kevin
źródło
pkillbyło dokładnie to, czego szukałem, ja większość czasu znać nazwę procesu, głównie jego conkylub firefoxlub chromelub coś podobnego. Dzięki
Gautam,
1

Co powiesz na to -

ps -e | awk '$4~/<process name>/{print $1}' | xargs kill

Przykład:

[jaypal:~/Temp] sleep 100&
[1] 74863
[jaypal:~/Temp] ps -e | awk '$4~/sleep/{print $1}' | xargs kill
[1]+  Terminated: 15          sleep 100

Aktualizacja:

Niestety, to oczywiście nie spełnia wymogu mniejszego pisania, więc dobrym sposobem na zrobienie tego byłoby dodanie functiondo twojego .bashrc, .profilelub cokolwiek innego skryptu startowego. Funkcja może być taka:

killp() {
awk -v pname="$1" '($4==pname){print $1}' <(ps -e) | xargs kill
}

Po dodaniu możesz po prostu przekazać nazwę swojego procesu:

[jaypal:~] sleep 100&
[1] 77212
[jaypal:~] killp sleep
[1]+  Terminated: 15          sleep 100
jaypal singh
źródło