Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Как перезапустить windows-службу из программы на java? / 25 сообщений из 66, страница 1 из 3
26.12.2017, 16:12
    #39576238
MaxLich
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как перезапустить windows-службу из программы на java?
Здравствуйте. Появилось необходимость из программы, написанной на джаве, перезапускать службу windows. Пока только удалось частично этого добиться следующим образом.

1. Написал такой бат-ник:

автор @echo off
chcp 1251
net stop ActiveMQ && net start ActiveMQ



2. Создал ярлык на этот бат-ник, установил у него в свойствах, чтобы он запускался от имени администратора
3. Написал в джаве такой метод:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
public static Process runCommandForApplication(String command) throws Exception {
            if (command == null || command.length() < 1) {
                return null;
            }
            if (isWindows()) {
                command = command.replace('/', '\\');
            } else {
                command = command.replace('\\', '/');
            }
            Process proc = Runtime.getRuntime().exec(command);
            return proc;
        }

        public Process runCommand(Collection command) throws Exception {
            if (command == null || command.size() < 1) {
                return null;
            }
            String[] cmd = new String[command.size()];
            int iCmd = 0;
            for (Iterator<String> iter = command.iterator(); iter.hasNext(); ) {
                String commandPart = iter.next();
                ;
                if (isWindows()) {
                    commandPart = commandPart.replace('/', '\\');
                } else {
                    commandPart = commandPart.replace('\\', '/');
                }
                cmd[iCmd++] = commandPart;
            }
            Process proc = Runtime.getRuntime().exec(cmd);
            return proc;
        }



Вызываю этот метод так:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
    public class View extends JFrame {
        private static final int WINDOW_WIDTH = 600, WINDOW_HEIGHT = 500;
        private static final String FILE_BAT = "F:\\TEMP\\activemq-restart.bat.lnk";
    ...
    //в теле слушателя нажатия на кнопку
    Utils.runCommandForFile(FILE_BAT);
    ...
    }



В итоге он у меня всё делает (пока в скрипте прописал только остановку службы), но перед этим запрашивает в отдельном окне имя администратора и его пароль. И пока не знаю, как сделать, чтобы ввод имени пользователя и его пароля происходил в автоматическом режиме. Пытался сделать это сразу в скрипте, но у меня ничего не получалось.
...
Рейтинг: 0 / 0
26.12.2017, 16:32
    #39576262
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как перезапустить windows-службу из программы на java?
Гошпади, сколько говнокода-то. Вы понимаете что половину вашего кода можно выкинуть и хуже от этого работать не станет?
А вы знаете что разделители пути не ограничиваются символами / и \? И что под виндой можно использовать оба?
А вопрос по-сути к Java отношения не имеет. Windows не даёт простому пользователю исполнять админские действия без подтверждения. Стандартный UAC. Можете своё приложение под админом сразу запустить и тогда вопросов не будет.
Возможно через .lnk выйдет, если вы там укажете всегда запускать под админом, а потом командой (start?) будете запускать именно lnk.
...
Рейтинг: 0 / 0
26.12.2017, 16:52
    #39576284
MaxLich
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как перезапустить windows-службу из программы на java?
Заметил, что выложил код не того метода, вот правильный:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
    public static Process runCommandForFile(String command) throws Exception {
        if (command == null || command.trim().length() < 1) {
            return null;
        }
        command = command.trim();
        File file = new File(command);
        command = file.getAbsolutePath();
        String[] cmd = new String[3];
        String osName = System.getProperty("os.name");
        if (osName.startsWith("Windows 9") || osName.startsWith("Windows ME")) {
            cmd[0] = "command.com";
            cmd[1] = "/C";
            cmd[2] = command;
        } else if (osName.startsWith("Linux") || osName.startsWith("FreeBSD")) {
            cmd[0] = "/bin/sh";
            cmd[1] = "-c";
            cmd[2] = command;
            File shellFile = new File("mpo_shell.sh");
            if (shellFile.exists() && shellFile.canRead()) {
                cmd[1] = "mpo_shell.sh";
            }
        } else {
// default + Windows
            cmd[0] = "cmd.exe";
            cmd[1] = "/C";
            cmd[2] = command;
        }
        Process proc = Runtime.getRuntime().exec(cmd);
        return proc;
    }
...
Рейтинг: 0 / 0
26.12.2017, 17:03
    #39576291
