Остановить inotifywait экземпляр

Я сделал скрипт для вызова inotifywait. Это работает нормально, но я иногда хочу это остановить.

Как остановить последний экземпляр inotifywait?

Я не могу понять, как использовать inotify_rm_watch, который, как я понимаю, используется для его закрытия.

7341? S 0:00 inotifywait -m / home / andy / Загрузки / --format% w

1
задан 10 January 2018 в 21:33

4 ответа

inotify_rm_watch, на который вы ссылаетесь, - это API (функция C), который вы использовали бы при написании «настоящей» программы (на C или чем-то подобном), а не сценарий. Так что это не относится к вашей ситуации.

Если вы хотите остановить inotifywait, вы можете сделать это, как с любой другой программой:

  • Любая проблема ps -ef | grep inotifywait, выберите PID (в вашем примере предположительно 7341) и затем отправьте ему сигнал:

    kill 7341

  • Или используйте вспомогательный сценарий killall, который убивает все программ с заданным именем. killall обычно устанавливается по умолчанию.

    killall inotifywait

0
ответ дан 10 January 2018 в 21:33
  • 1
    спасибо за Ваш ответ. для этой команды sudo нано/etc/apt/sources.list хорошо работает, но для этого sudo нано conf/hadoop-env.sh остается проблема – iav-babak 3 June 2012 в 14:09
  • 2
    спасибо за Ваш ответ. для этой команды sudo нано/etc/apt/sources.list хорошо работает, но для этого sudo нано conf/hadoop-env.sh остается проблема – iav-babak 3 June 2012 в 14:09
  • 3
    спасибо за Ваш ответ. для этой команды sudo нано/etc/apt/sources.list хорошо работает, но для этого sudo нано conf/hadoop-env.sh остается проблема – iav-babak 3 June 2012 в 14:09
  • 4
    спасибо за Ваш ответ. для этой команды sudo нано/etc/apt/sources.list хорошо работает, но для этого sudo нано conf/hadoop-env.sh остается проблема – iav-babak 3 June 2012 в 14:09
  • 5
    спасибо за Ваш ответ. для этой команды sudo нано/etc/apt/sources.list хорошо работает, но для этого sudo нано conf/hadoop-env.sh остается проблема – iav-babak 3 June 2012 в 14:09
  • 6
    спасибо за Ваш ответ. для этой команды sudo нано/etc/apt/sources.list хорошо работает, но для этого sudo нано conf/hadoop-env.sh остается проблема – iav-babak 3 June 2012 в 14:09

Это уничтожает все экземпляры inotifywait:

pkill inotifywait
0
ответ дан 31 October 2019 в 15:46

При использовании inotifywait --daemon вы никогда не получите идентификатор процесса.

Если вы похожи на меня и не хотите без разбора уничтожать ВСЕ экземпляры inotifywait, вы можете вместо этого использовать nohup и inotifywait --monitor .

Вот как я использую это в своих сценариях bash. Это позволяет мне не беспокоить другие запущенные экземпляры inotifywait :

# Launch with nohup and redirect inputs and outputs
nohup inotifywait --monitor --outfile /out/file </dev/null >/dev/null 2>&1 &

# Gets process ID of last launched process.
_INOTIFYWAIT_PID=$!

# later on ...

# Kill only this instance of 'inotifywait'
kill ${_INOTIFYWAIT_PID}

Команды перенаправления ввода и вывода ( / dev / null 2> & 1 & ) приходят из этот ответ на StackOverflow

0
ответ дан 12 December 2019 в 14:44

ЧТО ПРОБЛЕМА ПРИ ИСПОЛЬЗОВАНИИ kill ?

У вас может быть несколько процессов inotifywait, поскольку другие скрипты могут использовать inotifywait независимо друг от друга. . Таким образом, используя эту команду ps -ef | grep inotifywait, чтобы найти правильный PID, не лучший способ, потому что вам нужно иметь хорошее предположение, какой процесс inotifywait принадлежит вашему скрипту. Таким образом, вы можете в конечном итоге убить неправильный PID. Кроме того, команда killall inotifywait более агрессивна, чем предыдущая. Однако, если вас действительно не волнует, что другая система использует inotifywait, вы используете агрессивную команду.

МОЙ ЛУЧШИЙ СПОСОБ УБИЙСТВА inotifywait ПРОЦЕСС ДЛЯ КАЖДОГО экземпляра inotifywait

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

#!/bin/bash
# inotify-test.sh
test="changes.txt" # Monitoring file
flag="flag.txt" # For stopping, starting event or whatever flag you need
REPORT_FILE="report.txt"
cat /dev/null > $REPORT_FILE
pid="inotify-test.pid"
cat /dev/null > $max_pid
ARGS1="$1"

function start_monitor {

# If file not exist, then write default start
if [ -f "${flag}" ]; then
        echo "start" > "${flag}"
fi
# Do not use -q -q (twice), because it will not output anything after do while loop
(echo "$BASHPID" > $pid; exec inotifywait -q $flag $test -e modify -m) |
while read file action
do
        process_flag=$(head -1 ${flag})
        if [ "${process_flag}" == "stop" ]; then
                echo "Process stopped" >> $REPORT_FILE
                kill -- -$$
        elif [ "${process_flag}" == "sleep" ]; then
                echo "Process sleep: $$" >> $REPORT_FILE
                sleep 5
                # Important, after sleep, must write start to start
                echo "start" > "${flag}"
        elif [ "${process_flag}" == "start" ]; then
                echo "Process is running" >> $REPORT_FILE
                # Only run here if flag is start
                echo "File: $file, action: $action, date `date`" >> $REPORT_FILE
        else
                echo "Invalid flag $$" >> $REPORT_FILE
        fi
done & # This symbol & is important, it will run this inotify in background

}

if [ "${ARGS1}" == "start" ]; then
        start_monitor
fi

if [ "${ARGS1}" == "stop" ]; then
        echo "stop" > "${flag}"
fi

if [ "${ARGS1}" == "test" ]; then
        echo "sleep" > "${flag}"
fi

Вы можете посмотреть это действие в лог-файле $REPORT_FILE

tail -f report.txt

Чтобы начать мониторинг, вы можете использовать:

./inotify-test.sh start

Чтобы протестировать скрипт с запущенным inotifywait, выполните следующую команду:

./inotify-test.sh test

Итак, чтобы остановить запущенный процесс inotify, вам просто нужно запустить тот же скрипт с

./inotify-test.sh stop

С помощью этого метода вам не нужно знать идентификатор процесса для этого процесса inotifywait.

КАК ЭТО РАБОТАЕТ?

Вы заметили, что у меня есть 2 файла для мониторинга $flag $test из команды inotifywait, поэтому, если я внесу изменения в $flag, изменение даже будет запущено немедленно, и я могу использовать эту возможность, чтобы остановить процесс PID внутри цикла inotifywait. Кроме того, вы можете видеть, что скрипт фактически сохраняет фактический pid inotifywait в pid="inotify-test.pid". Таким образом, вы можете вручную завершить процесс inotifywait, используя этот правильный pid.

1
ответ дан 16 October 2020 в 20:08

Другие вопросы по тегам:

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