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]
У меня есть основания полагать, что рабочей awk
командой является
awk -v count=3 '/DS:/ {$NF=((c++ % count) + 1)} 1' input
где input
— входной файл. Также я думаю, что во входном файле должно быть 9 строк вместо 7, чтобы сгенерировать вывод, указанный в вопросе.
Вот как это работает.
Во-первых, опция -v count=3
назначает 3
переменнойawk
count
. Если бы это было написано так, как написано в вопросе(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:
, они печатаются дословно.