Вариант ответа @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.,"
}'
Это давайте сделаем цикл, который имеет некоторые преимущества:
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 или любую аналогичную систему, используемую в вашем дистрибутиве.
Чтобы получить третье;
-поле с разделителями из вашего файла, используйтеcut
:
$ cut -d ';' -f 3 file
AS 3N123N8j a5njs
Чтобы получить отображаемое поле, вырежьте 6-е поле:
$ cut -d ';' -f 6 file
A9S
Вы также можете использовать awk
для этого с awk -F ';' '{ print $6 }' file
.
С sed
вы не можете использовать флаг /n
для команды s
(, где n
является цифрой ), потому что вам нужно заменить всю строку . Это включает фактически соответствие всей строке, а не только конкретному полю.
Таким образом, одним из способов получить шестое;
-поле с разделителями было бы использование
$ sed 's/^\([^;]*;\)\{5\}\([^;]*\);.*/\2/' file
A9S
или, если ваш sed
поддерживает расширенное регулярное выражение с -E
,
$ sed -E 's/^([^;]*;){5}([^;]*);.*/\2/' file
A9S
То есть сопоставьте пять полей, где каждое поле соответствует [^;]+;
(, включает завершающий ;
для каждого поля ), а затем искомое поле, за которым следует остальная часть строки. Замените все это полем, которое нам нужно.
Короче говоря, вам лучше использовать cut
или awk
для этой задачи.