MaxLich
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как перезапустить windows-службу из программы на java?
BlazkowiczГошпади, сколько говнокода-то. Вы понимаете что половину вашего кода можно выкинуть и хуже от этого работать не станет?
А вы знаете что разделители пути не ограничиваются символами / и \? И что под виндой можно использовать оба?
А вопрос по-сути к Java отношения не имеет. Windows не даёт простому пользователю исполнять админские действия без подтверждения. Стандартный UAC. Можете своё приложение под админом сразу запустить и тогда вопросов не будет.
Возможно через .lnk выйдет, если вы там укажете всегда запускать под админом, а потом командой (start?) будете запускать именно lnk.
1. Код не мой, мне его дали (взяли с какого-то американского проекта).
2. Во втором пункте я и писал, что использовал ярлыки и прописывал там запуск с админскими правами.
...
Рейтинг: 0 / 0
26.12.2017, 17:29
    #39576313
andreykaT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как перезапустить windows-службу из программы на java?
Blazkowicz,

агонь. вообще есть константа File.separator ))) как раз то что надо тсу ))

а вообще да. как то видел код навроде:

иф (Файл.сепаратор="/") зен ос.сетТайп("линукс") елс ос.сетТайп("виндовс")

тс, пиши батник, а да ты уже его написал )) и запускай его вот этой командой:

cmd[0] = "cmd.exe";
cmd[1] = "/C";
cmd[2] = command;
}
Process proc = Runtime.getRuntime().exec(cmd);

которую ты в принципе тоже уже написал.

в чем вопрос то? в админских правах? ну так ты можешь происать запуск батника с нужными правами. или самой джаве дать в системе админские права. но тут как бы не вопрос к джаве, а к админам твоей виндовс-машины.
...
Рейтинг: 0 / 0
26.12.2017, 17:37
    #39576322
MaxLich
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как перезапустить windows-службу из программы на java?
andreykaT,
Извините, вы пьяны???) И обратились не ко мне, и пишите так сумбурно. Ещё и как-то невнимательно читаете.))

Я думал о том, что может быть в джаве есть что-то, чтобы сразу запустить команду или программу с правами администратора (и без запроса пароля). Как я писал в своём первом посте, если вешать права на линк и его запускать, то запрашивается логин и пароль. Нужно, чтобы всё происходило в авто-режиме.
...
Рейтинг: 0 / 0
26.12.2017, 17:40
    #39576327
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как перезапустить windows-службу из программы на java?
MaxLichЯ думал о том, что может быть в джаве есть что-то, чтобы сразу запустить команду или программу с правами администратора (и без запроса пароля). Как я писал в своём первом посте, если вешать права на линк и его запускать, то запрашивается логин и пароль. Нужно, чтобы всё происходило в авто-режиме.
В Java ничего такого нет. Фишка чисто виндовая и кросплатформенной Java на неё плевать. Но для виндовс ещё куча способов решить вопрос.
https://stackoverflow.com/questions/11041509/elevating-a-processbuilder-process-via-uac/11042773
https://stackoverflow.com/questions/4662574/how-do-i-elevate-my-uac-permissions-from-java
http://www.naturalborncoder.com/java/2012/08/02/starting-and-stopping-services-from-java/

Ищите инфу про UAC. На чистой Java тут ничего не закодить.
...
Рейтинг: 0 / 0
26.12.2017, 17:41
    #39576328
andreykaT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как перезапустить windows-службу из программы на java?
я то как раз нет а вы - хз. правами в системе заведует только одна программа. и эта программа называется "операционная система", а не та, которую вы пишете. дайте права своей жвм права админа, и никакие пароли у вас требоваться не будут. если не хотите - можете внутри скрипта прописать их.
...
Рейтинг: 0 / 0
26.12.2017, 17:43
    #39576331
Basil A. Sidorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как перезапустить windows-службу из программы на java?
MaxLichЗдравствуйте. Появилось необходимость из программы, написанной на джаве, перезапускать службу windows.Не может быть такой необходимости.
Примите это как данность и озвучьте, пожалуйста, проблему, которую вы решаете, а не способ, который вы придумали.
...
Рейтинг: 0 / 0
26.12.2017, 17:52
    #39576338
andreykaT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как перезапустить windows-службу из программы на java?
у них по ходу месадж брокер периодически зависает и они решили написать патч для программы для перезапуска очереди ))
...
Рейтинг: 0 / 0
26.12.2017, 18:00
    #39576341
Basil A. Sidorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как перезапустить windows-службу из программы на java?
MaxLich
Код: java
1.
        if (osName.startsWith("Windows 9") || osName.startsWith("Windows ME"))

У мелкомягких учитесь? У них в SDK тоже есть условия на "мотороллеры" из прошлого тысячелетия.
...
Рейтинг: 0 / 0
26.12.2017, 18:02
    #39576342
