Предлагаемые улучшения скрипта записи потока: тайм-аут?

Я бы сделал что-то вроде:

eval "$(#"
  perl -MString::ShellQuote -00 -lne '
    if (/^(.+)\n(.+)/) {
      ($v1, $v2, $rest) = ("sensors_$1", "$2", $'\'');
      # $v1, $v2 contain the first 2 lines, $rest the rest

      s/\W/_/g for $v1, $v2;
      # replace non-word characters with _ in the variables

      print "$v1=" . shell_quote("$1\n$2$rest");
      print "${v1}__$v2=" . shell_quote("$2$rest");
      # output the variable definition taking care to quote the value

      while ($rest =~ /^(.*?):\s*(.*)/gm) {
        # process the "foo: bar" lines in the rest
        ($v3,$val) = ("$1", $2);
        $v3 =~ s/\W/_/g;
        print "${v1}__${v2}__$v3=" . shell_quote($val)
      }
    }' < that-file)"

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

-n обрабатывать ввод по одной записи за раз.

В вашем примере эта команда perl выведет следующий код оболочки:

sensors_acpitz_virtual_0='acpitz-virtual-0
Adapter: Virtual device
temp1:        +41.0°C  (crit = +95.0°C)'

sensors_acpitz_virtual_0__Adapter__Virtual_device='Adapter: Virtual device
temp1:        +41.0°C  (crit = +95.0°C)'

sensors_acpitz_virtual_0__Adapter__Virtual_device__temp1='+41.0°C  (crit = +95.0°C)'

sensors_coretemp_isa_0000='coretemp-isa-0000
Adapter: ISA adapter
Core 0:       +36.0°C  (high = +90.0°C, crit = +90.0°C)
Core 1:       +36.0°C  (high = +90.0°C, crit = +90.0°C)'

sensors_coretemp_isa_0000__Adapter__ISA_adapter='Adapter: ISA adapter
Core 0:       +36.0°C  (high = +90.0°C, crit = +90.0°C)
Core 1:       +36.0°C  (high = +90.0°C, crit = +90.0°C)'

sensors_coretemp_isa_0000__Adapter__ISA_adapter__Core_0='+36.0°C  (high = +90.0°C, crit = +90.0°C)'

sensors_coretemp_isa_0000__Adapter__ISA_adapter__Core_1='+36.0°C  (high = +90.0°C, crit = +90.0°C)'

И мы используем eval "$ (that-perl-command)" , чтобы указать оболочке оценить вывод этого кода с помощью эту команду.

2
26.07.2018, 07:43
1 ответ

Я бы предложил следующий сценарий, в котором я сделал несколько изменений:

  • использовались имена переменных нижнего -регистра
  • присвоил переменной «сдаться» с прописанным -выражением «5 часов в секундах»
  • параметризовал файл для мониторинга в переменной filetomonitor
  • изменил цикл while trueна цикл в течение 5 часов, основываясь на поведении переменной bash SECONDS, которая подсчитывает количество секунд с момента запуска оболочки. Это начинается с нуля, когда стартует сценарий оболочки.
  • изменил обратные кавычки на более новую $(... )форму

Обновленный скрипт:

#!/bin/bash
giveup=$((5 * 60 * 60))
filetomonitor='/tmp/file-to-monitor'

ltime=$(stat -c %Z "$filetomonitor")
while [[ "$SECONDS" -lt "$giveup" ]]
do
  atime=$(stat -c %Z "$filetomonitor")
  if [[ "$atime" -ne "$ltime" ]]
  then
        echo Take action
        break           ## if we're only supposed to act once
        ltime=$atime
  fi
  sleep 5
done

Я оставил breakтам, но закомментировал. Если вы хотите, чтобы скрипт завершал работу (раньше, чем через 5 часов )после выполнения действия, раскомментируйте строку break; в противном случае текущая версия сценария будет выполняться в течение 5 часов (, возможно, дольше, если действие 70 -минут начинается в 4 :59 ), возможно, вызывая действие несколько раз.

1
27.01.2020, 22:17

Теги

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