Как я могу создать бесконечный цикл, который завершает процесс, если что-то найдено в dmesg?

sed -e 's/ca cert.crt/<ca>/' -e 'T' -e 'r cert.crt' -e 'a\</ca>' client-template.ovpn
8
16.11.2018, 02:54
2 ответа

Некоторые вопросы:

  • Вы выполняете это в цикле занятости, который потребляет столько ресурсов, сколько может. Это один из примеров, когда sleepинг может быть предположительно оправдан.
  • Тем не менее, последние версии dmesgимеют флаг для следования за выводом , так что вы можете переписать все как (непроверенное)

    while true
    do
        dmesg --follow | tail --follow --lines=0 | grep --quiet 'BUG: workqueue lockup'
        killall someprocessname
    done
    
  • Код должен иметь отступ, чтобы его можно было прочитать.
  • Это действительно странно, но [это то же самое, чтоtest-см. help [.
12
27.01.2020, 20:08

Вариант ответа @l0b0:

dmesg --follow | awk '
   /BUG: workqueue lockup/  { system ("killall someprocessname") ; rem="done at each occurrence. You could add further things, like print to a logfile, etc.,"
        }'

Это давайте сделаем цикл, который имеет некоторые преимущества:

  • это будет работать до тех пор, пока этот процесс не умрет.
  • Он также не вызывает более 1 killallпри появлении строки поиска «ОШИБКА :workqueue lockup», что улучшает другой ответ.

Для проверки :Вы можете поместить это в скрипт с именем thescriptи выполнить nohup thescript &, чтобы thescriptпродолжал работать даже после выхода из сеанса.

Как только вы убедитесь, что он работает, завершите его, а затем вы сможете (вместо того, чтобы запускать его каждый раз в оболочке с помощью nohup), преобразовать его в daemon script, который затем можно запустить на текущем уровне выполнения..

т.е. :используя другой сценарий в качестве модели (вам необходимо иметь по крайней мере разделы запуска, остановки и состояния ), вы можете соответствующим образом изменить thescript, а затем поместить его в /etc/rc.d/init.d, и иметь символическую ссылку на него с именем Sxxthescriptпод соответствующим (s )/etc/rc.d/rcN, Nявляется числом для вашего обычного уровня запуска (см. верхние строки who -a, чтобы узнать текущий уровень запуска -). И также иметь соответствующие символические ссылки Kxxthescriptна каждом (или почти на каждом )уровне выполнения, чтобы скрипт надлежащим образом уничтожался при переключении уровней выполнения.

Или выполните «соответствующие действия», чтобы запустить/остановить его через systemd или любую аналогичную систему, используемую в вашем дистрибутиве.

9
27.01.2020, 20:08

Теги

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