синхронизация сценария оболочки с операциями ядра

#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 для настольных компьютеров при завершении работы. Кроме того, вы можете попробовать повторно смонтировать файловую систему только для чтения вместо того, чтобы размонтировать ее полностью.