Как исправить зависание апгрейда с saucy->trusty: "Удаление ___ из Mono"

При недавнем обновлении с Ubuntu 13.10 (дерзкий) до 14.04.1 LTS (верный) процесс продолжал зависать несколько раз prerm а также postrm скрипты для удаления моно пакетов. Признак проблемы - сообщения как следующие в dpkg выход (/var/log/dist-upgrade/apt-term.log при использовании ubuntu-release-upgrader):

$ egrep -B1 'Removing.+ from Mono' /var/log/dist-upgrade/apt-term.log

Preparing to unpack .../libdbus1.0-cil_0.7.0-5ubuntu1_all.deb ...
Removing libdbus1.0-cil from Mono
--
Preparing to unpack .../libdbus-glib1.0-cil_0.5.0-4ubuntu1_all.deb ...
Removing libdbus-glib1.0-cil from Mono
--
Preparing to unpack .../libgdata2.1-cil_2.2.0.0-2_all.deb ...
Removing libgdata2.1-cil from Mono
--
Preparing to unpack .../libmono-addins0.2-cil_1.0+git20130406.adcd75b-3_all.deb ...
Removing libmono-addins0.2-cil from Mono
--
Preparing to unpack .../libnotify0.4-cil_0.4.0~r3032-7_all.deb ...
Removing libnotify0.4-cil from Mono
--
Preparing to unpack .../libtaglib2.1-cil_2.1.0.0-3_all.deb ...
Removing libtaglib2.1-cil from Mono
--
Preparing to unpack .../libmono-addins-gui0.2-cil_1.0+git20130406.adcd75b-3_all.deb ...
Removing libmono-addins-gui0.2-cil from Mono

2 ответа

Решение

Предыдущий ответ имеет опечатку, где он сказал, чтобы бежать
sudo sed -i -e 's/trusty/saucy/g; s/14.04.1/13.10/g; s/LTS//;'
но не сказал, к какому файлу применить это редактирование.

Я предполагаю, что они имели в виду /etc/lsb-release и редактирование этого файла (а также /etc/apt/sources.list, как показано) работало для меня.

PS На сайте сказано, что мне не хватает кармы или чего-то еще, чтобы опубликовать "комментарий", так что публикация этого "Ответа" (на самом деле комментарий) была единственным выбором...

Кроме того, вот сценарий, который автоматизирует повторяющуюся процедуру ps/run-hand-hand/kill, описанную в предыдущем ответе (запускайте сценарий столько раз, сколько необходимо для преодоления зависаний)

#!/bin/sh
set -e -u
unset GREP_OPTIONS GREP_COLOR GREP_COLORS
line=$(ps xa -o pid,cmd | grep 'postrm\|prerm' | grep -v grep)
[ -n "$line" ] || { echo "No postrm/prerm cmd is running now." >&2; exit 1; }
pid=$( echo "$line" | sed -ne 's/^ *\([0-9][0-9]*\) .*/\1/p' )
cmd=$( echo "$line" | sed -ne 's/^ *[0-9][0-9]* *//p' )
eval "sudo $cmd"
echo -n "Kill pid $pid ? "
read reply
case "$reply" in
 [yY]*) (set -x; sudo kill $pid)
        && sleep 1 \
        && sudo kill $pid >/dev/null \
        && (set -x; sudo kill -9 $pid)
        ;;
esac

Процесс завис на prerm а также postrm скрипты для следующих пакетов:

