Когда я не должен уничтожать-9 процесс?

Терминал в конце электрического провода, оболочка является домом черепахи, tty является странным сокращением, и консоль является своего рода корпусом.

Ну, этимологически разговор, так или иначе.

В терминологии Unix короткий ответ - это

  • терминал = tty = ввод текста / выходная среда
  • консоль = физический терминал
  • окружите = интерпретатор командной строки

Консоль, терминал и tty тесно связаны. Первоначально, они имели в виду элемент оборудования, через который Вы могли взаимодействовать с компьютером: в первые годы Unix, который означал устройство стиля телепринтера, напоминающее печатающее устройство, иногда названное телетайпом или “tty” в стенографии. Название “терминал” произошло с электронной точки зрения и имени “консоль” с точки зрения мебели. Очень рано в истории Unix, электронные клавиатуры и дисплеи стали нормой для терминалов.

В терминологии Unix tty является конкретным видом файла устройств, который реализует много дополнительных команд (ioctls) вне чтения и записи. В его наиболее распространенном значении терминал синонимичен с tty. Некоторые ttys обеспечиваются ядром от имени устройства, например, с входом, прибывающим из клавиатуры и вывода, идущего в экран текстового режима, или с вводом и выводом, переданным по последовательной линии. Другие ttys, иногда названные pseudo-ttys, обеспечиваются (через тонкий слой ядра) эмуляторами терминала вызываемого абонента программ, такими как Xterm (работающий в X-оконной системе), Экран (который обеспечивает слой изоляции между программой, и другой терминал), Ssh (который подключает терминал на одной машине с программами на другой машине), Ожидайте (для сценариев терминальных взаимодействий) и т.д.

Терминал слова может также иметь более традиционное значение устройства, через которое взаимодействует с компьютером, обычно с клавиатурой и дисплеем. Например, X терминалов являются своего рода тонким клиентом, компьютер специального назначения, чей только цель состоит в том, чтобы управлять клавиатурой, дисплеем, мышью и иногда другими человеческими периферийными устройствами взаимодействия, с реальными приложениями, работающими на другом, более мощном компьютере.

Консоль обычно является терминалом в физическом смысле, который является по некоторому определению основным терминалом, непосредственно подключенным к машине. Консоль появляется к операционной системе как (реализованный ядром) tty. В некоторых системах, таких как Linux и FreeBSD, консоль появляется как несколько ttys (специальный переключатель сочетаний клавиш между этими ttys); только, чтобы перепутать вопросы, имя, данное каждому конкретному tty, может быть “консолью””, виртуальная консоль””, виртуальный терминал” и другие изменения.

См. также, Почему Виртуальный терминал является “виртуальным”, и what/why/where является “реальный” Терминал?.


Оболочка является основным интерфейсом, который видят пользователи, когда они входят в систему, чья основная цель состоит в том, чтобы запустить другие программы. (Я не знаю, является ли исходная метафора то, что оболочка является домашней средой для пользователя, или что оболочка - то, в чем работают другие программы.)

В кругах Unix оболочка специализировалась для значения оболочки командной строки, центрируемой вокруг ввода имени приложения, которое каждый хочет запустить, сопровождаемый названиями файлов или других объектов, что приложение должно действовать на, и нажатие клавиши Enter. Другие типы сред не используют слово “оболочка”; например, оконные системы включают “менеджеры окон” и “настольные среды”, не “оболочку”.

Существует много различных оболочек Unix. Популярные оболочки для интерактивного использования включают Bash (значение по умолчанию на большинстве установок Linux), zsh (который подчеркивает питание, и настраиваемость) и рыба (который подчеркивает простоту).

Оболочки командной строки включают конструкции управления потоком для объединения команд. В дополнение к вводу команд при интерактивной подсказке пользователи могут записать сценарии. Наиболее распространенные оболочки имеют общий синтаксис на основе Bourne_shell. При обсуждении “программирования оболочки”, оболочка почти всегда подразумевается, чтобы быть оболочкой стиля Границы. Некоторые оболочки, которые часто используются для сценариев, но отсутствие усовершенствовало интерактивные функции, включают оболочку Korn (ksh) и много вариантов пепла. В значительной степени любой подобной Unix системе установили оболочку стиля Границы как /bin/sh, обычно пепел, ksh или удар.

В системном администрировании Unix оболочка пользователя является программой, которая вызывается, когда они входят в систему. Учетные записи обычного пользователя имеют оболочку командной строки, но у пользователей с ограниченным доступом могут быть ограниченная оболочка или некоторая другая определенная команда (например, для единственных передачей файлов учетных записей).


