Как остановить все процессы в chroot?

вы можете использовать это:

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

1
задан 18 July 2012 в 13:48

4 ответа

Вы уже определили проблему самостоятельно: некоторые вещи запускают service ... во время dist-upgrade и service не являются частью Upstart, а являются частью sysvinit. Добавьте аналогичную магию awk вокруг service --status-all, чтобы остановить службы sysvinit, как вы использовали для сервисов Upstart.

0
ответ дан 25 May 2018 в 08:47
  • 1
    Ах, спасибо. Это почти лучше, но это не распространяется и на все сервисы. Я запустил sudo chroot /mnt/chroot-0 service --list-all и sudo chroot /mnt/chroot-0 initctl list, которые сообщают об отсутствии служб. Однако /usr/bin/epmd (от erlang-base) все еще работает. – Jeremy Kerr 11 July 2012 в 18:42

Я знаю, что этот вопрос довольно старый, но я думаю, что он так же уместен сегодня, как и в 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

0
ответ дан 25 May 2018 в 08:47

jchroot: chroot с большей изоляцией.

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

schroot еще не в состоянии сделать это, но это запланировано

Я успешно протестировал его в OpenVZ VPS, который не может использовать докер или lxc.

Пожалуйста, прочитайте блог автора для деталей:

jchroot

0
ответ дан 25 May 2018 в 08:47

schroot: У него есть функция управления сеансом. Когда вы останавливаете сеанс, все процессы уничтожаются.

https://github.com/dnschneid/crouton/blob/master/host-bin/unmount-chroot: эти скрипты уничтожают весь процесс chroot и размонтируют все установленные устройства.

-1
ответ дан 25 May 2018 в 08:47
  • 1
    Возможно, было бы полезно объяснить, как использование schroot over chroot может помочь решить проблему OP. – please delete me 2 July 2014 в 04:58

Другие вопросы по тегам:

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