Есть ли способ перенаправить все 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 он доступен как
Ключевую идею этому ответу высказал пользователь 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
Я разочарован, что нет более прямого способа сделать это.