如何在Windows上将命令放到后台运行?

63
在Linux中,您可以使用command&命令在后台运行命令,相同的命令将继续在shell离线后运行。我想知道Windows有没有类似的功能...

2
好问题,但应该在SuperUser上提问。据我所知,没有这样的功能。Windows使用服务来处理没有shell的后台任务,但它们必须经过特殊编码 - 你不能只是将任何命令作为服务运行。最接近的可能是start命令,它启动一个新的shell。 - paddy
1
@paddy 但是如果我使用 start,一旦我离线了它就会停止运行,对吗? - Louis
3
是的,没错。使用“start”启动的进程会在您注销时终止。因此,它不适合长时间运行的远程后台作业。 - Anthony
1
@paddy,Superuser有答案 - Dan Dascalescu
你的问题包含一个无效的假设。以&开头的命令将随着shell的关闭而终止。因此,在这个意义上,Windows中的start /b与*nix中的&是相同的。 - Terrible Tadpole
9个回答

73

我相信你要找的命令是start /b *command*

对于Unix系统,nohup代表“不挂断”,这与后台作业略有不同(后台作业应该是*command* &)。我认为上述命令应该类似于Windows中的后台作业。


9
“start /b command”命令在我注销服务器后会立即停止运行,对吗?是的,抱歉我写错了,应该是“command &”,而不是“nohup”。 - Louis
1
请参考这个答案:https://dev59.com/13A75IYBdhLWcg3wSm24#3382087。我认为是可以的,但我不能确定。我想亲自测试一下,但现在离Windows电脑有点远。 - Oeste
8
确认一下:是的,如果你通过telnet连接到Windows机器并运行命令,当你注销时命令会终止。 - msb

23

我假设您想要做的是在没有界面的情况下运行命令(可能是自动执行的)。在Windows上有许多选项可满足您的需求:

  • 最佳方法:将程序编写为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
    

    你仍然需要手动启动命令或编写一个任务来启动命令。这是这种策略最大的缺陷之一。

  • 最糟糕的情况是:使用启动文件夹启动命令。这会在用户登录计算机时运行。

希望这可以帮到你!


1
如果您只有VS Express,则可以使用以下方法创建Windows服务:http://www.codeproject.com/Articles/106742/Creating-a-simple-Windows-Service - Graham
将VB脚本保存为扩展名“.vbs”。 - D.Kastier
任务计划程序怎么样?我们能否使用控制台向计划程序添加任务?在部署新版本时,能否停止/终止任务?如果出现任何错误,是否可以重新启动应用程序? - undefined

13

使用 /b 标志和 start 命令来运行一个命令/应用程序,而不需要打开新窗口。例如,这将在后台运行 dotnet run 命令:

start /b dotnet run

你也可以向命令/应用程序传递参数。例如,我正在启动此C#项目的3个实例,其参数值为xyz

enter image description here

要停止后台运行的程序:CTRL + BREAK

根据我的经验,这将停止在该cmd实例中启动的所有后台命令/程序。

根据 Microsoft 文档

除非应用程序启用了 CTRL+C 处理,否则将忽略 CTRL+C 处理。使用 CTRL+BREAK 中断应用程序。


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

可能不是OP希望得到的答案,但发布源代码应该得到一张赞,所以+1。 - Binarus
好的,这对 calc.exe 没有用。https://i.stack.imgur.com/b5Aqh.png - barlop
如果我在(从win7测试)“开始”..“运行”中执行以下命令:c:\users\user\abc\a.exe c:\users\user\abc\bb.bat,也肯定会短暂地弹出一个cmd提示符。 - barlop
谁能在5分钟内下载完Visual Studio,那他的网络比我的大学还要好。x) - monamona
谁在5分钟内下载了Visual Studio,比我的大学网络好多了。x) - undefined

5
您还应该查看Windows中的at命令。它将在后台的特定时间启动程序,适用于此情况。
另一种选择是使用nssm服务管理软件。这将把您运行的任何命令包装成Windows服务。
更新: nssm并不是很好。您应该查看WinSW项目。 https://github.com/kohsuke/winsw

4

难以想象,Windows 十年之后仍然没有一个像样的方法在后台运行命令。

start /B command 是最常见的答案,但是当终端关闭时,命令也会被关闭。

现在,Windows 10 内置了一个(需要手动安装)ssh 服务器,您可以运行以下命令:

ssh username@localhost "my_backgroud_command --params"

然后按 CTRL C,关闭终端,命令将在后台继续运行。

这是我目前找到的最好的方法。 虽然还不够好,因为您必须先安装和配置ssh服务器。


据我所知,这是不正确的。我刚在运行了Windows 10 Pro的计算机上尝试了一下,输入了“start /b notepad”命令,Notepad进程启动了,我的“cmd”提示符被释放了,当我退出“cmd”时,Notepad仍在运行。 - Wayne Bloss
我们正在讨论“在后台运行命令”的问题。记事本是一个图形用户界面应用程序,我认为它与“在后台运行”没有任何关系。 - Gary Allen
感谢澄清。对我来说,“background”只是意味着“分离”,就像“不依赖于父进程”一样。 - Wayne Bloss

2
在Windows命令提示符中后台运行命令,需要在命令前加上前缀"start /B"。下面的代码将在后台运行cmd1。
start /B cmd1
要在Windows命令提示符中并行运行多个命令,可以使用以下命令在cmd中运行。
start /B cmd1 & start /B cmd2

1
我经常使用的一个选项是在后台运行一组简单命令或设置,然后注销时脚本化命令(BAT、CMD、PowerShell等都可以正常工作),然后使用Windows本地任务计划程序执行脚本。从任务计划程序执行的作业在您注销时不会停止。任务计划程序作业可以配置为以“隐藏”方式运行,即不会显示命令提示窗口。这个脚本+任务计划程序是一个很好的选择,而不是在您喜欢的开发环境(如Visual Studio)中开发可执行文件(例如yadda.exe),当需要完成的任务很简单,编写控制台应用程序来执行一两个简单命令将是“过度设计”,即得不偿失。
以上仅供参考。

0
在这里的Windows服务器上,使用标题(双括号中),否则它将不会“释放”:
start "" "chrome.exe --parameters" && echo truc

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接