Kończenie procesu w Uniksie zamiast przerywania go

12

Jeśli w Unixwierszu poleceń naciśniemy Ctrl-C, nie kończy to procesu, ale raczej go przerywa i wracam do wiersza poleceń powłoki.

Mam więc następujące dwa pytania:

    1. Czy istnieje sposób, aby zobaczyć listę wszystkich przerwanych procesów i zakończyć je?
    1. Jaką kombinację klawiszy nacisnąć, aby zakończyć proces zamiast go przerywać?
Nicolás Alarcón Rapela
źródło

Odpowiedzi:

20

Ctrl+ Cwysyła a SIGINT. Domyślnie powoduje to zamknięcie aplikacji.

Mylisz to z Ctrl-Z, co powoduje zawieszenie aplikacji w bash.

Ignacio Vazquez-Abrams
źródło
7

Historycznie istniały trzy sygnały związane z naciśnięciami klawiszy

  • SIGINT (Przerwanie) zwykle Ctrl+ ClubDel
  • SIGQUIT - Wyjdź - Zwykle związany z Ctrl+\
  • SIGSUSP Suspend - Zwykle związany z Ctrl+Z

W niektórych smakach * nix są również powiązane inne sygnały, możesz sprawdzić powiązania klawiatury za pomocą polecenia

stty -a

W moim systemie OS / X generuje to następujące dane wyjściowe

speed 9600 baud; 65 rows; 213 columns;
lflags: icanon isig iexten echo echoe -echok echoke -echonl echoctl
    -echoprt -altwerase -noflsh -tostop -flusho pendin -nokerninfo
    -extproc
iflags: -istrip icrnl -inlcr -igncr ixon -ixoff ixany imaxbel iutf8
    -ignbrk brkint -inpck -ignpar -parmrk
oflags: opost onlcr -oxtabs -onocr -onlret
cflags: cread cs8 -parenb -parodd hupcl -clocal -cstopb -crtscts -dsrflow
    -dtrflow -mdmbuf
cchars: discard = ^O; dsusp = ^Y; eof = ^D; eol = <undef>;
    eol2 = <undef>; erase = ^?; intr = ^C; kill = ^U; lnext = ^V;
    min = 1; quit = ^\; reprint = ^R; start = ^Q; status = ^T;
    stop = ^S; susp = ^Z; time = 0; werase = ^W;

Uwaga: zabójstwo w tym przypadku nie jest sygnałem KILL, który ma związek z czyszczeniem bieżącego bufora wejściowego.

Możesz mieć większy sukces w zatrzymywaniu procesów za pomocą SIGQUIT, ale może nie być to prawdą, ponieważ proces może przechwycić sygnał i zignorować go.

Nie ma koncepcji listy „przerwanych” procesów, ponieważ proces albo wychwycił i zignorował przerwanie, albo zakończył działanie. Możesz uzyskać listę zawieszonych procesów, wpisując zadania

Steve Weet
źródło
Interesujące jest to, że mam ^ Q i ^ S pokazujące (jak ty), ale ustawiłem stty -ixontak, aby były przekazywane. Myślałbym, że zmieniliby się na <undef>.
Wstrzymano do odwołania.
Nie znajduję SIGSUSP na stronach podręcznika mojego systemu OS X lub mojego urządzenia Debian Lenny. Wygląda na to, że to SIGTSTP.
dmckee --- były moderator kociąt
DEL - ach, plan 9 ...
nowy123456
5

Wiele poprawnych odpowiedzi, ale nie są kompletne.

  1. Jak wielu innych powiedziało: Control-C zazwyczaj wysyła sygnał uniksowy SIGINT, a domyślnym zachowaniem (z programów, które go nie zastępują) jest „zakończ proces”. Program może zignorować ten sygnał lub podjąć inne działanie, jeśli sobie tego życzy.
  2. Możesz również wysłać SIGQUIT z klawiatury za pomocą Control- \. Różnica polega na tym, że domyślnie proces zapisuje plik podstawowy, a następnie kończy pracę. Program może zignorować ten sygnał lub podjąć inne działanie, jeśli sobie tego życzy.
  3. Aby zakończyć działanie z najwyższymi uprzedzeniami i bez pozwalania na zatrzymanie procesu, użyj SIGKILL, który domyślnie nie jest powiązany z żadnym kluczem. Zamiast tego generalnie wysyłasz go za pomocą kill (1)polecenia i podając sygnał do wysłania jak za

    $ kill -9 <process ID>
    

    lub mnemonicznie

    $ kill -KILL <process ID>
    

    Ten sygnał jest obsługiwany bezpośrednio przez system operacyjny i program nie może zastąpić domyślnego zachowania.

  4. Jeśli twoja powłoka obsługuje kontrolę zadań, może również obsługiwać wbudowaną wersję, killktóra obsługuje identyfikację zadań za pomocą %znaku jak w odpowiedzi na wybiegu .

  5. Aby wstrzymać proces w sposób umożliwiający wznowienie, należy użyć Control-z, który wysyła SIGTSTP. Wznawiasz taki proces, fgaby albo kontynuować kontrolę nad terminalem, albo bgustawić go na działanie bez utrzymywania kontroli nad terminalem (ale domyślnie nadal wysyła tam swoje dane wyjściowe).
