Вот откровенно ужасный вариант сшивания разных инструментов из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
все равно отбрасывает выходное значение.
В этом подходе есть (как минимум )два оставшихся недостатка:
cmd1
, уменьшая его до логического значения true/false. Если код выхода имеет смысл, он потерян. Можно было бы сохранить код в файл в команде sh
и повторно -загрузить его позже(ifne -n sh -c 'read code или что-то в этом роде ), если это необходимо.
cmd1
когда-нибудь удастся добиться успеха без результата, все равно все развалится. Плюс, конечно же, несколько довольно -редких команд, собранных вместе, тщательно процитированных, с неочевидным -значением.
Эта страница появляется в результатах поиска со ссылкой на ошибку директивы остановки, относящуюся к 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
Это, наконец, достигло моей цели... И без сообщений об ошибках/предупреждений.
Надеюсь, это поможет.