Как запустить команду в фоновом режиме в Windows?

В Linux вы можете использовать command & для запуска команды в фоновом режиме, то же самое будет продолжаться и после того, как оболочка будет отключена. Мне было интересно, есть ли что-то подобное для окон…


person Louis    schedule 09.01.2014    source источник
comment
Хороший вопрос, но его следует задать в SuperUser. Насколько я знаю, такого объекта нет. Windows использует Службы для фоновых задач без оболочки, но они должны быть специально закодированы — вы не можете просто запустить любую команду как службу. Самое близкое, что вы могли бы получить, это, возможно, команда start, которая запускает новую оболочку.   -  person paddy    schedule 10.01.2014
comment
@paddy, но если я использую start, он перестанет работать, как только я выйду из сети, верно?   -  person Louis    schedule 10.01.2014
comment
Да, это правильно. процессы, запущенные с помощью start, завершаются при выходе из системы. Поэтому он не подходит для длительных удаленных фоновых заданий.   -  person Anthony    schedule 15.05.2015
comment
У суперпользователя есть ответ, @paddy.   -  person Dan Dascalescu    schedule 16.08.2015


Ответы (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
    

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

  • Худшее: запустите команду, используя папку автозагрузки. Это запускается, когда пользователь входит в компьютер

Надеюсь, это поможет некоторым!

person drew_w    schedule 09.01.2014
comment
если у вас есть только VS Express, то это способ создать службу Windows: codeproject.com/Articles/106742/ - person Graham; 31.07.2014
comment
Сохраните сценарий VB с расширением .vbs. - person D.Kastier; 16.03.2018

Я считаю, что команда, которую вы ищете, это start /b *command*

Для Unix nohup означает «нет зависания», что немного отличается от фонового задания (которое будет *command* &. Я считаю, что приведенная выше команда должна быть похожа на фоновое задание для Windows.

person Oeste    schedule 09.01.2014
comment
вопрос: start /b command перестанет работать, как только я выйду с сервера, верно? и да, извините, я command & не nohup - person Louis; 10.01.2014
comment
См. этот ответ: stackoverflow.com/a/3382087/1751190 Я так думаю, но я не уверен. Я бы сам проверил, но сейчас у меня нет компьютера с Windows. - person Oeste; 10.01.2014
comment
Просто в качестве подтверждения: да, команда УМЕРЕТ, если вы выйдете из системы (если вы подключились к машине Windows из телнета для запуска команды). - person msb; 05.11.2014

Используйте команду start с флагом /b для запуска команды/приложения без открытия нового окна. Например, это запускает dotnet run в фоновом режиме:

start /b dotnet run

Вы также можете передавать параметры команде/приложению. Например, я запускаю 3 экземпляра этого проекта C# со значениями параметров x, y и z:

введите здесь описание изображения

Чтобы остановить программу(ы), работающую в фоновом режиме: CTRL + BREAK

По моему опыту, это останавливает все фоновые команды/программы, запущенные вами в этом экземпляре cmd.

Согласно документы Microsoft:

Обработка CTRL+C игнорируется, если приложение не разрешает обработку CTRL+C. Используйте CTRL+BREAK, чтобы прервать приложение.

person Josh Withee    schedule 23.10.2019

Вы также должны взглянуть на команду at в Windows. Он запустит программу в определенное время в фоновом режиме, которая работает в этом случае.

Другой вариант — использовать программное обеспечение nssm Service Manager. Это завершит любую команду, которую вы запускаете как службу Windows.

ОБНОВИТЬ:

nssm не очень хорошо. Вместо этого вам следует взглянуть на проект WinSW. https://github.com/kohsuke/winsw

person Nicholas DiPiazza    schedule 11.09.2016

Если вы потратите 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
person Afterparty    schedule 14.02.2021