inotifywait, не работающий, когда папка удалена и воссоздана

Если бы Вы используете переменную в своем сценарии, я предполагаю, что первое действие с ним должно было бы установить свое значение к чему-то, что сделает сброс бесполезным.

При использовании переменной, не устанавливая его сначала код является багги, если это не известная переменная, в этом случае, Вы не должны сбрасывать его во-первых.

typeset обычно не имеет никакой добавленной стоимости, если Вы не хотите определить локальную переменную в функции ksh, или если Вы хотите/нуждаетесь дать тип своей переменной.

В более общем плане Вы, конечно, найдете различный стандарт кодирования для сценариев оболочки включая специализированным с ksh. То, что имеет значение, последовательно, используйте надлежащее добавление отступа, используйте имена переменной и имена функций, которые помогают пониманию Вашего сценария, но это - общие рекомендации вообще язык программирования.

2
05.04.2014, 15:54
1 ответ

Во-первых, если вы удалите папку, которая inotifywait смотрит, тогда да, он перестанет это смотреть. Очевидный способ обойти это - просто контролировать каталог на один уровень выше (вы даже можете создать каталог для особого мониторинга и поместить туда свою рабочую_папку .

Однако это не сработает, если у вас есть папка внизу, которая размонтирована / перемонтирована, а не удалена / воссоздана, это два очень разных процесса. Я понятия не имею, лучше ли использовать что-то, кроме inotifywait , поскольку я понятия не имею, что вы пытаются достичь путем мониторинга каталога. Однако, возможно, лучше всего настроить правило udev для вызова в качестве сценария, который подключает USB-накопитель и запускает процесс inotifywait когда он подключен, и другой, чтобы остановить его снова, когда он отключен.

Вы должны поместить правила udev в файл .rules в каталоге / etc / udev / rules.d`.Правила будут выглядеть примерно так:

ENV{ID_SERIAL}=="dev_id_serial", ACTION=="add", \
  RUN+="/path/to/script add '%E{DEVNAME}'"
ENV{ID_SERIAL}=="dev_id_serial", ACTION=="remove", \
  RUN+="/path/to/script remove '%E{DEVNAME}'"

Где ID_SERIAL для устройства можно определить с помощью:

udevadm info --name=/path/to/device --query=property

с помощью сценария, например:

#!/bin/sh

pid_file=/var/run/script_name.pid
out_file=/var/log/script_name.log

# try to kill previous process even with add in case something
# went wrong with last remove
if [ "$1" = add ] || [ "$1" = remove ]; then
  pid=$(cat "$pid_file")
  [ "$(ps -p "$pid" -o comm=)" = inotifywait ] && kill "$pid"
fi

if [ "$1" = add ]; then
  /bin/mount "$2" /home/oshiro/Desktop/work_folder
  /usr/bin/inotifywait -m -r /home/oshiro/Desktop/work_folder \
    </dev/null >"$out_file" 2>&1 &
  echo $! >"$pid_file"
fi

Также убедитесь, что установка через Правило udev не конфликтует с другим процессом, который может попытаться автоматически смонтировать диск, когда он подключен.

7
27.01.2020, 21:52

Теги

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