systemd: как перенаправить stdout в файл журнала

Глядя на ваше сообщение об ошибке, очевидно, что вы использовали не tar, а gtar.

В общем, это может помочь разобраться:

  • tar обычно всегда нуждается в аргументе файла. Если он отсутствует, то он будет читать/записывать с/на устройство реальной ленты системы по умолчанию. В 1982 году star изменил этот параметр на использование stdin/stdout по умолчанию, и недавно этому примеру последовали некоторые другие реализации tar (например, gtar).

  • tar не реализует ведущую - опцию, которая называется буквами ключей в случае команды tar. В некоторых реализациях позже добавлена - в качестве буквы ключа no-op для удобства пользователей, но на это нельзя положиться.

  • То, как tar разбирает свои аргументы (в частности, аргумент архивного файла), очень рискованно. Я видел много tar-архивов, которые уничтожили один из файлов, которые должны быть в архиве, потому что соответствующий аргумент файла был взят как tar-архив. По этой причине звезда (если называется нативно звезда ) не позволяет соединить "f" с другими опциями. Если star называется tar, то он реализует совместимость командной строки с tar, но при этом обрабатывает аргумент для буквы ключа "f" по-другому: аргумент разрешен только в том случае, если он относится к реальному файлу устройства или когда (в режиме записи) этого файла еще не существует.

Я рекомендую избегать рискованной исходной tar-командной строки и вместо этого использовать современный безопасный синтаксис командной строки, который вы получаете со звездой .

Из-за проблемного синтаксиса командной строки tar в начале 1990-х годов существовали так называемые tar войны . В результате была создана и стандартизирована программа pax (по-латински "мир" в дегтярных войнах). Однако pax не приобрела популярности, так как ее синтаксис менее рискованен, но и менее интуитивен, чем синтаксис смол. Другая проблема может заключаться в том, что gpax более или менее не поддерживается.

3
05.12.2017, 15:11
2 ответа

Используйте:

[Unit]
Description=My application

[Service]
ExecStart=/usr/bin/java -jar myapp.jar
Type=simple
User=photo
StandardOutput=file:/var/log/logfile

как описано здесь:https://www.freedesktop.org/software/systemd/man/systemd.exec.html#StandardOutput=

Обратите внимание, что таким образом содержимое файлов журналов будет перезаписываться при каждом перезапуске службы. StandardOutput/ErrorДирективы systemd не поддерживают добавление файлов.

Если вы хотите вести журнал файлов между перезапусками службы и просто добавлять в него новые строки журнала, используйте вместо этого:

[Unit]
Description=My application

[Service]
ExecStart=/usr/bin/sh -c 'exec /usr/bin/java -jar myapp.jar'
Type=simple
User=photo

execозначает, что программа оболочки будет заменена программой /bin/javaпосле настройки перенаправления без ветвления. Так что не будет никакой разницы от запуска /bin/javaсразу после ExecStart=.

18
27.01.2020, 21:25

Если ваше приложение представляет собой скрипт Python, вам также необходимо установить

Environment=PYTHONUNBUFFERED=1

В противном случае вы не увидите никаких сообщений в журнале, пока буфер не будет очищен.

5
09.09.2020, 20:09

Теги

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