Install4J: как перезапустить несколько служб после их обновления в автоматическом режиме без запроса пароля у пользователя

Я использую Install4J для установки своего приложения, состоящего из двух служб (двух средств запуска) из одного JAR-файла. Я хочу обновить свое приложение в автоматическом режиме, затем остановить обе службы и запустить обе службы, не запрашивая у пользователя пароль администратора. Обе службы изначально запускаются с правами root, и с помощью команды «ps» я проверил, что они работают с правами root, когда одна из служб вызывает метод ApplicationLauncher.launchApplication Install4J Integration API.

Мой Install4J Updater может загрузить новую версию и остановить вызывающую программу запуска, но проблема, которую я вижу, заключается в том, что я не могу остановить вторую (не вызывающую программу запуска) и не могу запустить вызывающую программу запуска. .

Эта ошибка очень странная, потому что я заметил, что если я остановлю обе службы, а затем запущу обе службы, используя

sudo <ServiceLauncher1> stop
sudo <ServiceLauncher2> stop
sudo <ServiceLauncher1> start
sudo <ServiceLauncher2> start

..все работает. Он загружает обновление, останавливает обе службы, а затем запускает обе службы без проблем. Я заметил (в OSX), что значок запуска для автоматического обновления также отличается (черный значок терминала (не работает) и белый значок Java (работает).

Я был бы очень признателен за помощь в этом. Спасибо!


person Sydney    schedule 24.09.2014    source источник
comment
Это все на Mac OS X? Установщик обновлений должен остановить службы. Если он работает как root, я не понимаю, почему он не может этого сделать. Вы можете отправить лог-файл программы установки обновлений на [email protected]?   -  person Ingo Kegel    schedule 25.09.2014
comment
Да, проблема, которую я описал, связана с Mac OS X, но мне нужно решение, которое работает как для Mac OS X, так и для Windows. Где я могу найти файл журнала программы установки обновлений? Я вижу файл install.log в каталоге .install4j, но больше ничего похожего нет.   -  person Sydney    schedule 25.09.2014
comment
Программа установки обновления также скопирует свой файл журнала в .install4j\installation.log, если действие «Установить файлы» выполнено успешно. Вы можете передать аргументы -Dinstall4j.keepLog=true -Dinstall4j.alternativeLogfile=[path to log file] для записи файла журнала по определенному пути. Вы можете добавить эти параметры в действие под названием «Установить аргументы установщика» в приложении установщика обновления в вашем проекте.   -  person Ingo Kegel    schedule 25.09.2014
comment
В приложении «Обновление с автоматической проверкой версии» нет действия «Установить файлы» — только в приложении «Установщик». Это правильно? В действии «Установить аргументы установщика» я изменил запись «Сценарий» на return new String[] {"-q", "-wait", "20", "-dir", installationDirectory, "-Dinstall4j.keepLog=true", "-Dinstall4j.alternativeLogfile=<myhomedirectory>/altinstall.log"};, но такого журнала не получаю.   -  person Sydney    schedule 25.09.2014
comment
Да, приложение обновления загружает установщик обновлений и запускает его. Файл журнала будет создан только после запуска загруженного установщика обновления.   -  person Ingo Kegel    schedule 26.09.2014
comment
Я действительно думаю, что это связано с разрешениями. Если я запускаю установщик обновлений с sudo <install_dir>/.install4j/AutoUpdater, все работает нормально. Почему моя служба (которая работает как root в соответствии с ps) не может делать то же самое, что и я, вызывая программу установки обновлений с моего локального терминала с помощью sudo?   -  person Sydney    schedule 30.09.2014
comment
Возможно, дело не в выполнении установщика обновлений. Приложение установки программы обновления вообще работает успешно? Вы можете добавить -Dinstall4j.keepLog=true -Dinstall4j.alternativeLogfile=<myhomedirectory>/altinstall.log к свойству параметров виртуальной машины приложения обновления, чтобы получить файл журнала этого.   -  person Ingo Kegel    schedule 30.09.2014
comment
Спасибо @IngoKegel за этот совет. Наконец-то я могу войти в систему. В журнале я вижу, что мой модуль обновления завершает работу после действия Shutdown calling launcher. Ни одно из действий, следующих за этим действием, никогда не выполняется. Поправьте меня, если я ошибаюсь, но я понимаю, что действие Run executable or batch file, которое запускается после этого и выполняет ${installer:updaterDownloadFile}, запускает приложение Installer, которое эффективно помещает все файлы в нужные места и перезапускает службы. Это правильно? Если да, то как может запуститься программа установки, если действие завершения работы сначала убивает программу обновления?   -  person Sydney    schedule 01.10.2014
comment
Да я вижу. Пожалуйста, попробуйте удалить действие «Завершение работы при вызове программы запуска» или установите для его выражения условия значение !context.isUnattended(). Для запуска службы это не нужно, потому что службы останавливаются установщиком.   -  person Ingo Kegel    schedule 01.10.2014
comment
Я приближаюсь. Удаление Shut down calling launcher приводит к запуску приложения Installer, которое затем запускает приложение Uninstaller, которое останавливает службы. Проблема, которую я вижу сейчас, заключается в том, что когда программа удаления выполняет Stop a service для службы, которая первоначально запустила программу обновления, программа удаления останавливается с кодом ошибки 143, который затем останавливает программу установки и, в конечном итоге, останавливается все обновление. Я пытался выполнить это действие в других местах программы установки и обновления, но мне кажется, что я не могу перезапустить службу, вызвавшую программу обновления, или все останавливается.   -  person Sydney    schedule 02.10.2014
comment
Хорошо, так что это может быть невозможно. Вероятно, вам нужна еще одна служба, которая никогда не останавливается, единственная задача которой — запустить программу обновления.   -  person Ingo Kegel    schedule 02.10.2014
comment
Спасибо за помощь!   -  person Sydney    schedule 04.10.2014


Ответы (1)


В моем случае (две службы) установщик обновлений запускается как дочерний процесс службы, которая его запустила. Из-за того, что часть процесса обновления требует, чтобы обе службы были остановлены, а затем запущены, проблема заключается в том, что остановка вызывающей службы приводит к уничтожению всего установщика обновлений.

Мое решение состоит в том, чтобы каждая служба останавливала/запускала другую с помощью двух приложений обновления в Install4J.

Сервис №1 --> Обновление №1:

  1. Проверить наличие новой версии
  2. Скачать новую версию
  3. Установить новую версию
  4. Остановить службу №2
  5. Запустите службу № 2 (на данный момент служба № 2 полностью обновлена ​​и работает)
  6. Уведомить службу № 2 для выполнения обновления службы № 1

Сервис №2 --> Обновление №2:

  1. Остановить службу №1
  2. Запустите службу №1 (на данный момент служба №1 полностью обновлена ​​и работает)
person Sydney    schedule 04.10.2014