Как выполнить печать в журнал из генератора среды systemd?

Цикл for name in...передает статус выхода последней выполненной команды.

Когда вы breakвыполняете цикл, сама команда breakимеет статус выхода 0 по умолчанию, который, следовательно, передается for, что делает ваш &&тест после doneравным к true.

Один из способов обойти это, как вы сказали в своем -ответе. Это хороший и чистый вариант, и он хорошо работает с любой оболочкой, совместимой с POSIX.

Но у него есть один недостаток: будучи вспомогательной -оболочкой,он не полностью разделяет свою Execution Environment1 со своей "внешней" оболочкой. Он наследует его в начале выполнения, но не «распространяет» его обратно на своего «внешнего» родителя при завершении выполнения, что означает, например, что любая переменная, установленная или измененная в цикле, не будет видна после вне цикла.

Говоря о Bash, есть альтернатива :вы можете избежать оболочки sub -и по-прежнему использовать break, заставляя ее сбой, передавая ей аргумент -1, потому что -1всегда является недопустимое количество циклов для выхода. Bash отобразит для этого сообщение об ошибке, но вы можете отключить его, перенаправив на 2>/dev/null.

Однако обратите внимание, что такое поведение не совсем совместимо с POSIX, поскольку breakсчитаетсяспециальной сборкой -ви «специальной встроенной -в», вызывающей ошибку . ] должен выйти из не -не интерактивной оболочки (, например скрипт ).

1 [...]. Изменения, внесенные в среду подоболочки , не могут повлиять на среду выполнения оболочки . [...]

0
28.05.2021, 02:09
1 ответ

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

Однако вы можете вести журнал в буфере журнала ядра (, то есть в буфере dmesg), и ваши сообщения будут импортированы journald вместе со всеми другими сообщениями ядра.

Для этого напишите сообщение на адрес /dev/kmsg, опционально с префиксом важности в стиле ядра -:

.
echo "foobar-generator[$$]: Something's going on" > /dev/kmsg
echo "<4>foobar-generator[$$]: Warning, an error is about to occur" > /dev/kmsg
echo "<3>foobar-generator[$$]: An error just occured" > /dev/kmsg

Серьезность можно указать с помощью префиксов " <n>", также как и в системном журнале. (Например, 3 — это ЖУРНАЛ _ОШИБКА, 4 — это ЖУРНАЛ _ПРЕДУПРЕЖДЕНИЕ, 7 — это ЖУРНАЛ _ОТЛАДКА. )И да, вам нужно добавить метку в стиле syslog -"process[pid] :".

1
28.07.2021, 11:28

Теги

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