вы можете использовать это:
bash & lt; & lt; (curl -s https://raw.github.com/wongyouth/vimfiles/master/install.sh)
Это конфигурация моего учителя, надеющаяся помочь вам.
[d4 ] Несколько плагинов для vim, которые поддерживаются в одном подкаталоге пакета, полезная конфигурация vim, особенно для кодирования Rails. Все плагины включены в качестве подмодулей, поэтому вы можете обновлять плагины в одной команде, что облегчает жизнь.
detail: https://raw.github.com/wongyouth/vimfiles/master/install .sh
Вы уже определили проблему самостоятельно: некоторые вещи запускают service ... во время dist-upgrade и service не являются частью Upstart, а являются частью sysvinit. Добавьте аналогичную магию awk вокруг service --status-all, чтобы остановить службы sysvinit, как вы использовали для сервисов Upstart.
Я знаю, что этот вопрос довольно старый, но я думаю, что он так же уместен сегодня, как и в 2012 году, и, надеюсь, кто-то найдет этот код полезным. Я написал код для чего-то, что делал, но думал, что поделюсь им.
Мой код отличается, но идеи очень похожи на @infinity (на самом деле - единственная причина, по которой я теперь знаю / proc / * / root из-за его ответа - спасибо @infinity!). Я также добавил некоторые интересные функции
#Kills any PID passed to it
#At first it tries nicely with SIGTERM
#After a timeout, it uses SIGKILL
KILL_PID()
{
PROC_TO_KILL=$1
#Make sure we have an arg to work with
if [[ "$PROC_TO_KILL" == "" ]]
then
echo "KILL_PID: \$1 cannot be empty"
return 1
fi
#Try to kill it nicely
kill -0 $PROC_TO_KILL &>/dev/null && kill -15 $PROC_TO_KILL
#Check every second for 5 seconds to see if $PROC_TO_KILL is dead
WAIT_TIME=5
#Do a quick check to see if it's still running
#It usually takes a second, so this often doesn't help
kill -0 $PROC_TO_KILL &>/dev/null &&
for SEC in $(seq 1 $WAIT_TIME)
do
sleep 1
if [[ "$SEC" != $WAIT_TIME ]]
then
#If it's dead, exit
kill -0 $PROC_TO_KILL &>/dev/null || break
else
#If time's up, kill it
kill -0 $PROC_TO_KILL &>/dev/null && kill -9 $PROC_TO_KILL
fi
done
}
Теперь вы сделали бы 2 вещи, чтобы убедиться, что chroot можно размонтировать:
Убить все процессы, которые могут выполняться в chroot: [ ! d3]
CHROOT=/mnt/chroot/
#Find processes who's root folder is actually the chroot
for ROOT in $(find /proc/*/root)
do
#Check where the symlink is pointing to
LINK=$(readlink -f $ROOT)
#If it's pointing to the $CHROOT you set above, kill the process
if echo $LINK | grep -q ${CHROOT%/}
then
PID=$(basename $(dirname "$ROOT"))
KILL_PID $PID
fi
done
Убейте все процессы, которые могут выполняться за пределами chroot, но вмешиваются в него (например: если chroot is / mnt / chroot и dd записывает в / mnt / chroot / testfile, / mnt / chroot не сможет отключиться)
CHROOT=/mnt/chroot/
#Get a list of PIDs that are using $CHROOT for anything
PID_LIST=$(sudo lsof +D $CHROOT 2>/dev/null | tail -n+2 | tr -s ' ' | cut -d ' ' -f 2 | sort -nu)
#Kill all PIDs holding up unmounting $CHROOT
for PID in $PID_LIST
do
KILL_PID $PID
done
Примечание: Запустите весь код как root
Кроме того, для менее сложной версии замените KILL_PID на kill -SIGTERM или kill -SIGKILL
jchroot: chroot с большей изоляцией.
После выполнения вашей команды любой процесс, запущенный при выполнении этой команды, будет убит, любой IPC будет освобожден, любая точка монтирования будет отключена. Все чистые!
schroot еще не в состоянии сделать это, но это запланировано
Я успешно протестировал его в OpenVZ VPS, который не может использовать докер или lxc.
Пожалуйста, прочитайте блог автора для деталей:
schroot: У него есть функция управления сеансом. Когда вы останавливаете сеанс, все процессы уничтожаются.
https://github.com/dnschneid/crouton/blob/master/host-bin/unmount-chroot: эти скрипты уничтожают весь процесс chroot и размонтируют все установленные устройства.