Запрос awk для последовательной замены шаблона

Apache Error [notice] suEXEC mechanism enabled (wrapper: /usr/sbin/suexec)

В одно прекрасное утро я обнаружил, что моя служба Apache (httpd) не работает и не может быть запущена:)

Шаг 1. Проверка статуса службы httpd:

#/etc/init.d/httpd status

httpd мертв, но файл pid существует

Шаг 2: Найдите процессы httpd и уничтожьте их

#ps -ef | grep httpd

# killall -9 httpd

Шаг 3: Удалите файл блокировки httpd, если он существует

# rm -f /var/lock/subsys/httpd

Шаг 4: Перезапустите службу Apache / httpd

# service httpd restart
Stop httpd    [FAILED]
Start httpd   [FAILED]

Необходимо копать еще.

Шаг 5. Проверьте файл журнала ошибок httpd.

# grep suexec /var/log/httpd/error_log
[Sun Sep 22 10:32:06 2013] [notice] suEXEC mechanism enabled (wrapper: /usr/sbin/suexec)
[Sun Sep 22 10:33:51 2013] [notice] suEXEC mechanism enabled (wrapper: /usr/sbin/suexec)
[Sun Sep 22 10:38:03 2013] [notice] suEXEC mechanism enabled (wrapper: /usr/sbin/suexec)
[Sun Sep 22 10:45:53 2013] [notice] suEXEC mechanism enabled (wrapper: /usr/sbin/suexec)

Шаг 6. Проверьте файл журнала ошибок httpd nss.

#tail -300 /var/log/httpd/nss_error_log
[Sun Sep 22 04:03:27 2013] [error] Certificate not verified: 'Server-Cert'
[Sun Sep 22 04:03:27 2013] [error] SSL Library Error: -8181 Certificate has expired
[Sun Sep 22 04:03:27 2013] [error] Unable to verify certificate 'Server-Cert'. Add "NSSEnforceValidCerts off" to nss.conf so the server can start until the problem can be resolved.

[Sun Sep 22 10:38:03 2013] [error] Certificate not verified: 'Server-Cert'
[Sun Sep 22 10:38:03 2013] [error] SSL Library Error: -8181 Certificate has expired
[Sun Sep 22 10:38:03 2013] [error] Unable to verify certificate 'Server-Cert'. Add "NSSEnforceValidCerts off" to nss.conf so the server can start until the problem can be resolved.
[Sun Sep 22 10:45:53 2013] [error] Certificate not verified: 'Server-Cert'
[Sun Sep 22 10:45:53 2013] [error] SSL Library Error: -8181 Certificate has expired
[Sun Sep 22 10:45:53 2013] [error] Unable to verify certificate 'Server-Cert'. Add "NSSEnforceValidCerts off" to nss.conf so the server can start until the problem can be resolved.

Основная причина этой проблемы находится в модуле с именем nss. mod_nss является альтернативой mod_ssl ; он делает несколько вещей, которые не выполняет mod_ssl , и может работать вместе с mod_ssl . Для получения дополнительной информации перейдите по ссылкам [Что такое mod_nss, Настройка Mod_NSS, Подробнее]

Шаг 7. Удалите файл nss.conf из каталога httpd conf.d

#cd /etc/httpd/conf.d
#mv nss.conf nss.conf.orig
#mv ssl.conf ssl.conf.orig
#/etc/init.d/httpd start
Start httpd   [OK]
-3
20.03.2019, 14:45
1 ответ

У меня есть основания полагать, что рабочей awkкомандой является

awk -v count=3 '/DS:/ {$NF=((c++ % count) + 1)} 1' input

где input— входной файл. Также я думаю, что во входном файле должно быть 9 строк вместо 7, чтобы сгенерировать вывод, указанный в вопросе.

Вот как это работает.

Во-первых, опция -v count=3назначает 3переменнойawkcount. Если бы это было написано так, как написано в вопросе(count=3в конце команды ), 3было бы присвоено переменной оболочки и не было бы доступно для awk. ] и приведет к ошибке деления на ноль, поскольку countбудет неявно инициализирован как 0.

В

/DS:/ {$NF=((c++ % count) + 1)}

Часть /DS:/является условием для блока в фигурных скобках. Это регулярное выражение DS:, которое может соответствовать только строке DS:. Этому условию соответствуют все строки, содержащие DS:.

Для всех этих строк переменная cувеличивается, а затем берется модуль count. Поскольку у нас нет явного определения переменной c, она неявно инициализируется значением 0при первом выполнении этого блока кода.

Затем результат добавляется с помощью 1и присваивается $NF. Здесь NF— количество полей в строке, разделенных разделителями полей. Разделителем полей по умолчанию(FS)является пробел. Обратите внимание, что пробел как FSявляется особым случаем в awk, и несколько последовательных пробелов будут рассматриваться только как один разделитель полей.

Поскольку NF— это количество полей, $NFотносится к последнему полю. В этом случае присваивание $NFприводит к замене 1значением, полученным путем вычисления ((c++ % count) + 1).

Конечная 1обозначает истинное условие, а кодовый блок после него опускается. Эффект этого является неявным print, когда условие истинно. Поскольку 1всегда истинно, действие всегда выполняется и печатается текущая строка,возможно после трансформации последнего блока.

Чтобы лучше понять процесс, мы можем отслеживать выполнение awk. awkимеет неявный цикл, который перебирает строки ввода.

  • 1-я строка:cнеявно назначается 0. c++все еще 0, но это изменяет cна 1, (c++ % count)равно 0по модулю 3, так что 0, ((c++ % count)+1)это 1, назначение изменяет последнее поле (, который также является последним символом в этом случае от )до 1, и окончательный 1печатает эту строку, так что мы получаем DS: 1.

  • 2-я строка:cтеперь 1. ((c++ % count)+1)это 2и меняется cк 2. Последнее поле изменяется на 2и печатается, поэтому мы получаем DS: 2.

  • 3-я строка :Аналогично ((c++ % count)+1)заменяет cна 3и оценивается как 3. Получаем DS: 3.

  • 4-я строка :Вот когда %действительно вступает в силу. (c++ %count)равно 3по модулю 3, что равно 0, и ((c++%count)+1)снова оценивается как 1. Получаем DS: 1.

И так далее. Вот как это работает. Обратите внимание, что если есть строки без DS:, они печатаются дословно.

1
28.01.2020, 05:19

Теги

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