Запустить пакетный файл как службу Windows

159

Чтобы запустить одно приложение, необходимо запустить пакетный файл (например, запустить Jetty, отобразить живые журналы и т. Д.). Приложение будет работать, только если этот пакетный файл запущен. Поэтому я вынужден запускать этот пакетный файл, а не выходить с сервера Windows.

Можно ли запустить этот пакетный файл как сервис? Я экспериментирую с одним из предложений аналогичного вопроса .

publicRavi
источник
27
Пакетное программирование является темой для Stack Exchange.
Гарри Джонстон
12
Хороший вопрос. +1. Модераторы слишком сердиты ... Также у меня есть еще один хороший ответ, но вопрос закрыт ((
gavenkoa
Я использую этот RunAsService вместо: runasservice.com . Это намного, намного проще в использовании. Нет глупостей конфигурации XML. По сути, это просто дает вам исполняемый файл RunAsService.exe, который упаковывает любое консольное приложение с аргументами командной строки в качестве службы. Я использую это для запуска сценариев Cygwin Bash в качестве служб !!! К сожалению, этот простой инструмент выглядит закрытым.
Каз
8
выдвижение кандидатур для повторного открытия на основе «программных средств, обычно используемых программистами». Какой ответ на этот вопрос определенно есть. Также имейте в виду, что это первый результат Google при поиске «пакетного файла запуска Windows в качестве службы», поэтому, если какой-то модератор находится в узкой области «в теме», то остальной мир считает, что это так. Я голосую за прагматизм здесь за догматизмом.
Адам Кэмерон
Аналогичный вопрос можно найти по адресу serverfault serverfault.com/questions/54676/…
Стивен Куан

Ответы:

151

NSSM является полностью бесплатным и сверхлегким, с командной строкой / терминалом в качестве администратора:

nssm install "YourCoolServiceNameLabel"

тогда появится диалоговое окно, чтобы вы могли выбрать, где находится файл, который вы хотите запустить.

удалить

nssm remove "YourCoolServiceNameLabel"
Джуниор Майе
источник
25
+1 Никогда не слышал об этом, но это очень приятно. NSSM действительно не сосет!
Байрон Уитлок
1
Мне потребовалось 2 минуты, чтобы установить сервис
Бен Уайльд
3
@ Юниор М Спасибо! Ты спас меня. Я потратил 4 часа на это. Спасибо!!
Verystrongjoe
2
Знаете ли вы, если есть способ дать nssmвсе необходимые аргументы при вводе, чтобы избежать ввода всплывающих данных - я пытаюсь автоматизировать процесс?
amphibient
1
NSSM постоянно удаляется у некоторых наших клиентов антивирусом GDATA. Да, я знаю, белый список ... но клиенты не делают то, что хорошо для них. Это грустная правда.
Президент Dreamspace
61

Почему бы просто не настроить его как запланированную задачу, запуск которой запланирован при запуске?

Стивен Мартин
источник
1
У меня есть несколько пакетных файлов, выполняющих резервное копирование с помощью robocopy, которые я запускаю с помощью Запланированных задач (перейдите в Панель управления, Запланированные задачи), запущенных на сервере Win 2003. Работает удовольствие ...
SAL
Просто сделал это с помощью скрипта, который мы использовали для мониторинга нашей службы резервного копирования. Работает как часы.
music2myear
1
это лучшее решение ИМО. не требуется никакого стороннего программного обеспечения и интерфейса командной строки. Плюс Планировщик заданий предоставляет множество опций для триггеров, условий и т. Д.
dev
3
Работает теперь, когда я понял это: когда задача запускается при запуске (с «Запустить, пользователь вошел в систему или нет»)% UserProfile% равен C: \ Users \ Default \ В любое другое время это будет ожидаемый C: \ Users \ ExpectedUser \ Это может создать загадочные сбои для некоторых файлов .bat, которые, кажется, хорошо работают в других запланированных задачах.
user1754036
2
Запланированные задачи общеизвестно ненадежны - я действительно сталкивался с этим вопросом из-за всех проблем, которые у меня были с задачами, не запускаемыми вовремя без видимой причины.
22

Для этого есть встроенный Windows cmd: sc create . Не так красиво, как nssm, но вам не нужно загружать дополнительное программное обеспечение.

sc create "ServiceName" start= demand displayname= "DisplayName" binpath= [path to .bat file]

Заметка

  • старт = спрос означает, что вы должны запустить сервис самостоятельно
  • пробел требуется после =
  • Я столкнулся с ошибкой при запуске службы, что служба не ответила своевременно, но было ясно, что служба успешно запустила .bat. Еще не копался в этом, но этот поток испытал то же самое и решил это, используя nssm для установки сервиса.
w00ngy
источник
4
Похоже, что Windows не запускает .bat файлы как сервисы.
Перкинс
@Perkins - Мой работал вчера на паре машин. Вы испытываете что-то конкретное? Я столкнулся с ошибкой, что служба не отвечала ему своевременно при запуске, но файл .bat был для запуска сервера Kibana node.js, и он успешно работал даже с этой ошибкой. Парни в этой теме, похоже, испытывали то же самое, но не с nssm. stackoverflow.com/a/40130630/885535
w00ngy
2
В моем случае файлы, которые должен создать пакетный файл, не создаются, и программы не запускаются, поэтому я должен предположить, что он не запускается. Мне удалось обойти это, создав службу для запуска cmd.exe / C <batchfile>. Обратите внимание, что я использую Windows 10, так что это может быть что-то новое, что касается безопасности.
Перкинс
@Perkins Я только что запустил на win10 1803 без проблем, запускает мой сервер node.js. Создает ли файл bat файлы и запускает ли службы при вызове из cmd или powershell? Получаете ли вы какие-либо сообщения MSG при запуске службы? Есть ли у вашей службы разрешение на эти каталоги? Вы можете добавить некоторые сообщения об ошибках в летучей мыши, записав в локальный файл журнала, посмотреть, работает ли это.
w00ngy
1
Получите сообщение « Ошибка 1053: служба не ответила на запрос запуска или управления своевременно ».
Алекс Клаус,
5

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

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

Zediiiii
источник
3

Как говорит Дуг Керри, используйте RunAsService.

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

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

не уверен, что последний применился ... это была одна большая кобыла в проекте, над которым я работал некоторое время назад.

Lexu
источник
3

Хотя это не бесплатно (но 39 долларов), FireDaemon работал так хорошо для меня, я должен рекомендовать его. Он запускает ваш пакетный файл, но имеет множество дополнительных и очень полезных функций, таких как планирование, мониторинг обслуживания, установка сервисов на основе графического интерфейса или XML, зависимости, переменные среды и управление журналами.

Я начал использовать FireDaemon для запуска серверов приложений JBoss ( run.bat ), но вскоре понял, что богатство возможностей конфигурации FireDaemon позволило мне отказаться от пакетного файла и воссоздать назначение его команд в определении службы FireDaemon.

Есть также СУПЕР FireDaemon под названием Trinity, на который вы можете обратить внимание, если у вас есть большое количество серверов Windows, на которых можно управлять этой службой (или технически любой службой).

Николас
источник
2

На сервере Windows 2019 вы можете запустить Java-сервер Minecraft с помощью следующих команд:

sc create minecraft-server DisplayName = "minecraft-server" binpath = "cmd.exe /CC:\Users\Administrator\Desktop\rungui1151.lnk" type = own start = auto

Файл .lnk - это стандартный ярлык Windows для командного файла.

--- .bat файл начинается ---

java -Xmx40960M -Xms40960M -d64 -jar minecraft_server.1.15.1.jar

--- .bat файл заканчивается ---

Все это потому что:

служба не знает, как запустить в папке,

cmd.exe не знает, как запустить в папке

Запуск службы приведет к ошибке «своевременно», но файл журнала показывает, что сервер работает.

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

Goofyseeker311
источник
Это не дает ответа на вопрос. Как только у вас будет достаточно репутации, вы сможете комментировать любой пост ; вместо этого предоставьте ответы, которые не требуют разъяснений от автора . - Из Обзора
Джереми Дж. Старчер
1
если вы прочитаете его правильно, вы заметите, что он содержит идеальный ответ, соответствующий примеру
Goofyseeker311
0

AlwaysUp легко запустит ваш пакетный файл как сервис. Он похож на FireDaemon (упомянутый выше) и не является бесплатным, но вы можете найти богатый набор функций, который будет полезен в профессиональной среде.

Удачи!

CoreTech
источник