dmckee --- były kot moderator
źródło
Zrzut dumpingu w SIGQUIT zależy również od wielu szczegółów administracyjnych. ulimit -c, coreadm (1M) w systemie Solaris itp. Kolejna uwaga - fg wysyła sygnał SIGCONT, który powoduje, że proces wznawia działanie.
Tadeusz A. Kadłubowski
1
  1. aby zobaczyć listę procesów w tle: jobs

    to kill: kill %1(zastąp 1 odpowiednim identyfikatorem zadania jak na jobswyjściu)

  2. patrz tutaj
Społeczność
źródło
1

Ctrl-C wysyła SIGINT, który domyślnie powoduje zakończenie procesu, ale może zostać uwięziony (w \bin sh, za pomocą trap).

SIGKILL to niezniszczalny sygnał zabicia.

Edytuj Po raz trzeci myślę, że to prawda: sprawdziłem wszystko pod kątem dokumentów. Zobaczymy.

Charles Stewart
źródło
SIGKILL nie nadaje się do pułapkowania.
Tak. Naprawiłem to już ...
Charles Stewart
1

Dla większości początkujących nie jest to jasne, ale jeśli Twoim problemem jest to, że jesteś w programie interaktywnym i nie możesz dowiedzieć się, jak się wydostać, dość często qwychodzi. Na przykład jest to klucz do wyjścia less, który jest także programem, który otrzymujesz manmiędzy innymi podczas przeglądania stron.

Niektóre programy mają inne skróty klawiaturowe do wyjścia. W vimlub viużyj ESC:wq. W emacs, użyj Control-C Control-X. W nanolub picoużyj Control-X. Zauważ, że w tych przykładach są subtelności, w szczególności dotyczące tego, czy te skróty zapisują wszelkie zmiany, które możesz wprowadzić w edytowanym pliku.

asmeurer
źródło
Więc jaki jest standard?
Pacerier
0

Wiele procesów może zainstalować moduł obsługi przerwań w celu przechwycenia sygnału przerwania, ale te, które domyślnie się nie przerywają.

Aby wymusić zakończenie procesu, możesz wysłać SIGQUIT (Ctrl- \).

njd
źródło
SIGQUIT może zostać uwięziony, SIGKILL nie może.
Charles Stewart
1
@Charles: inną różnicą jest to, że SIGQUIT domyślnie zrzuca rdzeń, SIGKILL nie.
Tadeusz A. Kadłubowski
0

Wygląda na to, że inne odpowiedzi są prawdopodobnym scenariuszem, ale możliwe jest również, że wykonujesz skrypt, który nie obsługuje poprawnie swoich dzieci. Niedawno natrafiłem na podobny scenariusz, w którym zabicie skryptu nie zabiłoby procesów potomnych tego skryptu.

Ogólnie rzecz biorąc, jeśli znajdziesz się w tej sytuacji, będziesz musiał przejrzeć wszystkie uruchomione procesy. Powinieneś przejrzeć manpage dla ps. ( man ps) Szczególnie podoba mi się używanie ps auxwf, które pokazuje relacje rodzic / dziecko między procesami. pstreerobi coś podobnego. Powinieneś uruchomić to z innego terminala przed zabiciem procesu, aby zobaczyć, jak wygląda sytuacja w normalnej sytuacji i zidentyfikować procesy potomne.

Jeśli następnie zabijesz (za pomocą ^ C) ten główny proces, sprawdź ponownie wyjście ps, aby zobaczyć, czy coś się zmieniło. Jeśli procesy potomne nadal istnieją, możesz je zabić za pomocą killpolecenia. (patrz man kill)

DRZEWO
źródło