【问题标题】:How to run a command in the background on Windows?如何在 Windows 后台运行命令?
【发布时间】:2014-01-09 21:08:52
【问题描述】:

在linux下你可以使用command &在后台运行命令,shell离线后同样会继续。我想知道 Windows 是否有类似的东西......

【问题讨论】:

  • 好问题,但应该在SuperUser 提问。据我所知,没有这样的设施。 Windows 将服务用于没有 shell 的后台任务,但它们必须经过特殊编码 - 您不能将任何命令作为服务运行。你得到的最接近的可能是start 命令,它启动一个新的shell。
  • @paddy 但如果我使用start,它会在我下线后立即停止运行,对吧?
  • 是的,没错。以start 开始的进程会在您注销时终止。所以它不适合长时间运行的远程后台作业。

标签: windows cmd background-process


【解决方案1】:

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

对于 unix,nohup 代表“不挂断”,这与后台作业(应为 *command* &)略有不同。我相信上述命令应该类似于 windows 的后台作业。

【讨论】:

  • 问题:start /b command 将在我从服务器注销后立即停止运行,对吗?是的,对不起,我是command & 不是nohup
  • 看到这个答案:stackoverflow.com/a/3382087/1751190 我相信是这样,但我并不肯定。我会自己测试它,但我现在不在 Windows 计算机附近。
  • 作为确认:是的,如果您注销,该命令将会死掉(如果您从 telnet 连接到 windows 机器以运行该命令)。
【解决方案2】:

我假设你想要做的是运行一个没有界面的命令(可能是自动的?)。在 Windows 上,有许多选项可以满足您的需求:

  • 最好:将程序编写为 Windows 服务。这些将在没有人登录服务器时启动。他们让您选择用户帐户(可以与您自己的帐户不同),如果失败,他们将重新启动。它们一直在运行,因此您可以在特定时间或定期从其中自动执行任务。有关如何编写 Windows 服务的更多信息,您可以阅读在线教程,例如 (http://msdn.microsoft.com/en-us/library/zt39148a(v=vs.110).aspx)。

  • 更好:启动命令并隐藏窗口。假设该命令是 DOS 命令,您可以为此使用 VB 或 C# 脚本。有关更多信息,请参阅here。一个例子是:

    Set objShell = WScript.CreateObject("WScript.Shell")
    objShell.Run("C:\yourbatch.bat"), 0, True
    

    您仍然需要手动启动命令或编写任务来启动命令。这是该策略最大的失败之一。

  • 最差:使用启动文件夹启动命令。这在用户登录计算机时运行

希望对大家有所帮助!

【讨论】:

【解决方案3】:

使用带有/b 标志的start 命令在不打开新窗口的情况下运行命令/应用程序。例如,这在后台运行dotnet run:

start /b dotnet run

您也可以将参数传递给命令/应用程序。例如,我正在启动这个 C# 项目的 3 个实例,参数值为 x、y 和 z:

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

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

根据Microsoft docs:

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

【讨论】:

    【解决方案4】:

    您还应该看看 Windows 中的 at 命令。它将在特定时间在后台启动一个在这种情况下有效的程序。

    另一种选择是使用nssm 服务管理器软件。这将包装您作为 Windows 服务运行的任何命令。

    更新:

    nssm 不是很好。您应该查看 WinSW 项目。 https://github.com/kohsuke/winsw

    【讨论】:

      【解决方案5】:

      如果你花 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。
      【解决方案6】:

      令人难以置信的是,十年后,Windows 仍然没有一种体面的方式在后台运行命令。

      start /B command 是最给定的答案,但是当终端关闭时,命令将被关闭。

      现在,Windows 10 有一个内置的(您必须手动安装)ssh 服务器。你可以跑

      ssh username@localhost "my_backgroud_command --params"
      

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

      这是迄今为止我找到的最体面的方式。 虽然不够体面,因为你必须先安装和配置 ssh 服务器。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-07-04
        • 1970-01-01
        • 2021-06-19
        • 1970-01-01
        • 1970-01-01
        • 2011-02-12
        • 2011-04-23
        相关资源
        最近更新 更多