Почему мы всегда используем kill -9

El problema con su código es doble:

  1. El comando grep, de forma predeterminada, espera un patrón de expresión regular, no una cadena, y su cadena contiene caracteres especiales para las expresiones regulares([y]). Tiene el mismo problema en su sustitución sed.

  2. Los nombres de archivo emitidos porgrep -lpueden ser alterados. Si un archivo contiene un carácter no imprimible (como una nueva línea ), grepsimplemente lo eliminará del nombre de salida. Esto significa que sedno se invocará en ese archivo.


Esto supone que desea reemplazar la cadena dentro del contenido del archivo, no en los nombres de archivo:

Para encontrar todos los archivos debajo del directorio /mnt/d/power/jan/outputque contiene la cadena exacta Aux Power [A], usaría

find /mnt/d/power/jan/output -type f \
    -exec grep -Fq 'Aux Power [A]' {} ';' -print

Para cambiar la cadena a aux_power, extendería ese comando así:

find /mnt/d/power/jan/output -type f \
    -exec grep -Fq 'Aux Power [A]' {} ';' \
    -exec sed -i 's/Aux Power \[A\]/aux_power/g' {} ';'

Esto supone GNU sed.

El grep -Fqno producirá ningún resultado pero devolverá un estado de salida cero para cualquier archivo que contenga la cadena especificada (no una expresión regular ya que -Fse usa ).

El comando sedhace en -edición de lugar (al modo GNU ), cambiando todas las apariciones de la cadena (aquí especificada como una expresión regular, razón por la cual los corchetes se escapan ).

Si desea obtener los nombres de los archivos modificados enumerados en la terminal, deje -printdesde el primer comando find, después de -exec grep... {} ';'.


Dado que la expresión sedque estamos usando aquí no cambiará el contenido de un archivo que no contiene la cadena particular que desea cambiar, puede acortar el comando a

find /mnt/d/power/jan/output -type f \
    -exec sed -i 's/Aux Power \[A\]/aux_power/g' {} ';'

Esto aplica la sustitución a todos los archivos bajo el directorio /mnt/d/power/jan/output. Cualquier archivo que no contenga la cadena permanecerá sin cambios (pero su marca de tiempo aún se actualizará ).

-3
06.04.2019, 11:14
4 ответа

Изначально команда kill/системный вызов просто уничтожали процесс. Это было сделано ядром, и процесс просто исчез, так и не уведомившись об этом. Думаю, это остановилось на третьем издании. kill -9 указывает на отправку сигнала номер 9 процессу. В отличие от большинства (всех? он зависит )от других сигналов, процесс не может его «поймать» и каким-либо образом обработать. Более удобный способ остановить процесс — kill -15 (или kill -TERM ), который сообщает процессу, что он завершается, но дает ему возможность выполнить очистку.

Использование команды kill -9 является "гарантированным" способом уничтожения процесса; если он застрял, kill -15 может не всегда работать. Следовательно, многие люди до сих пор используют kill -9 в качестве «первого средства».

Причина, по которой «окончательный» сигнал уничтожения — номер 9, заключается в том, как они это сделали. В то время было по крайней мере еще восемь различных сигналов, и я предполагаю, что номера были присвоены человеком, который запрограммировал эту часть ядра (, вероятно, Кеном Томпсоном ). Некоторые из более низких чисел в настоящее время в значительной степени устарели, поскольку они отображаются на аппаратные инструкции и/или события в оборудовании PDP -11. А также много других выше 9.

Обратите внимание, что реальные числа не имеют уровней или иерархии; сигнал 8 ни в коем случае не является «меньше» сигнала 9 или «больше» сигнала 7.

11
28.01.2020, 05:18

На самом деле мне очень нравится ответ Боба.

Я использую следующие сигналы::

  • -1(-HUP)-перезапустить процесс
  • -2(-INT)-завершить процесс
  • -9(-KILL)-позволить ядру завершить процесс
  • -11(-SEGV)-Произошел сбой программы
  • -15(-TERM)-по умолчанию, попросите программу завершить работу.

Будет отправлено убийство без сигнала-15(-TERM).

Все вышеуказанные имена сигналов могут быть указаны с префиксом SIG(, например. -SIGKILL), это, однако, не является обязательным.

Обратите внимание, kill -11заставит программу завершить работу с ошибкой сегментации, я использую ее иногда, когда kill -9не завершает процесс. (Вы можете потерять данные, если вы выполните kill -9или kill -11для процесса, так что будьте осторожны!)

Вы используете ps -ef | grep <program>для проверки процесса. Чтобы избавиться от процесса (, который имеет родительский PID 1 ), вы должны kill -HUP 1илиkill -1 1(как root ). Обратите внимание, что PID 1 — это ваша система инициализации .

