KILL(1) Polecenia użytkownika KILL(1)

kill - kończy proces

kill [-sygnał|-s sygnał|-p] [-q wartość] [-a] [--timeout milisekundy sygnał] [--] pid|nazwa...

kill -l [liczba|0xmaska-sygnałów] | -L

kill -d pid

Polecenie kill wysyła podany sygnał do określonych procesów lub grupy procesów.

Jeśli nie określi się sygnału, wysyłany jest sygnał TERM. Domyślną akcją tego sygnału jest przerwanie procesu. Sygnał ten powinien być preferowany wobec sygnału KILL (o numerze 9), ponieważ proces może zainstalować procedurę obsługi sygnału TERM, aby powziąć kroki w celu posprzątania, przed zakończeniem w uporządkowany sposób. Jeśli proces nie zakończy się po wysłaniu sygnału TERM, wtedy można użyć sygnału KILL; proszę mieć na uwadze, że ten ostatni sygnał nie może być przechwycony, zatem nie daje możliwości dokonania jakiegokolwiek sprzątania przed zakończeniem procesu.

Większość współczesnych powłok ma wbudowane polecenie kill, którego stosowanie jest zbliżone do opisywanego tu polecenia. Opcje --all, --pid i --queue oraz możliwość określenia procesów nazwą polecenia, są lokalnymi rozszerzeniami.

Jeśli sygnał wynosi 0, to nie jest wysyłany żaden sygnał, lecz sprawdzanie pod kątem wystąpienia błędów jest wciąż przeprowadzane.

Lista procesów, które mają otrzymać sygnał, może zawierać przemieszane nazwy i identyfikatory procesów.

pid

Każdy identyfikator procesu pid można podać w jeden z następujących sposobów:

n

gdzie n jest większe od 0. Sygnał otrzyma proces z PID równym n.

0

Sygnał otrzymają wszystkie procesy w bieżącej grupie procesów.

-1

Sygnał otrzymają wszystkie procesy z PID większym niż 1.

-n

gdzie n jest większe niż 1. Sygnał otrzymają wszystkie procesy w grupie procesów n. Gdy podaje się argument w postaci "-n" i ma on wskazywać grupę procesów, należy albo podać sygnał jako pierwszy, albo niniejszy argument musi być poprzedzony opcją "--", w innym przypadku zostanie bowiem potraktowany jako numer sygnału do wysłania.

nazwa

Sygnał otrzymają wszystkie procesy wywołane za pomocą tej nazwy.

-s, --signal sygnał

Sygnał do wysłania. Można go podać jako nazwę lub numer.

-l, --list [liczba|0xmaska-sygnałów]

Wypisuje listę nazw sygnałów, przekształca podany numer sygnału na jego nazwę albo przekształca podaną maskę sygnałów na nazwy. Sygnały można znaleźć w pliku /usr/include/linux/signal.h.
$ ps s $$
  UID     PID          PENDING          BLOCKED          IGNORED           CAUGHT STAT TTY        TIME COMMAND
 1000 1608069 0000000000000000 0000000000000002 0000000000384000 0000000008013003 Ss   pts/44     0:02 zsh
$ kill -l 0x0000000000384000
TERM
TSTP
TTIN
TTOU

-L, --table

Podobnie do -l, lecz wypisze nazwy sygnałów wraz z powiązanymi numerami.

-a, --all

Nie ogranicza przekształceń typu: nazwa polecenia na PID, tylko do procesów, z tym samym identyfikatorem użytkownika jak bieżący proces.

-p, --pid

Wypisuje tylko identyfikatory procesów (PID) podanych procesów, nie wysyła żadnych sygnałów.

-r, --require-handler

Nie wysyła sygnału, jeśli nie jest on przechwytywany w przestrzeni użytkownika procesu otrzymującego sygnał.

--verbose

Wypisuje PID(y), które otrzymałyby sygnał od kill, wraz z sygnałem.

-q, --queue wartość

Wysyła sygnał za pomocą sigqueue(3), zamiast kill(2). Argument wartość jest liczbą całkowitą wysyłaną razem z sygnałem. Jeśli otrzymujący proces zainstalował procedurę obsługę tego sygnału za pomocą znacznika SA_SIGINFO sigaction(2), to może otrzymać te dane za pomocą pola si_sigval struktury siginfo_t.

--timeout milisekundy sygnał

Wysyła sygnał zdefiniowany w zwykły sposób do procesu, po czym wysyła dodatkowy sygnał, po podanym czasie. Opcja --timeout powoduje, że kill odczeka zdefiniowany w milisekundach czas, przed wysłaniem kolejnego, podanego sygnału do procesu. Funkcję tę zaimplementowano za pomocą funkcjonalności PID-u deskryptora pliku jądra Linux aby zapewnić, że kolejny sygnał zostanie wysłany do tego samego procesu oraz że nie zostanie wysłany do procesu, który już nie istnieje.

Proszę zauważyć, że system operacyjny może użyć ponownie danego PID-u, zatem zaimplementowanie równoważnej funkcji w powłoce, za pomocą kill i sleep mogłoby powodować wyścig, gdzie kolejny sygnał zostałby wysłany do innego procesu, który otrzymał odzyskany numer identyfikatora procesu.

Opcję --timeout można podać wielokrotnie: sygnały są wysyłane kolejno po minięciu podanych czasów przeterminowania. Opcję --timeout można łączyć z opcją --queue.

W poniższym przykładzie, polecenie wyśle kolejno sygnały QUIT, TERM i KILL, odczekując po 1000 milisekund pomiędzy nimi:

kill --verbose --timeout 1000 TERM --timeout 1000 KILL \
        --signal QUIT 12345

-d, --show-process-state pid

Odkodowuje pola związane z sygnałem w /proc/pid/status.
$ kill -d $$
Zablokowany: INT
Zignorowany: TERM TSTP TTIN TTOU
Złapany: HUP INT PIPE ALRM CHLD WINCH

kill ma następujące wartości statusu zakończenia:

0

sukces

1

niepowodzenie

64

częściowy sukces (gdy poda się więcej niż jeden proces)

Choć można podać TID (identyfikator wątku - thread ID; zob. gettid(2)) jednego z wątków procesu wielowątkowego jako argument kill, sygnał jest i tak skierowany wobec procesu (tj. całej grupy wątków). Innymi słowy, nie da się wysłać sygnału jedynie do ściśle określonego wątku procesu wielowątkowego. Sygnał zostanie dostarczony do wybranego w sposób dowolny wątku procesu docelowego, który nie blokuje sygnału. Więcej szczegółów opisano w podręczniku signal(7) oraz w opisie CLONE_THREAD w podręczniku clone(2).

Poszczególne powłoki udostępniają wbudowane polecenie kill, które ma pierwszeństwo wobec pliku wykonywalnego kill(1) opisywanego w niniejszym podręczniku. Najłatwiejszym sposobem zapewnienia, że wykona się polecenie tu opisane, jest użycie pełnej ścieżki przy wywołaniu polecenia np. /bin/kill --version

Salvatore Valente <svalente@mit.edu>, Karel Zak <kzak@redhat.com>

Pierwotną wersję zapożyczono z BSD 4.4.

bash(1), tcsh(1), sigaction(2), kill(2), sigqueue(3), signal(7) proc(5) proc_pid_status(5)

Problemy należy zgłaszać w systemie śledzenia błędów https://github.com/util-linux/util-linux/issues.

Polecenie kill jest częścią pakietu util-linux, który można pobrać ze strony Archiwum jądra Linux https://www.kernel.org/pub/linux/utils/util-linux/.

2025-03-29 util-linux 2.41