Закінчення процесу в Unix замість того, щоб перебивати його


12

У Unixкомандному рядку, якщо я натискаю Ctrl-C, це не закінчує процес, а швидше перериває його, і я повертаюся до рядка оболонки.

Отже, у мене є наступні два питання:

    1. Чи є спосіб я побачити список усіх перерваних процесів і закінчити їх?
    1. Яку комбінацію клавіш натиснути, щоб закінчити процес, а не переривати його?

Відповіді:


20

Ctrl+ Cнадсилає a SIGINT. За замовчуванням ця програма завершує роботу програми.

Ви плутаєте це з тим Ctrl-Z, що призупиняє програму в bash.


7

Історично було три сигнали, пов'язані з натисканням клавіш

  • SIGINT (Переривання) зазвичай Ctrl+ CабоDel
  • SIGQUIT - Вийти - Зазвичай прив’язаний до Ctrl+\
  • SIGSUSP Suspend - зазвичай прив’язаний до Ctrl+Z

Для деяких * nix ароматів є й інші сигнали, також пов'язані, ви можете перевірити прив'язки клавіатури за допомогою команди

stty -a

У моїй системі OS / X це дає наступний вихід

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;

Зверніть увагу, що в цьому випадку убийство не є сигналом KILL, це стосується очищення поточного вхідного буфера.

Ви можете мати більше успіхів у зупинці процесів за допомогою SIGQUIT, але це може бути неправдою, оскільки процес може сприймати сигнал і ігнорувати його.

Не існує концепції переліку "перерваних" процесів, оскільки процес або перехопив, ігнорував, або ігнорував. Ви можете отримати список призупинених процесів, ввівши завдання


Цікаво, що я показую ^ Q і ^ S (як ви), але вони встановили stty -ixonтак, що вони проходять через. Я думаю, що вони зміниться <undef>.
Призупинено до подальшого повідомлення.

Я не знаходжу SIGSUSP на сторінках, що знаходяться у вікні OS X або у вікні Debian Lenny. Здається, це SIGTSTP.
dmckee --- кошеня колишнього модератора

DEL - ах, план 9 ...
new123456

5

Багато правильних відповідей, але жодної, що не є повною.

  1. Як багато інших говорили: Control-C зазвичай надсилає сигнал Unix SIGINT, а поведінка за замовчуванням (від програм, які не перекривають його) - це "процес припинення". Програма може ігнорувати цей сигнал або вживати інших дій, якщо цього забажає.
  2. Ви також можете надіслати SIGQUIT з клавіатури за допомогою Control- \. Різниця тут полягає в тому, що за замовчуванням процес записує основний файл, а потім закриває. Програма може ігнорувати цей сигнал або вживати інших дій, якщо цього забажає.
  3. Для припинення з надзвичайними упередженнями і не дозволяючи процесу зупинити, ви використовуєте SIGKILL, який за замовчуванням не пов'язаний ні з однією клавішею. Замість цього ви зазвичай надсилаєте його за допомогою kill (1)команди та вказуючи сигнал для надсилання як в

    $ kill -9 <process ID>
    

    або мнемонічно

    $ kill -KILL <process ID>
    

    Цей сигнал обробляється безпосередньо ОС, і програма не може змінити поведінку за замовчуванням.

  4. Якщо ваша оболонка підтримує контроль за роботою, вона також може підтримувати вбудовану версію, killяка підтримує ідентифікацію роботи, використовуючи %символ, як у відповіді на подиві .

  5. Щоб призупинити процес відновленим способом, ви використовуєте Control-z, який надсилає SIGTSTP. Ви відновите такий процес, або fgпродовжуючи керувати терміналом або bgвстановити його запуск, не зберігаючи контроль над терміналом (але, за замовчуванням, все одно надсилаєте туди свій вихід).

Також демпінгове ядро ​​на SIGQUIT залежить від багатьох адміністративних деталей. ulimit -c, coreadm (1M) на Solaris тощо. Ще одна примітка - fg посилає сигнал SIGCONT, завдяки чому процес відновить свою роботу.
Тадеуш А. Кадлубовський

1
  1. щоб переглянути список фонових процесів: jobs

    to kill: kill %1(замініть 1 відповідним ідентифікатором завдання як у jobsвихідному)

  2. дивіться тут

1

Ctrl-C посилає SIGINT, який за замовчуванням призводить до закінчення процесу, але може бути захоплений (у \bin sh, використовуючи trap).

SIGKILL - неможливий сигнал вбивства.

Редагувати Третій раз, я вважаю, що це правильно: я перевірив все на документи. Ми побачимо.


SIGKILL не піддається захопленню.

Так. Я вже це зафіксував ...
Чарльз Стюарт

1

Для більшості новачків у терміналі це не зрозуміло, але якщо ваше питання полягає лише в тому, що ви перебуваєте в інтерактивній програмі і не можете зрозуміти, як вийти, досить часто qвиходите. Наприклад, це ключ до виходу less, а також програма, яку ви отримуєте під час перегляду manсторінок.

У деяких програмах є інші комбінації клавіш для виходу. В vimабо viвикористовуйте ESC:wq. В emacs, використовувати Control-C Control-X. В nanoабо picoвикористовуйте Control-X. Зауважте, що в цих прикладах є тонкощі, зокрема, щодо того, чи зберігають ці ярлики будь-які зміни, які ви могли внести у файл, який ви редагуєте.


То який стандарт?
Pacerier

0

У багатьох процесах можна встановити обробник переривання для лову сигналу переривання, але ті, які не припиняють за замовчуванням.

Щоб змусити процес вийти, ви можете надіслати SIGQUIT (Ctrl- \).


SIGQUIT може бути захоплений, SIGKILL не може бути.
Чарльз Стюарт

1
@Charles: ще одна відмінність полягає в тому, що SIGQUIT скидає ядро ​​за замовчуванням, SIGKILL - ні.
Тадеуш А. Кадлубовський

0

Здається, інші відповіді є ймовірним сценарієм, але також можливо, що ви виконуєте сценарій, який не обробляє своїх дітей правильно. Нещодавно я потрапив у подібний сценарій, коли вбивство сценарію не вбивало б дочірніх процесів цього сценарію.

Загалом, якщо ви потрапите в цю ситуацію, вам доведеться переглянути всі запущені процеси. Ви повинні переглянути сторінку для ps. ( man ps) Мені особливо подобається використання ps auxwf, що показує взаємовідносини батько / дитина між процесами. pstreeробить щось подібне. Ви повинні запустити це з іншого терміналу, перш ніж вбивати процес, щоб побачити, як виглядають речі у звичайній ситуації, та визначити дочірні процеси.

Якщо ви потім вбите (з ^ С) цей основний процес, ще раз перевірте вихід PS, щоб побачити, чи щось змінилося. Якщо дочірні процеси все ще існують, ви можете вбити їх за допомогою killкоманди. (див. man kill)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.