Глядя на ваше сообщение об ошибке, очевидно, что вы использовали не 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
более или менее не поддерживается.
Используйте:
[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=
.
Если ваше приложение представляет собой скрипт Python, вам также необходимо установить
Environment=PYTHONUNBUFFERED=1
В противном случае вы не увидите никаких сообщений в журнале, пока буфер не будет очищен.