Preparing to unpack .../libdbus1.0-cil_0.7.0-5ubuntu1_all.deb ...
Removing libdbus1.0-cil from Mono
--
Preparing to unpack .../libdbus-glib1.0-cil_0.5.0-4ubuntu1_all.deb ...
Removing libdbus-glib1.0-cil from Mono
--
Preparing to unpack .../libgdata2.1-cil_2.2.0.0-2_all.deb ...
Removing libgdata2.1-cil from Mono
--
Preparing to unpack .../libmono-addins0.2-cil_1.0+git20130406.adcd75b-3_all.deb ...
Removing libmono-addins0.2-cil from Mono
--
Preparing to unpack .../libnotify0.4-cil_0.4.0~r3032-7_all.deb ...
Removing libnotify0.4-cil from Mono
--
Preparing to unpack .../libtaglib2.1-cil_2.1.0.0-3_all.deb ...
Removing libtaglib2.1-cil from Mono
--
Preparing to unpack .../libmono-addins-gui0.2-cil_1.0+git20130406.adcd75b-3_all.deb ...
Removing libmono-addins-gui0.2-cil from Mono
--
Preparing to unpack .../libappindicator0.1-cil_12.10.1+13.10.20130920-0ubuntu4_all.deb ...
Removing libappindicator0.1-cil from Mono
--
Preparing to unpack .../libgmime2.6-cil_2.6.20-0ubuntu1_all.deb ...
Removing libgmime2.6-cil from Mono
--
Setting up mono-gac (3.2.8+dfsg-4ubuntu1) ...
* Installing 3 assemblies from libappindicator0.1-cil into Mono

Для принудительного удаления пакетов я определил prerm а также postrm скрипты, которые зависали, запускали их вручную, а затем убивали зависший процесс. Мне приходилось делать это несколько раз во время обновления релиза:

Чинить

  1. Найди повешенного prerm или же postrm Сценарий и запустить его вручную:

    eval "sudo $(ps xa -o cmd | grep 'postrm\|prerm' | grep -v grep)"

    Вы должны увидеть вывод, похожий на: Removing libmono-addins-gui0.2-cil from Mono за какой пакет висит.
  2. Убей повешенных prerm или же postrm сценарий:

    ps -ef | grep 'prerm\|postrm' | grep -v grep | awk '{ print $2 }' | xargs sudo kill -9
  3. Повторите для следующего зависшего пакета с сообщением: Removing ___ from Mono

Если вы обнаружили ошибки:

Во время моего обновления я столкнулся с postinst ошибка сценария для одного из моно пакетов (mono-gac... скорее mono-gack!!). Я следовал своей первоначальной процедуре выше, за исключением того, что postinst скрипт. Однако, это вызвало у меня проблему, которая убила мое обновление и оставила утилиту обновления в неисправном состоянии.

Ошибки из моего журнала обновлений были (отредактированы для краткости... см. Полный журнал здесь):

Errors were encountered while processing:
 mono-gac
 mono-runtime-common
 mono-runtime-sgen
 mono-runtime
 libmono-corlib4.5-cil
[...SNIP...]
 libmono-csharp4.0c-cil
 gbrainy
 libdbus1.0-cil
 libdbus-glib1.0-cil
 libgdata2.1-cil
 libmono-addins0.2-cil
 libdbus2.0-cil
 libdbus-glib2.0-cil
 libnotify0.4-cil
 libtaglib2.1-cil
 banshee
 banshee-extension-soundmenu
 libmono-addins-gui0.2-cil
 libmono-simd4.0-cil
Processing was halted because there were too many errors.
Log ended: 2014-09-29  14:27:33

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

  1. Если вы используете обновление GTK: нажмите Ctrl-C и скажите Yes на приглашение спросить, действительно ли вы хотите выйти.

    Если это все еще не выходит... принудительно выйдите из этого с:

    ps -ef | grep do-release-upgrade | grep -v grep | awk '{ print $2 }' | xargs kill -9
  2. Сбросить ваш релиз обратно (например, я сбросил обратно saucy освободить от trusty):

    sudo sed -i -e 's/trusty/saucy/' /etc/apt/sources.list

    sudo sed -i -e 's/trusty/saucy/g; s/14\.04\.1/13.10/g; s/LTS//; /etc/lsb-release

    Например, ваш файл должен выглядеть так:

DISTRIB_ID=Ubuntu DISTRIB_RELEASE=13.10 DISTRIB_CODENAME=saucy DISTRIB_DESCRIPTION="Ubuntu 13.10"

  1. Перезапустите обновление с: sudo do-release-upgrade
Другие вопросы по тегам