Есть ли способ перенаправить все stdout и stderr в системный журнал изнутри скрипта? - PullRequest
0 голосов
/ 28 января 2019

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

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

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

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

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

Ответы [ 2 ]

0 голосов
/ 29 января 2019

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

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

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

0 голосов
/ 29 января 2019

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

Вы можете заключить весь свой код в функцию и затем направить функцию в 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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...