Jak zabijać tylko wtedy, gdy proces jest uruchomiony?


14

Obecnie używam takiego wiersza w moim pliku skryptu sh:

kill `ps aux | grep -F 'myServer' | grep -v -F 'grep' | awk '{ print $2 }'` 

Ale zastanawiam się, jak to nazwać, jeśli proces ( myServertutaj) jest uruchomiony?


wywołanie jest niemożliwe killtylko wtedy, gdy proces jest uruchomiony, ponieważ między testem a wywołaniem występuje warunek wyścigu kill(możliwe, że proces został zatrzymany z innego powodu w tak krótkim czasie). Powinieneś użyć pkilllub, killallktóre robią dokładnie to samo, co próbujesz zrobić, ale z mniejszą ilością do pisania (i prawdopodobnie także z innymi zaletami).
JanC

Odpowiedzi:


20

Zwykle używam tylko pgrep i pkill

if pgrep myServer; then pkill myServer; fi

7
Dlaczego nie pkill myServerczy killall -q myServer? Próba zabicia nieistniejących procesów nie ma negatywnej strony.
David Foerster

12
Nie wyjdzie z 0, jeśli nie ma procesu do zabicia, więc może uszkodzić skrypty.
boutch55555

6
Dołącz || truewtedy.
David Foerster,

To prawda, ale nie będziesz mieć możliwości dodania innej, aby poinformować Cię, że proces już nie żył.
boutch55555

Co if ! killall -q myServer; then echo ERROR; fi?
David Foerster,

9

Możesz zabijać procesy według nazw, używając pkilllub killall, sprawdzaj ich strony podręcznika.


tak, w przeciwieństwie do kill, zabija to tylko wtedy, gdy proces jest uruchomiony. Na przykładpkill -u myuser -f myprocess\.[0-9]+
Chase T.

6

Trochę innego podejścia byłoby coś takiego:

killall PROCESS || echo "Process was not running."

Pozwoli to uniknąć 1kodu błędu zwróconego z killallpolecenia, jeśli proces nie istnieje. Ta echoczęść wejdzie w życie tylko wtedy, gdy killallpowróci 1, a sama powróci 0(sukces).


5
Używanie killall -qjest lepsze
Anwar

1
Ostrzeżenie, killall -qnie jest obsługiwane we wszystkich wersjach uniksowych, macOS Catalina wciąż go nie ma.
tresf

0

spróbuj użyć:

sudo kill `pidof process_name`

gdzie nazwa_procesu to nazwa procesu, który chcesz zabić. Wspaniałe w tym jest to, że pidof wyświetli pid wszystkich procesów pasujących do podanej nazwy. Ponieważ kill akceptuje wiele pidów, zabije ich wszystkich jednym kaprysem.

Daj mi znać, jeśli to pomoże.


Co jeśli lista jest pusta? (moim głównym celem nie było w ogóle wywoływanie zabicia, jeśli to możliwe)
myWallJSON

1
Jeśli lista jest pusta, kill zwróci kod błędu 1 i niczego nie zabije. Byłoby to równoważne z próbą wywołania zabicia bez argumentów. Możesz dodać instrukcję if, która najpierw sprawdza, czy pidof zwraca pustą listę. Jeśli nie zwróci pustej listy, zadzwoń kill `pidof process_name. Jeśli zwraca pustą listę, pomiń wezwanie zabicia.
amandion

0

Mały skrypt, który stworzyłem w R&D. mam nadzieję, że Ci się spodoba

#!/bin/bash

echo " Enter the process name:"
read $proc_name
if pgrep $proc_name
then
echo " $proc_name running "
pkill $proc_name
echo "$proc_name  got killed"
else
echo " $proc_name is not running/stopped "
fi

zapisz go z nazwą, np. script.sh

chmod +x script.sh
./script.sh

Następnie podaj nazwę procesu.

Uwaga: wiele razy próbowałem z tym i jego w porządku.


Chcę wiedzieć, co jest nie tak z tym skryptem i -ve głosowanie wymaga wyjaśnienia.
rɑːdʒɑ

Nic złego w tym skrypcie ... +1
WinEunuuchs2Unix

0

Sprawdź, czy proces istnieje pidof. Jeśli tak, zabij to:

(! pidof process_name) || sudo kill -9 $(pidof process_name)

Kod zakończenia zawsze wynosi 0 po wykonaniu powyższej komendy.


0

Użyj pkillz opcją-f

pkill -f myServer

Opcją -fjest wzorzec, który zwykle jest dopasowywany do nazwy procesu.


-1

Użyłbym:

ps x --no-header -o pid,cmd | awk '!/awk/&&/myServer/{print $1}' | xargs -r kill

xargs -rKaze biec zabić tylko jeśli nie ma wejścia. ps --no-header -eo pid,cmdDostaje wyjścia do lepszego formatu parsowania.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.