Разделение труда между терминалом и оболочкой не абсолютно очевидно. Вот их основные задачи.

  • Вход: терминал преобразовывает ключи в управляющие последовательности (например, Левый\e[D). Оболочка преобразовывает управляющие последовательности в команды (например. \e[Dbackward-char).
  • Редактирование строки, входная история и завершение обеспечиваются оболочкой.
    • Терминал может обеспечить свое собственное редактирование строки, историю и завершение вместо этого, и только отправить строку в оболочку, когда это готово быть выполненным. Единственный общий терминал, который работает таким образом, M-x shell в Emacs.
  • Вывод: оболочка испускает инструкции, такие как “дисплей foo”, “переключатель основной цвет к зеленому”, “перемещают курсор в следующую строку”, и т.д. Терминал действует на эти инструкции.
  • Подсказка является просто понятием оболочки.
  • Оболочка никогда не видит вывода команд, которые это выполняет (если не перенаправлено). Выходная история (scrollback) является просто терминальным понятием.
  • Вставка копии межприложения обеспечивается терминалом (обычно с мышью или сочетаниями клавиш, такими как Ctrl+Shift+V или Shift+Insert). Оболочка может иметь свой собственный внутренний механизм вставки копии также (например, Meta+W и Ctrl+Y).
  • Управление заданиями (запускающий программы в фоновом режиме и управляющий ими) главным образом выполняется оболочкой. Однако это - терминал, который обрабатывает сочетания клавиш как Ctrl+C для уничтожения задания переднего плана и Ctrl+Z для приостановки его.

406
06.08.2018, 06:32
9 ответов

Обычно необходимо использовать kill (короткий для kill -s TERM, или в большинстве систем kill -15) прежде kill -9 (kill -s KILL) для давания цели обрабатывают шанс вымыться после себя. (Процессы не могут поймать или проигнорировать SIGKILL, но они могут и часто ловить SIGTERM.), Если Вы не даете процессу шанс закончить то, что он делает и очищает, он может оставить поврежденные файлы (или другое состояние), вокруг которого он не сможет понять когда-то перезапущенный.

strace/truss, ltrace и gdb обычно хорошие идеи для взгляда на то, почему застревает застрявший процесс. (truss -u на Солярисе особенно полезно; я нахожу ltrace слишком часто аргументы подарков библиотеке звонят в неприменимый формат.) Солярис также имеет полезный /proc- основанные инструменты, некоторые из которых были портированы к Linux. (pstack часто полезно).

367
27.01.2020, 19:28
  • 1
    , который неопровержимый довод - то, что, если Вы привыкаете отправлять SIGKILL, затем когда Вы добираетесь до программы, которая, например, повредит важную базу данных для Вас или Вашей компании, Вы будете действительно сожалеть о нем. kill -9 имеет его использование, как последнее прибежище разделитель, акцент на последнее средство; администраторы, которые используют его перед последним средством a) не понимает быть администратором слишком хорошо и b) не должно быть в производственной системе. игра в песочнице seccomp хрома –  Arcege 09.03.2011, 14:39
  • 2
    @Mikel Другая вещь к через него, иногда лучше обманывать приложение в чистку себя с сигналом как SIGQUIT или SIGSEGV, если это не ответит на SIGINT/SIGTERM. Например, полноэкранное 3-D приложение или даже Xorg. Используя SIGQUIT, это не будет иметь шанса к очистке ничем, но обманыванием его в размышление, что отказ сегментов происходит, и это будет чувствовать, что не имеет никакого выбора, кроме как вымыться и выйти. –  penguin359 03.04.2011, 14:10
  • 3
    @Arcege Вы думаете, что использование базы данных, которая повреждает данные, если уничтожено с-9, является базой данных, которую стоит использовать, в конце концов? iirc, mysql, bdb, pg, и т.д.... все ведут себя хорошо при уничтожении с-9. –  dhruvbird 28.01.2014, 08:52
  • 4
    killall-9 java ftw –  dmourati 28.01.2014, 09:10
  • 5
    @dhruvbird: просто, потому что к Вашему DBS, как предполагается, прилагается бронежилеты, не означает, что необходимо стрелять в них, если Вы не должны. В то время как можно быть правы, что это не столь опасно, как Arcege, кажется, заявляет, я думаю, что его точка все еще стоит, что это опасно и должно быть последним средством. –  iconoclast 30.01.2014, 17:34

Randal Schwartz раньше часто отправлял "Бесполезное использование (x)" в списках. Одно такое сообщение было о kill -9. Это включает причины и рецепт для следования. Вот восстановленная версия (заключена в кавычки ниже).

