#linux #shell #embedded #busybox
#linux #оболочка #встроенный #busybox
Вопрос:
Для остановки активности в моей встроенной системе Linux у меня есть следующий сценарий оболочки (интерпретируемый busybox):
#!/bin/sh
pkill usefulp_program
swapoff /home/.swapfile
umount -l /home
sleep 3 # While I can't find a way to sync, sleep
Если я удаляю sleep
строку, скрипт возвращается немедленно, даже не дожидаясь umount
(что является ленивым, поскольку по какой-то причине он отказывается размонтировать в противном случае). Вы знаете, как я могу дождаться завершения всех трех операций перед завершением сценария? Обращение к произвольному sleep
не выглядит хорошим решением.
Кроме того, есть какой-нибудь намек на то, почему я не могу umount
без -l
?
Комментарии:
1. Вы пробовали использовать
umount
с-f
флагами (принудительно) или-n
(не записывать в /etc/mtab)?2.
umount
Задержка с требованием, вероятно, означает, что какой-то файл или каталог открыт; если выprocfs
смонтировали, попробуйте:ls -ld /proc/*/cwd /proc/*/fd/*| grep home
посмотреть, есть ли у какого-либо процесса текущий рабочий каталог внутри/home/
или файлы, открытые внутри/home
.3. При ближайшем рассмотрении необходимость в -l кажется следствием того, что процесс не дожидается завершения, поскольку он использует / home .
4. Вы не можете размонтировать файловую систему, пока какой-либо процесс имеет какой-либо файл, открытый под точкой монтирования, или если процесс имеет свой текущий каталог в качестве точки монтирования или каталог под точкой монтирования. Если, как следует из вашего комментария, сценарий, который вы запускаете, находится под
/home
управлением, то вы ни к чему не скрываетесь; вы не можете размонтировать/home
, пока ни один из его файлов не будет использован, а файл будет использоваться во время выполнения сценария. Вам придется переместить ваш скрипт из/home
файловой системы.5. Сценарий находится вне / дома. Единственный процесс, использующий / home, — это тот, который я убиваю.
Ответ №1:
Вам нужно дождаться завершения остановленного процесса. Согласно вашему комментарию…
wait <pid>
…не работает! Итак, можно было бы зациклить ala:
while ps -p <pid> > /dev/null; do sleep 1; done
дождаться завершения остановленного процесса, прежде чем выполнять swapoff и umount.
Комментарии:
1. похоже, что wait работает только с дочерним процессом, чего здесь нет.
2. @lvella: спасибо за разъяснение… тогда справочная страница вводит в заблуждение (говорит «Дождитесь каждого указанного процесса и верните его статус завершения. Каждое n может быть идентификатором процесса или спецификацией задания», далее упоминаются дочерние процессы только в тех случаях, когда аргумент не был указан).
Ответ №2:
Как уже упоминали другие, вы должны, и только -l
тогда, когда процесс завершен. Вариант, если это занимает много времени / он просто игнорирует вашу вежливую просьбу остановиться, использует другой сигнал. Можно было бы -9
использовать команду kill / killall /pkill для отправки SIGKILL вместо SIGTERM. Если вы не хотите использовать hammer с первой попытки, вы могли бы сделать что-то вроде
pkill your_programm
sleep 10
pkill -9 your_programm
Комментарии:
1. Кстати, это то, что делают linux для настольных компьютеров при завершении работы. Кроме того, вы можете попробовать повторно смонтировать файловую систему только для чтения вместо того, чтобы размонтировать ее полностью.