В Linux вы можете использовать command & для запуска команды в фоновом режиме, то же самое будет продолжаться и после того, как оболочка будет отключена. Мне было интересно, есть ли что-то подобное для окон…
Как запустить команду в фоновом режиме в Windows?
Ответы (5)
Я предполагаю, что вы хотите запустить команду без интерфейса (возможно, автоматически?). В окнах есть несколько вариантов того, что вы ищете:
Лучше всего: напишите свою программу как службу Windows. Они начнутся, когда никто не войдет на сервер. Они позволяют вам выбрать учетную запись пользователя (которая может отличаться от вашей собственной), и они будут перезапущены в случае сбоя. Они выполняются постоянно, поэтому вы можете автоматизировать задачи в определенное время или по обычному расписанию из них. Для получения дополнительной информации о том, как написать службу Windows, вы можете прочитать онлайн-руководство, например (http://msdn.microsoft.com/en-us/library/zt39148a(v=vs.110).aspx).
Лучше: Запустите команду и скройте окно. Предполагая, что команда является командой DOS, вы можете использовать для этого скрипт VB или C#. Подробнее см. здесь. Информация. Пример:
Set objShell = WScript.CreateObject("WScript.Shell") objShell.Run("C:\yourbatch.bat"), 0, True
Вам все равно придется запускать команду вручную или писать задачу для запуска команды. Это одно из самых больших падений этой стратегии.
- Худшее: запустите команду, используя папку автозагрузки. Это запускается, когда пользователь входит в компьютер
Надеюсь, это поможет некоторым!
Я считаю, что команда, которую вы ищете, это start /b *command*
Для Unix nohup
означает «нет зависания», что немного отличается от фонового задания (которое будет *command* &
. Я считаю, что приведенная выше команда должна быть похожа на фоновое задание для Windows.
command &
не nohup
- person Louis; 10.01.2014
Используйте команду start
с флагом /b
для запуска команды/приложения без открытия нового окна. Например, это запускает dotnet run
в фоновом режиме:
start /b dotnet run
Вы также можете передавать параметры команде/приложению. Например, я запускаю 3 экземпляра этого проекта C# со значениями параметров x
, y
и z
:
Чтобы остановить программу(ы), работающую в фоновом режиме: CTRL + BREAK
По моему опыту, это останавливает все фоновые команды/программы, запущенные вами в этом экземпляре cmd
.
Согласно документы Microsoft:
Обработка CTRL+C игнорируется, если приложение не разрешает обработку CTRL+C. Используйте CTRL+BREAK, чтобы прервать приложение.
Вы также должны взглянуть на команду at
в Windows. Он запустит программу в определенное время в фоновом режиме, которая работает в этом случае.
Другой вариант — использовать программное обеспечение nssm
Service Manager. Это завершит любую команду, которую вы запускаете как службу Windows.
ОБНОВИТЬ:
nssm
не очень хорошо. Вместо этого вам следует взглянуть на проект WinSW. https://github.com/kohsuke/winsw
Если вы потратите 5 минут на загрузку Visual Studio и создадите для этого консольное приложение, ваша проблема будет решена.
using System;
using System.Linq;
using System.Diagnostics;
using System.IO;
namespace BgRunner
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Starting: " + String.Join(" ", args));
String arguments = String.Join(" ", args.Skip(1).ToArray());
String command = args[0];
Process p = new Process();
p.StartInfo = new ProcessStartInfo(command);
p.StartInfo.Arguments = arguments;
p.StartInfo.WorkingDirectory = Path.GetDirectoryName(command);
p.StartInfo.CreateNoWindow = true;
p.StartInfo.UseShellExecute = false;
p.Start();
}
}
}
Примеры использования:
BgRunner.exe php/php-cgi -b 9999
BgRunner.exe redis/redis-server --port 3000
BgRunner.exe nginx/nginx
start
, которая запускает новую оболочку. - person paddy   schedule 10.01.2014start
, он перестанет работать, как только я выйду из сети, верно? - person Louis   schedule 10.01.2014start
, завершаются при выходе из системы. Поэтому он не подходит для длительных удаленных фоновых заданий. - person Anthony   schedule 15.05.2015