(Отвращение кавычки)

Нет нет нет. Не используйте уничтожают-9.

Это не дает процессу шанс чисто:

1) закройте сокетные соединения

2) очистите временные файлы

3) сообщите его детям, что это уходит

4) сбросьте его терминальные характеристики

и так далее и так далее и так далее.

Обычно отправьте 15 и ожидайте секунда или два, и если это не работает, отправьте 2, и если это не работает, отправьте 1. Если это не делает, УДАЛЯЕТ ДВОИЧНЫЙ ФАЙЛ, потому что программа плохо себя ведется!

Не используйте уничтожают-9. Не производите комбайн только для уборки цветочного горшка.

Просто другое Бесполезное Использование Usenet,

(.signature)

231
27.01.2020, 19:28
  • 1
    Разве операционная система не закроет открытых дескрипторов файлов (включая сокеты), когда процесс завершится? –  Brian Gordon 28.01.2014, 07:10
  • 2
    Да это будет. Но предположите уничтожение серверного процесса с соединенными клиентами затем клиенты не заметят, что сервера не стало перед тайм-аутами. –  Björn Lindqvist 28.01.2014, 10:48
  • 3
    да старое, "если это всегда несовершенно, Вы глупы использовать его" аргумент. –  Timmmm 28.01.2014, 21:17
  • 4
    Или глупый использовать, если, если рассматриваемый процесс является производством –  Warren P 29.01.2014, 05:24
  • 5
    Если процесс будет уничтожен затем, то сокет отправит RST одноранговому узлу, где, как будто процесс звонит близко или завершение работы на сокете, то сокет отправляет FIN. Нет никакого необходимого тайм-аута. Ситуация с тайм-аутом только произойдет, если питание будет отброшено, или сетевой кабель удален. –  ctrl-alt-delor 01.06.2016, 01:41

Никогда никогда не делайте a kill -9 1. Также постарайтесь не делать, уничтожение на определенных процессах любят, монтируются'. Когда я должен уничтожить много процессов (скажите, например, что X сессий подвешиваются, и я должен уничтожить все процессы определенного пользователя), я инвертирую порядок процессов. Например:

ps -ef|remove all processes not matching a certain criteria| awk '{print $2}'|ruby -e '$A=stdin.readlines; A.reverse.each{|a| puts "kill -9 #{a}"}'|bash

Следует иметь в виду это kill не останавливает процесс и высвобождает его средства. Все, что это делает, отправляют сигнал SIGKILL в процесс; Вы могли волновать с процессом, это подвешивается.

6
27.01.2020, 19:28
  • 1
    downvote был кем-то еще. Но какие средства не высвобождены? Вы просто подразумеваете, что процесс не может выполнить свою нормальную очистку? Что относительно блокировок файла, семафоров, и т.д.? Можно ли уточнить? –  Mikel 09.03.2011, 13:39
  • 2
    Похож на общую память SysV, и семафоры должны будут быть очищены, по крайней мере. archives.postgresql.org/pgsql-general/2006-10/msg01065.php –  Mikel 09.03.2011, 22:36
  • 3
    Этот ответ является сбивающей с толку частью и частью неправильно. kill -9 1 просто проигнорирован под большинством нельдов. Нет никакой потребности избежать kill -9 для mount, но никакой смысл в нем также. Я не знаю то, что Вы подразумеваете “под реверсом порядок процессов”. kill -9 действительно останавливает (как в, уничтожает), процесс, не давая ему шанс жаловаться, однако уничтожения сразу не произойдет, если процесс будет в непрерываемом системном вызове. Уничтожение процесса с kill -9 высвобождает большинство средств, но не все. –  Gilles 'SO- stop being evil' 09.03.2011, 23:01

Должно всегда быть нормально делать kill -9, точно так же, как должно всегда быть нормально завершать работу путем получения по запросу силового кабеля. Это может быть антиобщественным, и оставить некоторое восстановление, чтобы сделать, но это должно работать и является электроинструментом для нетерпеливого.

Я говорю это как кто-то, кто попробует простое уничтожение (15) первый, потому что оно действительно дает программе шанс сделать некоторую очистку - возможно, просто пишущий в журнал, "выходящий на сигнале 15". Но я не приму жалобы на неблаговидные поступки на уничтожении-9.

Причина: много клиентов делает это к вещам, которые предпочли бы программисты, затем не делают. Случайное уничтожение-9 тестирований являются хорошим и справедливым сценарием тестирования, и если Ваша система не обрабатывает его, Ваша система, повреждается.

