Sądząc po twoim pytaniu, nie musisz się martwić używaniem pgrep i pkill, więc oto kilka innych powszechnie używanych opcji.
1) Użyj killproc
z /etc/init.d/functions
lub /lib/lsb/init-functions
(która jest zawsze odpowiednia dla twojej dystrybucji i wersji Linuksa). Jeśli piszesz skrypt usługi, być może już dołączasz ten plik, jeśli użyłeś jednej z innych usług jako przykładu.
Usage: killproc [-p pidfile] [ -d delay] {program} [-signal]
Główną zaletą korzystania z tego jest to, że wysyła SIGTERM, czeka, aby zobaczyć, czy proces kończy i wysyła SIGKILL tylko wtedy, gdy jest to konieczne.
2) Można również użyć tajnego sosu killproc, który polega na znalezieniu identyfikatorów procesu do zabicia przy użyciu pidof
, który ma opcję -o
do wykluczenia określonego procesu. Argumentem dla -o
może być $$
, bieżący identyfikator procesu lub %PPID
, który jest specjalną zmienną, którą pidof interpretuje jako skrypt wywołujący pidof. Na koniec, jeśli demon jest skryptem, potrzebujesz -x, więc próbujesz zabić skrypt przez jego nazwę, zamiast zabijać bash lub python.
for pid in $(pidof -o %PPID -x progd); do
kill -TERM $pid
done
można zobaczyć przykład tego w artykule Bash: How to check if your script is already running
użycie pgrep i pętli następnie zabić? –
Zamierzałem to zrobić, ale zadałem to pytanie na wypadek, gdyby było prostsze rozwiązanie. – kaspersky