Передать вывод демона функции

Вы можете попробовать это в файле своего служебного модуля:

ExecStartPost=/bin/sh -c 'tail -f /path/to/log | systemd-cat'

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

Насколько мне известно, нет встроенной функции для отслеживания файла журнала. Это то, что могут делать другие системы журналирования, такие как rsyslog .

1
07.07.2016, 14:08
1 ответ

Рассмотрим следующий сценарий оболочки:

function thetee {
    tee data.out
}

function thepipe {
    echo "Hello!"
}

while true; do
    echo "Hi there!"
done | thetee | thepipe

echo "Done."

Цикл while - это генератор неограниченного количества строк с текстом «Привет! ! ».

Запуск:

$ sh script.sh
Hello!
Done.

Затем посмотрите на количество строк в data.out :

$ wc -l data.out
     274 data.out

Еще раз:

$ sh script.sh
Hello!
Done.

$ wc -l data.out
     236 data.out

Проблемы:

  1. Бесконечный цикл не бесконечен.
  2. Количество выходных строк различается между запусками.

Причины:

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

  2. Количество строк, фактически записанных в data.out , зависит от того, как быстро оболочка сможет запустить конвейер и как быстро функция thepipe выполнит свою работу и завершит работу. .

В вашем случае это происходит так быстро, что никакой ввод от генератора данных ( mosquitto_sub ) не может поступить в функцию tee .

Решение:

Сделать так, чтобы функция thepipe фактически потребляла входные данные :

function thepipe {
    echo "Hello!"
    cat
}

Это заставит код в моем примере вывести одиночное «Hello!». с последующим бесконечным "Привет!" (которые также сохраняются в data.out ). echo в конце никогда не будет выполняться.

Следовательно:

Измените определение вашей функции testPipe аналогичным образом. Например:

function testPipe(){
        echo "va"
        cat
}

Это приведет к потреблению ввода и отправке его на следующий этап конвейера или, если он находится в конце конвейера, туда, куда стандартный вывод будет перенаправлен после него (с строка, содержащая строку va в начале потока).

3
27.01.2020, 23:35

Теги

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