Eu não confio em nada além do kernel para manter um estado sadio aqui, então eu não uso (ab) o init para realizar este trabalho, nem eu mesmo conto realmente saber o que está ou não está montado (alguns pacotes podem montar sistemas de arquivos extras, como binfmt_misc). Então, para abate de processo, eu uso:
PREFIX=/mnt/chroot-0
FOUND=0
for ROOT in /proc/*/root; do
LINK=$(readlink $ROOT)
if [ "x$LINK" != "x" ]; then
if [ "x${LINK:0:${#PREFIX}}" = "x$PREFIX" ]; then
# this process is in the chroot...
PID=$(basename $(dirname "$ROOT"))
kill -9 "$PID"
FOUND=1
fi
fi
done
if [ "x$FOUND" = "x1" ]; then
# repeat the above, the script I'm cargo-culting this from just re-execs itself
fi
E para a contagem de chroots, eu uso:
PREFIX=/mnt/chroot-0
COUNT=0
while grep -q "$PREFIX" /proc/mounts; do
COUNT=$(($COUNT+1))
if [ $COUNT -ge 20 ]; then
echo "failed to umount $PREFIX"
if [ -x /usr/bin/lsof ]; then
/usr/bin/lsof "$PREFIX"
fi
exit 1
fi
grep "$PREFIX" /proc/mounts | \
cut -d\ -f2 | LANG=C sort -r | xargs -r -n 1 umount || sleep 1
done
Como um adendo, gostaria de salientar que abordar isso como um problema de inicialização é provavelmente a maneira errada de examiná-lo, a menos que você tenha um init no chroot e em um espaço de processo separado (ou seja: no caso de Recipientes LXC). Com um único init (fora do chroot) e um espaço de processo compartilhado, isso não é mais o "problema do init", mas depende apenas de você encontrar os processos que por acaso têm o caminho ofensivo, daí o procedimento anterior. / p>
Não está claro a partir do seu post inicial se estes são sistemas totalmente inicializáveis que você está apenas atualizando externamente (que é como eu o leio), ou se são chroots que você usa para coisas como compilações de pacotes. Se for o último, você também pode querer um policy-rc.d em vigor (como o que aparece no mk-sbuild) que apenas proíbe o início de jobs do init. Obviamente, essa não é uma solução sensata, se estas também forem sistemas de inicialização.