Я сделал скрипт для вызова inotifywait. Это работает нормально, но я иногда хочу это остановить.
Как остановить последний экземпляр inotifywait?
Я не могу понять, как использовать inotify_rm_watch, который, как я понимаю, используется для его закрытия.
7341? S 0:00 inotifywait -m / home / andy / Загрузки / --format% w
inotify_rm_watch
, на который вы ссылаетесь, - это API (функция C), который вы использовали бы при написании «настоящей» программы (на C или чем-то подобном), а не сценарий. Так что это не относится к вашей ситуации.
Если вы хотите остановить inotifywait
, вы можете сделать это, как с любой другой программой:
Любая проблема ps -ef | grep inotifywait
, выберите PID (в вашем примере предположительно 7341
) и затем отправьте ему сигнал:
kill 7341
Или используйте вспомогательный сценарий killall
, который убивает все программ с заданным именем. killall
обычно устанавливается по умолчанию.
killall inotifywait
Это уничтожает все экземпляры inotifywait
:
pkill inotifywait
При использовании 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> / dev / null 2> & 1 &
) приходят из этот ответ на StackOverflow
ЧТО ПРОБЛЕМА ПРИ ИСПОЛЬЗОВАНИИ 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.