78
27.01.2020, 19:28
  • 1
    Как Вы тестируете на "случайное уничтожение-9"? Когда Вы добираетесь, уничтожают-9, Вы сделаны и закончены. –  Karel Bílek 28.01.2014, 09:28
  • 2
    @Karel: Вы тестируете, может ли Ваша система восстановиться впоследствии, и очищать какие-либо искаженные транзакции, которые обрабатывались во время SIGKILL. –  Tadeusz A. Kadłubowski 28.01.2014, 10:09
  • 3
    Не нормально делать a kill -9 точно так же, как не нормально отключать прочь. В то время как, конечно, существуют ситуации, где у Вас нет выбора, это должно быть действием последнего средства. Конечно, вытягивая силовой кабель или kill -9 не должен иметь отрицательных эффектов как предотвращение приложения или ОС для перезапуска правильно, если вообще, но дерьмо происходит и использование рекомендуемых путей (kill [-15]) или регулярное завершение работы поможет предотвращению путаницы, которая могла бы произойти, если Вы обычно прерываете программы и Ose тот путь. В любом случае всегда существует риск потерять данные независимо от устойчивости кода. –  jlliagre 28.01.2014, 14:51
  • 4
    я подозреваю то, что Michael подразумевал под 'OK', - то, что Ваша программа должна справиться с этой ситуацией корректно и смочь сделать некоторую форму очистки на перезапуске. Например, очищая файлы PID и т.д, вместо того, чтобы просто бросить его игрушки из детской коляски и отказаться запускаться. –  gerryk 29.01.2014, 00:58
  • 5
    @gerryk, Они должны действительно, но проблемой являются некоторые люди, возьмет тот ответ в качестве "лицензии для уничтожения-9" безотносительно ситуации и среды. Это - безответственное отношение. –  jlliagre 29.01.2014, 09:24

Я использую, уничтожают-9 почти таким же способом, которым я бросаю кухонные реализации в посудомоечную машину: если кухонная реализация разрушена посудомоечной машиной затем, я не хочу ее.

То же идет для большинства программ (даже базы данных): если я не могу уничтожить их без вещей, выходящих из строя, я действительно не хочу использовать их. (И если Вы, оказывается, используете одну из этих небаз данных, которая поощряет Вас притворяться, что они сохранили данные, когда они не имеют: хорошо, я предполагаю, что время, что Вы начинаете думать о том, что Вы делаете).

Поскольку в реальном мире материал может понизиться в любое время по любой причине.

Люди должны записать программное обеспечение, которое терпимо к катастрофическим отказам. В особенности на серверах. Необходимо изучить, как разработать программное обеспечение, которое предполагает, что вещи повредятся, откажут и т.д.

То же идет для программного обеспечения, установленного на компьютере. Когда я хочу закрыть свой браузер, он обычно берет ВОЗРАСТЫ для закрытий. Нет ничего, что мой браузер должен сделать, который должен взять больше, чем самое большее несколько секунд. Когда я прошу, чтобы это закрылось, этому должно удаться сделать это сразу. Когда это не делает, ну, в общем, затем, мы выходим из дела, уничтожают-9 и делают его.

39
27.01.2020, 19:28
  • 1
    я соглашаюсь, что процесс должен быть записан, чтобы быть терпимым к такому отказу, но я думаю, что это - все еще плохая практика, чтобы сделать это. База данных восстановится, но она могла бы обнаружить грубое аварийное прекращение работы и затем инициировать значительное восстановление, проверяющее при перезапуске. И что относительно запросов служит процесс? Они будут все разъединены немедленно, у клиентов могли бы быть ошибки и сбой также? –  Daniel James Bryars 24.05.2014, 12:40
  • 2
    база данных, которая не может быть уничтожена никогда, не является правильно надежной базой данных. Это - довольно основное требование при требовании непротиворечивости. Что касается клиентов: если они идут непрочные и поврежденные данные, когда соединение разъединено, они плохо разработаны также. Способ обратиться к прерыванию обслуживания через дублирование и автоматические стратегии обработки отказа/повторной попытки. Обычно для большей части системы, переставшей работать быстро, предпочтительно для попытки восстановиться. –  borud 19.09.2014, 19:36
  • 3
    @borud Это не может быть отлично записанное программное обеспечение, но это - использование людей программного обеспечения все время. У каких системных администраторов есть роскошь всегда способности выбрать программное обеспечение, которое это отлично записано, вниз к всегда восстановлению корректно с внезапного разрушения? Не многие. Лично я использую сценарии завершения работы и запускаю/останавливаю процессы через это. Если они не отвечают на сценарий завершения работы (который делает надлежащую передачу сигналов процессу), я уничтожаю-9. –  Steve Sether 29.12.2014, 22:59
  • 4
    Нет никакого различия между приготовлением основного материала и более сложными тарелками относительно инструментов. Различием является повар. (Однако при пребывании в течение такого же количества времени, готовя, как я делаю, Вы действительно понимаете, что устойчивость является минимальным требованием в кухонных инструментах и что большинство людей, которые продают кухонные предоставления потребителям, не знало бы плохой инструмент от большого инструмента.) –  borud 19.07.2017, 22:25

