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


159

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

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


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 для установки сервиса.

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

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

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


3

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

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

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

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


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, либо для других программ / серверов используйте методы отношение к серверу.


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

1
если вы прочитаете его правильно, вы заметите, что он содержит идеальный ответ, соответствующий примеру
— Goofyseeker311

0

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

Удачи!

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.