Intereting Posts
Как программно проверить, поддерживает ли терминал курсив? Что происходит с запросами к службе, которая остановлена ​​с помощью SIGSTOP Как программировать Python так, чтобы он выводился на все терминалы в Linux Появляется ли ваш пароль SSH при попытке подключиться к неправильному серверу? Извлечь несколько страниц из файла djvu Не открывайте новый экземпляр приложения, если он уже открыт в другой рабочей области в Mint Проблемы с серверами RAID (на FreeNAS) Как загрузить Debian на USB-накопитель в Windows Привязки клавиш xmodmap сбрасываются при открытии новой вкладки в оболочке UNIX для печати содержимого из файла .gz Рассчитать количество дней оплаты Где найти статистику по iowait для одного процесса (в виде файла) повторная замена расширения истории bash для всех матчей Простое перемещение каталога внутри другого с помощью mv Поведение dpkg -S, когда аргумент начинается с косой черты

systemd не может найти файл PID после запуска оболочки YAJSW

У меня есть сценарий запуска systemd для службы разветвления (назовем его foo ), основанный на YAJSW (еще один Java Service Wrapper) . Соответствующая часть файла .service выглядит так:

 ExecStart=/opt/foo/startup.sh ExecStop=/opt/foo/shutdown.sh Restart=always Type=forking PIDFile=/opt/foo/wrapper.pid 

Сценарий startup.sh отвечает за запуск оболочки YAJSW. Файл конфигурации YAJSW настроен так, что его PID записывается в файл во время запуска:

  wrapper.pidfile = /opt/foo/wrapper.pid 

Таким образом, если процесс оболочки умирает (по любой причине), systemd должен вызвать его, что является желаемым поведением. Я проверил, что эта конфигурация работает правильно, но в journalctl показывается странная строка:

 foo.service: PID file /opt/foo/wrapper.pid not readable (yet?) after start: No such file or directory 

Странно, но systemctl status foo правильно показывает основной PID:

 foo.service ... Main PID: 12313 (java) 

Я делаю что-то не так или это ошибка в одном из компонентов программного обеспечения? Я использую Ubuntu 16.04.3 LTS, версия ядра 4.4.0, версия systemd 229.4. Любая помощь будет оценена.

    служба разветвления […] YAJSW (еще одна shell Java-службы) […] ExecStart=/opt/foo/startup.sh […] ExecStop=/opt/foo/shutdown.sh […] PID записывается в файл [ …]

    Такого рода вещи свойственны Java и, по-видимому, вообще системам Oracle; но также совершенно ненужно. Вам не нужны Менеджеры сервисов Бедного Человека, написанные либо в скрипте оболочки, либо в Java, работающие под фактическим менеджером сервисов. PID-файлы – это крайне опасный и шаткий механизм. Вам не нужны сценарии startup.sh и shutdown.sh и они в конечном итоге проталкивают фактический процесс обслуживания вниз по дереву процессов до бесполезного конца. Вам не нужен дополнительный файл конфигурации YAJSW. Вам не нужен сложный и уникальный механизм ведения журнала, основанный на буферизации стандартного вывода в память.

    Ваш сервисный процесс должен напрямую управляться фактическим сервисным менеджментом, и он не будет использовать протокол готовности разветвления systemd, потому что на самом деле его практически никто не использует. Не используйте сценарии оболочки оболочки для запуска сервисных менеджеров Бедного человека. Не используйте PID-файлы. Любые оболочки оболочки сценариев должны загружать цепочку, а не fork. Ваш файл конфигурации – это файл системного модуля systemd, а не какой-либо другой файл конфигурации. Ваш механизм регистрации – это тот, который поставляется с сервисным управлением, которое фиксирует стандартный вывод и стандартную ошибку и записывает их данные в файл.

    дальнейшее чтение

    • Джонатан де Бойн Поллард (2015). Обертывание Apache Tomcat во многих бессмысленных дополнительных слоях Системный Дом ужасов.
    • Джонатан де Бойн Поллард (2015). Системный Дом Ужаса . Часто задаваемые ответы.
    • Как избежать пометки / usr / bin / env в журналах systemd как исполняемого файла
    • настроить Java-демон с помощью systemd
    • https://unix.stackexchange.com/a/434726/5132
    • Джонатан де Бойн Поллард (2016). Не используйте logrotate или newsyslog в этом веке. , Часто задаваемые ответы.

    Я бы не сказал, что это ошибка, а скорее проблема сложности. В настоящее время у вас есть эта цепочка, просто для запуска и управления вашим приложением:

     systemd -> startup.sh -> YAJSW -> actual app 

    Я не знаю точно, что делают startup.sh и YAJSW, но хотелось бы попытаться упростить управление:

     systemd -> actual app 

    Тогда, если возникнут проблемы с руководством, будет гораздо проще рассуждать о том, что произошло.

    Я рекомендую упростить ситуацию за счет максимального использования systemd для управления и сведения к минимуму или исключения того, что делают ваши скрипты и YAJSW.