Не упомянутый во всех других ответах случай где kill -9 не работает вообще, когда процесс <defunct> и не может быть уничтожен:

Как я могу уничтожить <более не существующий> процесс, родитель которого является init?

Что является более не существующим для процесса и почему это не становится уничтоженным?

Таким образом, прежде чем Вы пытаетесь kill -9 a <defunct> процесс выполняется ps -ef видеть то, что его родитель и попытка -15(ТЕРМИН) или -2(INT) и наконец -9(УНИЧТОЖЬТЕ) на его родителе.

Примечание: что ps -ef делает.

Более позднее редактирование и осторожность: Соблюдите осторожность при уничтожении процессов, их родитель или их дети, потому что они могут оставить файлы открытыми или поврежденными, соединения незаконченный, могут повредить базы данных и т.д., если Вы не знаете что kill -9 делает для процесса, используют его только как последнее прибежище, и если необходимо работать, уничтожают, используют сигналы, указанные выше перед использованием -9 (KILL)

10
27.01.2020, 19:28
[1179489] Убийство процессов волей-неволей не является плавным ходом: данные могут быть потеряны, плохо разработанные приложения могут сломаться тонкими способами, которые не могут быть исправлены без переустановки... но это полностью зависит от знания того, что является, а что - небезопасным в данной ситуации. и что будет под угрозой. Пользователь должен иметь некоторое представление о том, что делает или должен делать процесс и каковы его ограничения (дисковая IOPS, rss/swap), а также уметь оценить, сколько времени должен занять длительный процесс (скажем, копия файла, перекодировка mp3, миграция по электронной почте, резервное копирование, [ваша любимая временная ссылка здесь]). Более того, отправка [1179931] SIGKILL [1179932] на pid не является гарантией его уничтожения. Если он застрял в системном звонке или уже зомбирован ([1179933]Z[1179934] в [1179935]ps[1179936]), он может продолжать быть зомбирован. Часто бывает так, что ^Z - это длительный процесс и забываешь о [1179937]bg[1179938] перед попыткой [1179939] убить -9[1179940] его. Простой [1179941]fg[1179942] переподключит stdin/stdout и, вероятно, разблокирует процесс, обычно после чего процесс завершается. Если он застрял в другом месте или в какой-то другой форме дедлока ядра, то только перезагрузка сможет удалить процесс. (Зомби-процессы уже мертвы после обработки ядром [1179943]SIGKILL[1179944] (далее код пользовательского интерфейса запускаться не будет), обычно причина, по которой ядро не завершает процесс, похожа на "блокировку" при системном вызове. )enter image description here

Также, если вы хотите убить процесс и всех его дочерних процессов, войдите в привычку вызывать [1179945] kill[1179946] с отрицательным PID [1179947], а не только с самим PID[1179948]. Нет никакой гарантии, что [1179949]SIGHUP[1179950], [1179951]SIGPIPE[1179952] или [1179953]SIGINT[1179954] или другие сигналы очистят после этого, и иметь кучу отключенных процессов для очистки (помните дворнягу?) раздражает.

  • Bonus evil: [1180544]kill -9 -1[1180545] причиняет немного больше вреда, чем [1180546]kill -9 1[1180547] (Не делайте ни то, ни другое в качестве корня, если не хотите посмотреть, что происходит на бросовой, неважной ВМ)

5
27.01.2020, 19:28

Я создал скрипт, который помогает автоматизировать этот вопрос.

Он основан на моем полном ответе 2 на очень похожий вопрос на stackoverflow.

Вы можете прочитать все объяснения там. Подводя итог, я бы рекомендовал просто SIGTERM и SIGKILL, или даже SIGTERM, SIGINT и SIGKILL. Однако я даю больше вариантов в полном ответе.

Пожалуйста, не стесняйтесь скачать (клонировать) его с github репозитория killgracefully 1

4
20.08.2021, 13:37

Теги

Похожие вопросы