Скрипт systemd: назначение вне раздела; Отсутствует '='

У меня есть следующий (анонимный) сценарий systemd с именем tomcat-autostart.service, который хранится в "/usr/lib/systemd/system/tomcat-autostart.service"

[Unit]
Description=Tomcat Autostart Script
Requires=var-www-projects.mount
After=var-www-projects.mount

[Service]
Type=forking
ExecStart=/usr/bin/tomcat-autostart start
ExecStop=/usr/bin/tomcat-autostart stop

[Install]
WantedBy=multi-user.target

После запуска

sudo systemctl daemon-reload
sudo systemctl enable tomcat-autostart.service

Я получаю сообщение об ошибке:

Failed to execute operation: Bad message

И я также получаю следующий вывод в /var/log/messages

Feb 17 11:29:53 cheese systemd: [/usr/lib/systemd/system/tomcat-autostart.service:1] Assignment outside of section. Ignoring.
Feb 17 11:29:53 cheese systemd: tomcat-autostart.service lacks both ExecStart= and ExecStop= setting. Refusing.
Feb 17 11:29:53 cheese systemd: [/usr/lib/systemd/system/tomcat-autostart.service:1] Missing '='.
Feb 17 11:29:53 cheese systemd: [/usr/lib/systemd/system/tomcat-autostart.service:1] Missing '='.

У меня это работало некоторое время, затем я добавил несколько комментариев над строкой [Unit], и оно перестало работать. Затем я удалил комментарии и, возможно, непреднамеренно изменил что-то еще в сценарии, и после этого мне не удалось заставить его работать снова.

Кажется, это радует его собственным противоречием. Первое сообщение об ошибке говорит о том, что в первой строке есть назначение ("[Unit]"), а в третьем сообщается, что в назначении отсутствует знак "=". Таким образом, "Unit" - это присваивание, за исключением того, что оно отсутствует, потому что отсутствует знак "=".

Поиск этой проблемы определил, что второе сообщение об ошибке является прямой причиной других. Поскольку он игнорирует заголовки разделов, он никогда не читает объявления ExecStart и ExecStop. Если я смогу решить первое и третье сообщения об ошибке, я смогу

Какова реальная проблема с моим сценарием? Выполнение 'sudo /usr/bin/tomcat-autostart start' завершается успешно, как и ожидалось, и наиболее распространенная причина появления этого сообщения об ошибке в Интернете - сценарий не использует абсолютные пути (что я и делаю в этом случае)

2 ответа

Я решил эту проблему. Оказывается, кодировка файла была изменена, когда я добавил комментарии (превратив файл из кодировки utf-8 в кодировку utf-16). Я предполагаю, что systemd не поддерживает utf-16 и интерпретировал его как ASCII (или что-то еще). Смена кодировки обратно на UTF-8 позволила сценариям автозапуска снова начать работать.

Добро пожаловать в Stackru.

Ваш systemd Сценарий выглядит отлично. Также, когда я копирую / вставляю его в свою систему и запускаю systemd-analyze verify, это не генерирует эту ошибку - я получаю только ошибки о путях к файлам, которые не существуют в моей системе, но должны существовать в вашей:

systemd-analyze verify ~/tmp/t.service
t.service: Failed to create t.service/start: Unit var-www-projects.mount not found.
t.service: Command /usr/bin/tomcat-autostart is not executable: No such file or directory
t.service: Command /usr/bin/tomcat-autostart is not executable: No such file or directory

Я думаю, что ошибка была потеряна в переводе, когда вы анонимизировали ее. Бежать systemd-analyze verify /usr/lib/systemd/system/tomcat-autostart.service и подтвердите ошибки, которые вы получаете из вашего фактического файла.

Кроме того, файлы, которые вы изменяете, должны быть в /etc/systemd/system, Файлы в /usr/lib предназначены только для управления пакетами, которые вы устанавливаете.

Если ваш файл в /etc/systemd/system имеет имя в виде параллельного файла в /usr/lib/systemd/system каталог, он переопределит его.

В моем случае файл имел метку порядка байтов - BOM (шестнадцатеричные байты EF BB BF в начале файла, чтобы идентифицировать файл UTF-8).

Вы можете проверить это, используя cat -A tomcat-autostart.service(печать A LL символов, включая специальные / невидимых) или с использованием hexdump -C tomcat-autostart.service(печать в C аноническом шестнадцатеричном формате + отображение ASCII).

Удалите эти символы с помощью вашего любимого текстового редактора (например, sed) или конвертер вроде dos2unixкак предложил Digit Cruncher.

Другие вопросы по тегам