Повторно выполняйте команду bash, пока нет выхода из другого процесса

Я запускаю fs_usage для обнаружения доступа к объекту в моей файловой системе.

 sudo fs_usage -w | grep -E 'object' 

Теперь я хочу запустить команду touch на этом объекте каждые 5 секунд, пока нет нового выхода из указанной выше команды в течение 5 секунд.

  • Как заставить ssh-соединение выйти в конце скрипта
  • Как grep, затем искать и заменять на выходе?
  • настроить ddclient для возврата внутреннего ip вместо общедоступного ip
  • Перезапустите службу systemd, когда вывод больше не сгенерирован
  • Подробный вывод отсутствует при выполнении сценария как CGI
  • Разрешение отклонено в файле под / tmp
  • Выполните вывод команды, если она успешна
  • Как просматривать выходные данные для ВСЕХ процессов одновременно?
  • почему этот параллельный процесс не записывает вывод в файлы, а вместо этого печатает на консоли?
  • Как grep, затем искать и заменять на выходе?
  • настроить ddclient для возврата внутреннего ip вместо общедоступного ip
  • последняя команда показывает только количество дней входа в систему на несколько дней
  • 2 Solutions collect form web for “Повторно выполняйте команду bash, пока нет выхода из другого процесса”

     sudo fs_usage -w | while true; do if read -rt5 && [[ $REPLY =~ objectpattern ]]; then # Some output happened in the last 5 seconds that matches object pattern : else touch objectfile fi done 

    Конечно, использование read -t означает, что есть некоторый вывод, не соответствующий objectpattern ; если это произойдет, файл будет затронут. Если вы хотите этого избежать, нам нужно немного усложниться.

     timeout=5 sudo fs_usage -w | while true; do (( mark = SECONDS + timeout )) if !read -rt$timeout; then touch objectfile timeout=5 elif ![[ $REPLY =~ objectpattern ]]; then # Some output happened within timeout seconds that does _not_ match. # Reduce timeout by the elapsed time. (( timeout = mark - SECONDS )) if (( timeout < 1 )); then touch objectfile timeout=5 fi else timeout=5 fi done - timeout=5 sudo fs_usage -w | while true; do (( mark = SECONDS + timeout )) if !read -rt$timeout; then touch objectfile timeout=5 elif ![[ $REPLY =~ objectpattern ]]; then # Some output happened within timeout seconds that does _not_ match. # Reduce timeout by the elapsed time. (( timeout = mark - SECONDS )) if (( timeout < 1 )); then touch objectfile timeout=5 fi else timeout=5 fi done - timeout=5 sudo fs_usage -w | while true; do (( mark = SECONDS + timeout )) if !read -rt$timeout; then touch objectfile timeout=5 elif ![[ $REPLY =~ objectpattern ]]; then # Some output happened within timeout seconds that does _not_ match. # Reduce timeout by the elapsed time. (( timeout = mark - SECONDS )) if (( timeout < 1 )); then touch objectfile timeout=5 fi else timeout=5 fi done - timeout=5 sudo fs_usage -w | while true; do (( mark = SECONDS + timeout )) if !read -rt$timeout; then touch objectfile timeout=5 elif ![[ $REPLY =~ objectpattern ]]; then # Some output happened within timeout seconds that does _not_ match. # Reduce timeout by the elapsed time. (( timeout = mark - SECONDS )) if (( timeout < 1 )); then touch objectfile timeout=5 fi else timeout=5 fi done - timeout=5 sudo fs_usage -w | while true; do (( mark = SECONDS + timeout )) if !read -rt$timeout; then touch objectfile timeout=5 elif ![[ $REPLY =~ objectpattern ]]; then # Some output happened within timeout seconds that does _not_ match. # Reduce timeout by the elapsed time. (( timeout = mark - SECONDS )) if (( timeout < 1 )); then touch objectfile timeout=5 fi else timeout=5 fi done 

    Если я правильно вас понимаю, то, вероятно, вы захотите сделать:

     sh -c '{ fsusage #your command runs (indefintely?) kill -PIPE "$$" #but when it completes, so does this shell } >&3 & #backgrounded and all stdout writes to pipe while sleep 5 #meanwhile, every 5 seconds a loop prints do echo #a blank line w/ echo done' 3>&1 | #also to a pipe, read by an unbuffered (GNU) sed sed -u ' ### if first input line, insert shell init to stdout ### for seds [aic] commands continue newlines w/ \escapes ### and otherwise \escape only all other backslashes 1i\ convenience_func(){ : this is a function \\\ declared in target \\\ shell and can be \\\ called from sed.; } ### if line matches object change it to command /object/c\ # this is an actual command sent to a shell for each match ### this is just a comment - note the \escaped newlines above ### delete all other nonblank lines; change all blanks /./d;c\ # this is a command sent to a shell every ~5 seconds ' | sh -s -- This is the target shell and these are its \ positional parameters. These can be referred \ to in sed\'s output like '"$1"' or '"$@"' as \ an array. They can even be passed along to \ 'convenience_func()' as arguments. 

    Около 90% из них состоит из комментариев. В основном это можно сварить до …

     sh -c '(fsusage;kill "$$") >&3 & while sleep 5; do echo; done ' 3>&1| sed -nue '/pattern/c\' -e 'echo match /./!c\' -e 'touch -- "$1" ' | sh -s -- filename 
    Linux и Unix - лучшая ОС в мире.