systemd StandardOutput в файл _и_ в журнал?

systemd StandardOutput в файл _и_ в журнал?

Я регулярно выполняю долгосрочную (~5 дней) программу обработки данных. Я использую Ubuntu и запускаю команду с помощью systemd transient task через systemd-run --unit data_import /path/to/my-script.sh. Работает хорошо. Я могу посмотреть стандартный вывод журнала скрипта с помощью journalctl -u data_import.service.

Я хотел бы, чтобы stdout (& stderr) из скрипта сохранялся в файл, а также в журнал systemd. Я вижу, что это systemd-run --unit data_import -p "StandardOutput=file:/path/my-logging-file.txt …сохранит stdout в этот файл. Однако он не будет записываться в journald. Я пытался указать аргумент дважды systemd-run -p "StandardOutput=file:/path/my-logging-file.txt" -p "StandardOutput=journal" …, но это не сработало.

Возможно ли с помощью systemd записать stdout в файл?ив журнал systemd? (аналогично для stderr?)

Ubuntu 18.04 и 20.04, systemd v250 или v245 и т. д.

решение1

Думаю, мы не могли не найти одну ссылкуhttps://www.freedesktop.org/software/systemd/man/systemd.exec.html#StandardOutput=что может помочь (обратите внимание наБерет один изнить).

Управляет тем, к какому файловому дескриптору 1 (stdout) подключены выполняемые процессы.Берет один изinherit, null, tty, journal, kmsg, journal+console, kmsg+console, file:path, append:path, truncate:path, socket или fd:name.

Хотя мы можем изменить стандартный тип вывода по умолчанию.

решение2

Вы пробовали создать файл журнала прямо в вашем скрипте и добавлять информацию каждый раз, когда это необходимо? Я знаю, что это довольно очевидно, но мне интересно, сработает ли это.

Например, с помощью bash, прямо в вашем скрипте:

# Declaration
LOG=/var/log/your_script_log.log
# Or with a date 
TODAY=$(date +%Y-%m-%d)
LOG=/var/log/your_script_log-$(TODAY).log
...
# Beginning of main script
echo -e $TODAY > $LOG
...
# Every time needed during the script
if [[ $state == *"stopped"* ]];then
    echo "A very important message." >> $LOG
...

При использовании такой системы вам придется настроить logrotate, чтобы избежать сотен журналов через несколько месяцев.

решение3

@Amandasaurus Хорошо, я понял. Тогда я рекомендую вам создать файл службы в "/etc/systemd/system/[Имя вашего скрипта].service" и добавить минимально необходимую информацию:

[Unit]
Description=*The name of your script*

[Service]
ExecStart=/path/to/my-script.sh
ExecStop=/bin/kill $MAINPID
KillMode=process
Type=simple
StandardOutput=/path_to_log/service.log
StandardError=/path_to_log/service_error.log

[Install]
WantedBy=multi-user.target

И затем настройте logrotate или добавьте "append" к аргументу StandardOutput. После этого сделайте следующее:

systemctl daemon-reload
systemctl start *The name of your service*

Чтобы включить запуск при загрузке вашей службы:

systemctl enable *The name of your service*

Источник аргумента журнала в служебном файле:здесь

Связанный контент