MaxLich
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как перезапустить windows-службу из программы на java?
andreykaT,
в точку. Как раза месседж брокер периодически гонит (к сожалению без внешних ошибок, служба продолжает работать нормально), и нужно его перезапускать, чтобы всё заработало.
...
Рейтинг: 0 / 0
26.12.2017, 18:03
    #39576344
MaxLich
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как перезапустить windows-службу из программы на java?
Basil A. Sidorov,
нет, древний код. Проект начало 2000-ых. Проект называется "Протеже". Какой-то там американский институт разработал. Насколько я знаю, у меня в команде это кто-то взял с сайта оракла по джаве (из примеров).
...
Рейтинг: 0 / 0
26.12.2017, 18:08
    #39576346
andreykaT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как перезапустить windows-службу из программы на java?
MaxLichandreykaT,
в точку. Как раза месседж брокер периодически гонит (к сожалению без внешних ошибок, служба продолжает работать нормально), и нужно его перезапускать, чтобы всё заработало.
решение канеш рабочее, тут не поспоришь, но это, простите, как понос винной пробкой лечить. в принципе, на какое-то время сдержит.
...
Рейтинг: 0 / 0
26.12.2017, 18:11
    #39576348
Basil A. Sidorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как перезапустить windows-службу из программы на java?
MaxLichмесседж брокер периодически гонит (к сожалению без внешних ошибок, служба продолжает работать нормально), и нужно его перезапускать, чтобы всё заработало.1. Озадачьте сисадминов разбором проблем со службой. С вашей стороны - логи службы, с их - аудит системы. Ну или всё с их стороны, а с вашей - ссылки на доки;
2. В качестве временного костыля зарядите в планировщик ежечасный перезапуск службы - всяко лучше вашего велосипеда;
2.1. Если есть критерий зависания - сделайте из этого критерия триггер для вашего задания - будет перезапуск по условию, а не по времени;
3. Курите "sc sdset", но сразу предупреждаю, что у SDDL - марсианский синтаксис.
...
Рейтинг: 0 / 0
26.12.2017, 18:15
    #39576352
Basil A. Sidorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как перезапустить windows-службу из программы на java?
MaxLichНасколько я знаю, у меня в команде это кто-то взял с сайта оракла по джаве (из примеров).Есть у программистов плохая привычка решать сисадминские задачи прикладным кодом.
...
Рейтинг: 0 / 0
26.12.2017, 18:20
    #39576355
andreykaT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как перезапустить windows-службу из программы на java?
или так: есть у программистов привычка решать сисадминские задачи
...
Рейтинг: 0 / 0
26.12.2017, 18:26
    #39576358
Basil A. Sidorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как перезапустить windows-службу из программы на java?
Продублирую ответ из windows-подфорума: выкинуть враппер Тануки и взять Apache Procrun .
...
Рейтинг: 0 / 0
26.12.2017, 18:27
    #39576359
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как перезапустить windows-службу из программы на java?
ActiveMQ это же тоже Java. Можно написать обертку, которая будет слушать сигналы и закрывать Java процесс. Не исключено что такая уже есть. А Windows Service сам его перезапустит
...
Рейтинг: 0 / 0
26.12.2017, 18:39
    #39576365
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как перезапустить windows-службу из программы на java?
...
Рейтинг: 0 / 0
26.12.2017, 19:59
    #39576392
Basil A. Sidorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как перезапустить windows-службу из программы на java?
Да способов мониторинга дофига , но лично я вангую проблемы service wrapper, который у Тануки сильно ограничен в бесплатной версии.
...
Рейтинг: 0 / 0
27.12.2017, 09:34
    #39576544
MaxLich
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как перезапустить windows-службу из программы на java?
Blazkowicz, Попробовал. На втором шаге выдаёт:
автор".\activemq" не является внутренней или внешней
командой, исполняемой программой или пакетным файлом.
...
Рейтинг: 0 / 0
27.12.2017, 09:36
    #39576547
MaxLich
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как перезапустить windows-службу из программы на java?
Basil A. Sidorov, Критерием является ошибка (эксепшн) в программе.
...
Рейтинг: 0 / 0
27.12.2017, 09:38
    #39576549
MaxLich
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как перезапустить windows-службу из программы на java?
Basil A. Sidorov, мониторинг мне не нужен, мне нужно управление.
...
Рейтинг: 0 / 0
27.12.2017, 10:09
    #39576571
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как перезапустить windows-службу из программы на java?
MaxLichBlazkowicz, Попробовал. На втором шаге выдаёт:
Ну, вы бы это. Прежде чем что-то делать попробовали бы разобраться? Командная строка не важна. Важно что должен быть JMX интерфейс у брокера, у которого может оказаться команда перезапуска.
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Как перезапустить windows-службу из программы на java? / 25 сообщений из 66, страница 1 из 3
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]