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

8

Мне нужно создать whileцикл, который, если dmesgвозвращает какое-то / любое значение, то он должен убить определенный процесс.

Вот что у меня есть.

#!/bin/bash
while [ 1 ];
do

BUG=$(dmesg | grep "BUG: workqueue lockup" &> /dev/null)

    if [ ! -z "$BUG" ]; then
   killall someprocessname

else
    break
    fi
    done

Я не знаю , если вместо того , чтобы ! -zделать[ test -n "$BUG" ]

Я думаю, что с -n это что-то говорит об ожидании двоичного файла.

Я не знаю, будет ли сценарий работать, потому что блокировка BUG останавливает каждый процесс, но все же есть еще несколько строк, dmesgпока компьютер не будет полностью загружен - возможно, я смогу догнать и убить процесс.

Никто
источник
2
Вы берете весь dmesg, поэтому, как только произойдет одна найденная строка, вы не будете видеть ее каждый раз, и, таким образом, killall в каждом цикле! (В дополнение к другим вещам, о которых упоминается @ l0b0, таким как недостаток сна / стимуляции и т. Д.)
Оливье Дюлак,

Ответы:

12

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

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

    while true
    do
        dmesg --follow | tail --follow --lines=0 | grep --quiet 'BUG: workqueue lockup'
        killall someprocessname
    done
  • Код должен быть с отступом, чтобы быть читаемым.
  • Это действительно странно, но так [же, как test- видите help [.
l0b0
источник
1
Вы хотели добавить -qтак, чтобы он grep -q 'searchstringвыходил из dmesg --followи, таким образом, позволял достичь следующей строки, как только она увидит один вхождение строки поиска? Без этого ваш цикл не достигнет ни killall, ни цикла?
Оливье Дюлак
1
И даже с -q, я боюсь, вы будете много убивать, если dmesg --follow покажет несколько строк контекста dmesg (и, следовательно, покажет предыдущий случай (ы)), отсюда и мой предложенный ответ в качестве варианта.
Оливье Дюлак
@OlivierDulac Последняя проблема должна решаться с помощью tail.
10
Что делает tail --lines=0? Я знаю, что это значит для любой другой ценности.
Джо
1
@Joe Это на странице руководства - с --followней следует (то есть печатает) только строки, поступающие после запуска команды.
10
9

Вариант ответа @ 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.,"
        }'

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

  • это будет работать, пока этот процесс не умрет.
  • Он также не вызывает более 1 в killallкаждом случае строки поиска «BUG: блокировка рабочей очереди», что улучшает другой ответ.

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

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

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

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

Оливье Дюлак
источник
@ Никто: я рад. Не забывайте «принимать» (зеленая галочка), какие ответы кажутся лучшими на ваш взгляд, если только вы не чувствуете, что должны оставаться открытыми, чтобы разрешить дальнейшие ответы (или изменения текущих ответов).
Оливье Дюлак
оба ответа верны, если бы я мог выбрать оба.
Никто