Мне нужно создать 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
пока компьютер не будет полностью загружен - возможно, я смогу догнать и убить процесс.
Ответы:
Некоторые вопросы:
sleep
может быть оправдан.Однако в последних версиях
dmesg
есть флаг, который следует за выводом , так что вы можете переписать все как (не проверено)[
же, какtest
- видитеhelp [
.источник
-q
так, чтобы онgrep -q 'searchstring
выходил изdmesg --follow
и, таким образом, позволял достичь следующей строки, как только она увидит один вхождение строки поиска? Без этого ваш цикл не достигнет ни killall, ни цикла?tail
.tail --lines=0
? Я знаю, что это значит для любой другой ценности.--follow
ней следует (то есть печатает) только строки, поступающие после запуска команды.Вариант ответа @ l0b0:
Это давайте awk сделаем цикл, который имеет некоторые преимущества:
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 или любую другую эквивалентную систему, которую использует ваш дистрибутив.
источник