Есть ли способ перенаправить все stdout и stderr в системный журнал изнутри скрипта?

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

echo 'hello' | systemd-cat -t myscript -p emerg

Есть ли способ перенаправить все сообщения в journald, даже те, которые были сгенерированы другими командами? Подобно..

exec &> systemd-cat

Обновить:

Некоторый частичный успех. Попробовал предложение Inian из терминала.

~/scripts/myscript.sh 2>&1 | systemd-cat -t myscript.sh

и это сработало, stdout и stderr были направлены в журнал systemd. Любопытно,

~/scripts/myscript.sh &> | systemd-cat -t myscript.sh

не работал в моем терминале Bash.

Мне все еще нужно найти способ сделать это в моем скрипте, когда другие программы вызывают мой скрипт.

Я старался..

exec 2>&1 | systemd-cat -t myscript.sh

но это не работает

Обновление 2:

От терминала

systemd-cat ~/scripts/myscript.sh

работает. Но я все еще ищу способ сделать это из сценария.

3 ответа

Решение

Труба для systemd-cat это процесс, который должен выполняться одновременно с вашим сценарием. Bash предлагает средства для этого, хотя он не переносим в POSIX sh,

exec > >(systemd-cat -t myscript -p emerg) 2>&1

>(command) Подстановка процесса запускает другой процесс и возвращает псевдо-имя файла (что-то вроде /dev/fd/63) который вы можете перенаправить в. Это в основном обертка для mkfifo хаки, которые вы могли бы сделать, если вы хотите перенести это на POSIX sh,

Если ваш сценарий не является сценарием оболочки, а является другим языком программирования, который позволяет загружать модули расширения, связанные с , есть другой способ. Есть функция библиотекиsd_journal_stream_fdчто вполне соответствует поставленной задаче. Вызов его из самого bash (в отличие от какого-то дочернего) кажется в лучшем случае трудным. Например, в Python он доступен как . По сути, эта функция подключает сокет потока домена unix и сообщает, какие данные передаются (например, приоритет). Сложность с оболочкой здесь заключается в том, чтобы заставить ее подключать сокет домена unix (в отличие от подключения в дочернем).

Ключевую идею этому ответу высказал пользователь Freenode / libera.chat. .

Очевидно, и по причинам, которые мне не известны, вы не можете действительно перенаправить все stdout и stderr в journald из скрипта, потому что он должен быть передан по каналу. Чтобы обойти это, я обнаружил уловку, которую люди использовали с логгером syslog, который работает так же.

Вы можете обернуть весь свой код в функцию, а затем передать функцию в systemd-cat.

#!/bin/bash

mycode(){
  echo "hello world"
  echor "echo typo producing error"
}
mycode | systemd-cat -t myscript.sh

exit 0

А потом искать журналы журналов..

journalctl -t myscript.sh --since yesterday

Я разочарован, что нет более прямого способа сделать это.

Другие вопросы по тегам