
Я регулярно выполняю долгосрочную (~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*
Источник аргумента журнала в служебном файле:здесь