Итак, чтобы завершить процесс, введитеkill <pid>(то же самое, что и kill -15 <pid>), если это не удастся, я попробую эти другие (, вы можете потерять данные! ),kill -2 <pid>(похоже на выполнение Ctrl+c), если это не удается kill -9 <pid>, если это не удается kill -11 <pid>, если это не удается, процесс, скорее всего, является зомби-процессом,убедитесь, что это так, используя ps -ef | grep <program_name>или ps -ef | grep <pid>, после процесса должно быть указано «несуществующий». Это когда вы выдаете kill -1 1.

Некоторые программы, такие как Java JVM, могут быть настроены на создание дампа потоков/кучи (для устранения неполадок )при получении сигнала, в этих случаях я также использую kill...

15
28.01.2020, 05:18

Ну... стиль программирования у всех разный, я полагаю. Лично я стараюсь избегать отправки kill -9, если могу, потому что это имеет тенденцию создавать зомби-процессы, поскольку не позволяет процессу, который он убивает, выполнять любые действия по очистке, которые может существовать или не существовать в программе, которую пользователь хочет убить.

Это сигнал «последнего средства», поэтому, хотя это редко предпочтительный способ завершения программы, он широко используется, (особенно в плохо написанных программах, )потому что он «всегда работает", так сказать...

Если процесс игнорирует SIGINTили SIGTERM, тогда должно быть причиной этого --возможно, процесс должен освободить файл блокировки, удалить какой-то временный файл (] s )и/или выполнить некоторые другие действия по «очистке» перед завершением. Конечно, программы ведут себя неправильно, и поэтому нам нужно SIGKILLдля этих (надеюсь, редких )сценариев.

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

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

Signal 9 From Outer Space

There is one signal that you cannot trap: SIGKILL or signal 9. The kernel immediately terminates any process sent this signal and no signal handling is performed. Since it will always terminate a program that is stuck, hung, or otherwise screwed up, it is tempting to think that it's the easy way out when you have to get something to stop and go away. Often you will see references to the following command which sends the SIGKILL signal: kill -9

However, despite its apparent ease, you must remember that when you send this signal, no processing is done by the application. Often this is OK, but with many programs it's not. In particular, many complex programs (and some not-so-complex) create lock files to prevent multiple copies of the program from running at the same time. When a program that uses a lock file is sent a SIGKILL, it doesn't get the chance to remove the lock file when it terminates. The presence of the lock file will prevent the program from restarting until the lock file is manually removed.

Be warned. Use SIGKILL as a last resort.

Источник

5
28.01.2020, 05:18

Мне нравится эта ветка, так как она напоминает о тех днях, когда я помогал отцу на -сайте (в начале 80-х ), работая над старыми системами Burroughs/Unisys… присутствует там, где убивает немного эволюционировал (по разным причинам ).

Во-первых, спасибо @thecarpy и Бобу за их ответы.

Во-вторых, kill может принимать разные значения в зависимости от реализации Unix/Unix -, такой как система (или оболочка ). Первоначально kill был прямым системным вызовом ядра на основе модуля -/монолитного -, чтобы пользователь мог удалить активный процесс из памяти. Дело в том, что эта команда была средством для пользователей пространства ядра (ring0 ), ring3 (пространства пользователя )или пользователей более высокого -уровня для уничтожения жадных/запущенных -процессов, препятствующих их поглощению. ресурсов на старых, основных/средних -фреймовых системах.

В-третьих, вся цель kill состоит в том, чтобы гарантировать, что PID имеет дескриптор для отправки SIGKILL --на каждый процесс/на терминал/на уровень выполнения -.

В Unix -подобных системах kill -9 используется слишком часто, ИМХО, поскольку было заявлено, что это может привести к зомбированию процессов. Это связано с отношениями PID родительского -> дочернего процесса, основанными на разветвлении, подкладке канала -и других причинах, по которым начальный PID/процесс порождает дочерние элементы и т. д.

Команда весьма полезна, так как опасна,но, зная параметры (, как упомянуто выше ), и рассматриваемый PID (от сценария оболочки до основного процесса БД ), следует сначала изучить:

пс -aef | grep -я

Однажды идентифицированный, kill -15 был тем, что я использовал для предотвращения зомби и запуска -процессов, например, в первые дни MySQL, для сохранения системных ресурсов, однако знание правильного SIGnal для отправки процесса тоже важно:https://en.wikipedia.org/wiki/Kill_(команда)

В случае сомнений попробуйте использовать команду pkill для именованных -процессов, таких как mariadb/httpd или kill -15, чтобы немедленно уничтожить процесс.

1
28.01.2020, 05:18

Теги

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