Po prostu uderzyłem Ctrlcdwukrotnie moją skorupę, próbując zatrzymać proces, który zajmuje dużo czasu.
^C
powtórzono dwukrotnie, ale proces po prostu trwał.
Dlaczego nie Ctrlczrezygnował z tego procesu tak jak zwykle?
shell
keyboard-shortcuts
lustro
źródło
źródło
kill -9 %
ich zabicie. Sygnału 9 nie można zignorować, podobnie jak sygnał zawieszenia. Sekwencję klawiszy CTRL + Z można teoretycznie zignorować - ale nie ma tego w praktyce.perl -E '$SIG{TSTP} = sub { say "ha ha" }; sleep 1 while 1'
. Prawdopodobnie myślisz o SIGSTOP, który jest innym sygnałem.Odpowiedzi:
Procesy mogą wybrać:
trap '' INT
w powłoce) lub skorzystaj z własnego programu obsługi, który decyduje o nie kończeniu (lub nie kończy się w odpowiednim czasie).stty int '^K'
w przypadku powłoki)stty -isig
w przypadku powłoki).Lub mogą być nieprzerwane, na przykład w trakcie wywołania systemowego, którego nie można przerwać.
W systemie Linux (ze stosunkowo nowym jądrem) możesz sprawdzić, czy proces ignoruje i / lub obsługuje SIGINT, patrząc na wynik działania
SIGINT to 2. Drugi bit SigIgn powyżej to 1, co oznacza, że SIGINT jest ignorowany.
Możesz to zautomatyzować za pomocą:
Aby sprawdzić, jaki jest obecny
intr
znak lub czyisig
jest włączony dla danego terminala:(powyżej
intr
znaku jest^C
(znak zwykle wysyłany przez terminal (emulator) po naciśnięciu, CTRL-Ca sygnały wejściowe nie są wyłączone.(
intr
postać jest^K
iisig
jest wyłączona dla/dev/pts/1
).Dla kompletności istnieją dwa inne sposoby, w jakie proces może zrobić coś, aby przestać otrzymywać SIGINT, chociaż zwykle nie jest to coś, co można by zobaczyć.
Na Ctrl+Csygnał SIGINT jest wysyłany do wszystkich procesów, w tym grupy procesów planie terminalu . Zwykle jest to powłoka, która umieszcza procesy w grupach procesów (mapowanych do zadań powłoki ) i informuje urządzenie końcowe, które jest na pierwszym planie .
Teraz proces może:
Opuść grupę procesów. Jeśli przejdzie do innej grupy procesów (dowolnej grupy procesów oprócz tej, która jest na pierwszym planie ), nie będzie już otrzymywał SIGINT po Ctrl-C(ani innych sygnałów związanych z klawiaturą, takich jak SIGTSTP, SIGQUIT). Może jednak zostać zawieszony, jeśli spróbuje odczytać (ewentualnie również w zależności od ustawień urządzenia końcowego) z urządzenia końcowego (tak jak robią to procesy w tle).
Jako przykład:
nie można przerwać Ctrl-C. Powyżej
perl
spróbuje dołączyć do grupy procesów, której identyfikator jest taki sam jak nadrzędny identyfikator procesu. Zasadniczo nie ma gwarancji, że istnieje taka grupa procesów o tym identyfikatorze. Ale tutaj, w przypadku tegoperl
polecenia uruchamianego samodzielnie po zachęcie interaktywnej powłoki, ppid będzie procesem powłoki, a powłoka zwykle będzie uruchomiona we własnej grupie procesów.Jeśli polecenie nie jest już liderem grupy procesów (liderem tej grupy procesów pierwszego planu), wówczas uruchomienie nowej grupy procesów miałoby ten sam efekt.
Na przykład w zależności od powłoki
miałby ten sam efekt.
ps
iperl
są uruchamiane w grupie procesowej na pierwszym planie, ale na większości powłok,ps
będzie liderem tej grupy (jak widać naps
wyjściu powyżej gdzie pgid obups
iperl
jest PIDps
), więcperl
można uruchomić własną grupę procesów.Lub może zmienić grupę procesów pierwszego planu. Zasadniczo powiedz urządzeniu tty, aby wysłało SIGINT do innej grupy procesówCtrl+C
perl -MPOSIX -e 'tcsetpgrp (0, getppid) lub die $ !; spać 5 '
Tam,
perl
pozostaje w tej samej grupie procesu lecz mówi się, że urządzenie końcowe grupy procesów planie jest tym, którego identyfikator jest taki sam jak ID procesu nadrzędnego (patrz uwaga powyżej około tego).źródło
hdparm
lubsmartctl
na uszkodzonym dysku twardym, który nie odpowiada, zawiesi się na zawsze i nie możesz ich zabić za pomocą CTRL + C. Możesz stwierdzić, czy proces jest w nieprzerwanym śnie, patrząc na kolumnę statystykps aux
lub na kolumnę S wtop
/htop
-D
oznacza nieprzerwany sen. To niekoniecznie jest zła rzecz, może to po prostu oznaczać, że proces wykonuje dużo IO.