rsyslogd[xxxx] :ошибка при обработке конфигурации :STOP сопровождается недостижимыми операторами

Вот откровенно ужасный вариант сшивания разных инструментов изmoreutils:

chronic sh -c '! { echo 123 ; false ; }' | mispipe 'ifne -n false' 'ifne echo ok'

Это все еще не совсем то, что вам нужно :он возвращает 1 в случае неудачи и ноль в противном случае. Однако он не запускает вторую команду до тех пор, пока первая не завершится успешно, он возвращает неудачный или успешный код в зависимости от того, сработала первая команда или нет, и не использует файлы.

Более общая версия:

chronic sh -c '! '"$CMD1" | mispipe 'ifne -n false' "ifne $CMD2"

Это объединяет три инструмента moreutils:

  • chronicспокойно выполняет команду, если она не завершается ошибкой. В этом случае мы запускаем оболочку для запуска вашей первой команды, чтобы мы могли инвертировать результат успеха/неудачи :, он будет запускать команду тихо , если она не удалась, и печатать вывод в конец, если это удается.
  • mispipeсоединяет две команды вместе, возвращая статус выхода первой. Это похоже на эффект set -o pipefail. Команды предоставляются в виде строк, чтобы их можно было отличить друг от друга.
  • ifneзапускает программу, если стандартный ввод не пуст -или пуст с -n. Мы используем его дважды:

    • Первый — ifne -n false. Это запускает falseи использует его в качестве кода выхода, если и только если ввод пуст (, что означает, что chronicсъел его, что означает, что cmd1не удалось ).

      Когда ввод не пуст, он не запускается false, пропускает ввод, как cat, и выходит с 0. Вывод будет передан в следующую команду с помощью mispipe.

    • Второй — ifne cmd2. Это запустит cmd2, если вход не является -пустым . Эти входные данные являются выходными данными ifne -n false, которые будут не -пустыми точно в тот момент, когда выходные данные chronicне были -пустыми,что происходит, когда команда выполнена успешно.

      Когда вход пуст, cmd2никогда не запускается, а ifneвыходит из нуля. mispipeвсе равно отбрасывает выходное значение.


В этом подходе есть (как минимум )два оставшихся недостатка:

  1. Как уже упоминалось, он теряет фактический код выхода cmd1, уменьшая его до логического значения true/false. Если код выхода имеет смысл, он потерян. Можно было бы сохранить код в файл в команде shи повторно -загрузить его позже(ifne -n sh -c 'read code или что-то в этом роде ), если это необходимо.
  2. Если cmd1когда-нибудь удастся добиться успеха без результата, все равно все развалится.

Плюс, конечно же, несколько довольно -редких команд, собранных вместе, тщательно процитированных, с неочевидным -значением.

0
03.09.2020, 12:39
1 ответ

Эта страница появляется в результатах поиска со ссылкой на ошибку директивы остановки, относящуюся к rsyslog. Публикация ответа в надежде облегчить решение для тех, кто последует.


Ранджит,

Судя по вашему конфигурационному файлу, вы пытаетесь добиться того же результата, над которым работал я:

  • Получение сообщений удаленного системного журнала, которые записываются в локальные файлы журнала с соответствующими именами на основе определенного шаблона, и
  • Продолжение записи локальных сообщений в стандартные локальные файлы журналов, как указано в оставшейся части файла конфигурации.

На основании вышеизложенного мой ответ таков.

Да, директива stop является безусловной и приводит к игнорированию остальной части файла конфигурации (с созданием сообщения об ошибке, на которое вы ссылались ). Я обнаружил, что использование «наборов правил» позволяет достичь цели без ошибок.

Я использую Debian 10.8 и [rsyslog] v8.1901.0 -1.

Соответствующие части моего [rsyslog.conf]:

В разделе «Модули»:

# provides UDP syslog reception
module(load="imudp")
input(type="imudp" port="514" ruleset="remote")  # "remote" ruleset defined below...

# provides TCP syslog reception
module(load="imtcp")
input(type="imtcp" port="514" ruleset="remote") # "remote" ruleset defined below...

Я знаю, что в документации указано, что набор правил должен быть определен до связывания ... На момент написания этой статьи это не похоже на правду в моем случае.

В разделе «Правила»:

$template Incoming-logs,"var/log/%HOSTNAME%/%PROGRAMNAME%.log
ruleset(name="remote"){
action(type="omfile" dynafile="Incoming-logs")
}               # This ruleset is used above where it is bound 
                #  to the TCP/UDP listener definitions

Это, наконец, достигло моей цели... И без сообщений об ошибках/предупреждений.

Надеюсь, это поможет.

1
18.03.2021, 23:07

Теги

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