Как безопасно прервать установку apt-get?

44

У меня есть apt-get installпроцесс, который, кажется, безнадежно заклинивает на processing triggers for python-supportшаге.

Моя наклонение к killнему, но в прошлом, просто kill-ный в apt-get installпроцессе вызвала у меня много горя. (Различные блокированные файлы IIRC остались позади и т. Д.)

Есть ли более безопасный способ остановить этот процесс?

KJo
источник

Ответы:

44

Процессы убийства

Вообще говоря, для уничтожения процесса нет более безопасного способа уничтожения процесса, чем обычное уничтожение (SIGTERM). В случае, если это интерактивный процесс, он обычно позволяет остановить его еще безопаснее, отправив сигнал SIGINT, обычно отправляемый нажатием Ctrl+ C. Этот сигнал улавливается самим процессом, который может его прослушать - и обычно изящно останавливается. ( спасибо, Элия )

База данных DPKG

Относительно управления пакетами это особый случай. База данных DPKG, которую команды APT используют под водой, всегда может определить, не завершена ли операция. Каждый пакет имеет фактическое состояние, которое помечено так же, как и текущее состояние, например, распаковано, сконфигурировано и т. Д. При закрытии интерфейса APT база данных будет в поврежденном, но в известном состоянии. Файлы блокировки будут освобождены только после того, как они вернутся в чистое состояние - вы должны исправить это, пока он не разрешит новые операции.

Способ исправить это просто запустить процесс, чтобы получить все пакеты в настроенном состоянии. Практически говоря, если вы прервали apt-getоперацию, вы можете просто закончить ее позже, используя

sudo dpkg --configure -a

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

О СИГКИЛЛЕ (9)

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

gertvdijk
источник
2
Когда приложение предлагает способ его завершения, это обычно даже безопаснее, чем SIGTERM. Например, большинство (если не все) текстовые редакторы, текстовые редакторы, графические программы, веб-браузеры и другие текстовые или графические приложения, где пользователь может создавать контент, который не должен быть потерян, не сохраняют его автоматически. прежде чем выйти, когда они получают SIGTERM. Также обратите внимание, что SIGINT иногда может быть безопаснее, чем SIGTERM (но обычно его не следует отправлять, если явно не требуется тот же результат, что и Ctrl + C).
Элия ​​Каган
16

Когда я сталкиваюсь с ошибкой с помощью apt-get, я делаю следующее (как root, т.е. sudoперед всеми командами):

  1. Убейте процесс с именем apt-get:

    killall -9 apt-get
  2. Переконфигурируйте dpkg:

    dpkg --configure -a
  3. Обновите apt-get:

    apt-get update
  4. Обновление пакетов, в том числе неправильно установленных:

    apt-get upgrade

Это я откуда-то узнал, но, к сожалению, точно не помню, где именно.

carnendil
источник
6
Пожалуйста, никогда не отправляйте сигнал 9 (SIGKILL), если у вас нет очень веских причин для этого. Смотрите мой обновленный ответ.
gertvdijk
3
sudo dpkg -r <package name>

В моем случае у меня были проблемы с Java 8 на Ubuntu 12.04, так что ...

sudo dpkg -r oracle-java8-installer
Funmungus
источник
1

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

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

Стив Солс
источник
0

Вот как я это делаю, Ctrl+ CНо учтите, что это безопасно, пока apt-get находится в фазе загрузки или обновления кеша. Кроме этого я не могу придумать более безопасный путь. Просто дайте ему закончить и отмените изменения, удалив или понизив каким-либо образом. Загруженные файлы можно очистить с помощьюsudo apt-get autoclean

Стефано Мтангу
источник