У мене є ряд розділів LVM, кожен з яких містить установку Ubuntu. Іноді я хочу зробити apt-get dist-upgrade
, щоб оновити установку до останніх пакетів. Я роблю це з chroot - процес зазвичай є чимось на кшталт:
$ sudo mount /dev/local/chroot-0 /mnt/chroot-0
$ sudo chroot /mnt/chroot-0 sh -c 'apt-get update && apt-get dist-upgrade'
$ sudo umount /mnt/chroot-0
[не показано: я також монтую і відключаю /mnt/chroot-0/{dev,sys,proc}
як прив'язування до реального /dev
, /sys
і /proc
, як видається, оновлення має на меті]
Однак після оновлення до точного цей процес більше не працює - остаточний вміст вийде з ладу, оскільки у /mnt/chroot-0
файловій системі все ще є відкриті файли . lsof
підтверджує, що в chroot є процеси з відкритими файлами. Ці процеси були запущені під час dist-оновлення, я припускаю, що це тому, що певні служби в chroot потребують перезапуску (наприклад, через service postgresql restart
) після оновлення пакета.
Отже, я вважаю, що мені потрібно сказати на початку, щоб зупинити всі сервіси, які працюють у цьому chroot. Чи є спосіб надійно це зробити?
Я спробував:
cat <<EOF | sudo chroot /mnt/chroot-0 /bin/sh
# stop 'initctl' services
initctl list | awk '/start\/running/ {print \$1}' | xargs -n1 -r initctl stop
EOF
Де, initctl list
здається, робити все правильно, і лише перелічити процеси, розпочаті саме в цьому корені. Я також спробував додати це, як запропонував Туміноїд:
cat <<EOF | sudo chroot /mnt/chroot-0 /bin/sh
# stop 'service' services
service --status-all 2>/dev/null |
awk '/^ \[ \+ \]/ { print \$4}' |
while read s; do service \$s stop; done
EOF
Однак, схоже, все це не сприймає; процеси, що були демонізовані та відновлені до PID 1, не зупиняються. Я також спробував:
sudo chroot /mnt/chroot-0 telinit 0
Але в цьому випадку init не розрізняє окремі корені і вимикає всю машину.
Отже, чи є спосіб сказати init зупинити всі процеси в певному chroot, щоб я міг безпечно відключити файлову систему? Чи є у запуску якийсь засіб для SIGTERM / SIGKILL усіх дочірніх процесів (як це робиться під час регулярного відключення) в межах chroot?