2013-08-30 5 views
1

Я использую команду inotifywait для запуска команды при возникновении события файловой системы. Я бы хотел, чтобы это подождало 5 секунд, чтобы узнать, произошло ли событие еще, и если это произойдет, я хотел бы сбросить таймер на пять секунд и подождать еще несколько. Имеют смысл?Адресные таймеры в Bash

Моя проблема в том, что я нападаю на это в Bash, и я не знаю, как это сделать. В JavaScript, я хотел бы использовать SetTimeout с некоторым кодом, как это:

function doSomething() { ... } 

var timer; 
function setTimer() { 
    window.clearTimeout(timer) 
    timer = window.setTimeout(doSomething, 5000); 
} 

// and then I'd just plug setTimer into the inotifywait loop. 

Но есть адресно, Устраняемые фоновые таймеры в Bash?

+0

В некоторых ситуациях вы можете имитировать их, используя фоновый процесс, который запускает 'sleep'. Однако я не уверен, как вы будете использовать это для своего приложения. – Barmar

ответ

0

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

В качестве меры безопасности, после того, как сон закончился, подоболочка очищает $ PID, чтобы избежать command был убит в середине исполнения

PID=0 
while inotifywait -r test/; do 
    [[ $PID -gt 0 ]] && kill -9 $PID 
    { sleep 5; PID=0; command; } & PID=$! 
done 

Это немного грязный, но я проверил его и он работает. Если я создаю новые файлы в ./test/, он видит это, и если $ PID не равен нулю, он убьет предыдущую спящую команду и сбросит таймер.

+1

Мне не совсем понятно, чего вы хотите. Но небольшим улучшением было бы заменить явный вызов 'sh' на' {sleep 5; command} & '. – chepner

+0

@chepner Да, это тоже работает – Oli