Почему когда-то нужно прекратить процесс убить -9

HEAD отсоединена по адресу c70e611

Это потому, что когда вы выполнили git reset --hard , вы не были ни в одной ветке в то время. У вас была отключенная HEAD , и эта отдельная голова была перемещена с помощью команды git reset --hard вместе с перезаписью вашего рабочего дерева в это состояние.

Если вы хотите, чтобы какая-то ветка foo была c70611 , то:

git checkout foo
git reset --hard c70611

Если это считается хорошим состоянием, чтобы нажать на foo ' s вверх по течению, затем просто git push foo .

Существует более прямой способ принудительно преобразовать foo в c70611 , не проверяя, что это текущая ветвь. А именно, вы можете переписать то, на что указывает foo , используя команду git update-ref .

Прежде чем делать что-либо из вышеперечисленного, я делал паузу и пытался увидеть, как я оказался в отстраненном состоянии, не замечая этого. Возможно, это была незаконченная перебазировка или что-то в этом роде. Шаг первый - просмотреть несколько последних записей в git reflog , чтобы помочь вам пробудить вашу память.

2
07.01.2019, 17:27
1 ответ

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

  • Процесс регистрирует обработчик сигнала для SIGTERM
  • Вы хотите завершить процесс
  • Вы отправляете SIGTERM через kill
  • Вызывается обработчик сигнала, это шанс для процесса
    • Закрыть открытые файлы
    • Записать любые буферы
    • Завершить работу всех дочерних потоков

В отправке SIGTERM нет ничего, что заставило бы процесс выйти. Он может полностью игнорировать это или вести себя так, как хочет.

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

Некоторые процессы будут принимать несколько сигналов SIGTERM перед завершением работы -Вы пробовали это? Процесс также может документировать, какие сигналы вы можете отправить ему, чтобы завершить его корректно.

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

Фактический ответ

Чтобы ответить на ваш вопрос -, в каких случаях убийство игнорируется и настаивают на убийстве с помощью -9:

  • Процесс зарегистрировал обработчик SIGTERM, который специально не уничтожает процесс (примечание -SIGTERM по умолчанию уничтожит процесс)
  • Процесс застрял в состоянии блокировки сигнала -, когда невозможно запустить обработчик SIGTERM
2
27.01.2020, 22:02

Теги

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