在一个命令提示符窗口中启动多个长时间运行的后台进程?

时间:2015-12-05 18:32:00

标签: php windows batch-file cmd

我想要的只是从shell启动一堆后台进程。这就是全部。

这是我在名为start_servers的批处理文件中的内容:

@ECHO OFF
call setenv
START "" /B xampp\apache_start.bat
START "" /B xampp\mysql_start.bat
START "" /B php start_daemon.php
echo Server started

当我通过双击批处理文件来运行它时,一切正常。我在1个窗口中获得了所有3个进程的输出。 但是,如果我在同一目录中启动shell,请键入' start_servers.bat'并按Enter键,它运行apache_start和mysql_start就好了,但php脚本' start_daemon'看似没有运行,但我得到了服务器启动'输出。

最奇怪的是,如果我再次点击进入,那么php start_daemon.php会运行! 好像' php start_daemon.php'正在我的键盘上键入,但它对我来说是不可见的。 当我按Enter键时,它看起来像是这样:

[cwd]> start_servers.bat
...

[cwd]>Websocket Server started
Listening on: 0.0.0.0:9000
Master socket: Resource id #7

请注意部分' [cwd]>服务器已启动'比如我把它作为一个命令输入。

我花了一整天时间试图解决这个问题,这让我发疯了!!!!!

请帮助。

编辑:

我一直在尝试其他一些事情,而且我仍然得到同样的结果。 如果我将.bat降低到' START"" / B php start_daemon.php'或者如果我只是在命令行中键入它,我得到相同的结果。第一次回归,没什么。第二次回归,它运行。

我还尝试过以下方法:

START "" /B node test.js

结果:

C:\Users\hedge\Projects\PHPStorm\gpstudios>this is a test

我的期望:

this is a test
C:\Users\hedge\Projects\PHPStorm\gpstudios>

此外:

START "" /B python2 test.py

结果:

C:\Users\hedge\Projects\PHPStorm\gpstudios>this is a test

最后:

START "" /B python3 test.py

结果:

C:\Users\hedge\Projects\PHPStorm\gpstudios>   [nothing, I hit return]
C:\Users\hedge\Projects\PHPStorm\gpstudios>   [nothing again, I hit return]
C:\Users\hedge\Projects\PHPStorm\gpstudios>this is a test

到底是怎么回事?它们都将结果输出到我输入命令的行,我认为这是有意义的,因为终端没有等待START调用完成后再将控制权交还给我,但是,PHP脚本要求我再次点击返回, Python3脚本需要2次返回! 这根本不直观。我再次请求帮助。这让我很难过。

编辑2:

如果我跑步' START"" / B / WAIT php start_daemon.php'或者' php start_daemon.php'然后很明显,脚本会立即运行并按预期运行,但它会冻结shell并要求我启动一个新的脚本以输入任何进一步的命令。 我计划通过node或php运行多个后台进程,但因为它只能在一个CMD终端中运行一个。

我只是想稍微改一下这个问题,希望得到一些回复,如果这有帮助......

3 个答案:

答案 0 :(得分:0)

您是否尝试在启动PHP脚本之前进行临时调整?

@ECHO OFF
call setenv
START "" /B xampp\apache_start.bat
START "" /B xampp\mysql_start.bat
timeout 5 >nul
START "" /B php start_daemon.php
echo Server started

答案 1 :(得分:0)

尝试将它们全部分组。 换句话说,像这样:

(@ECHO OFF
call setenv
START "" /B xampp\apache_start.bat
START "" /B xampp\mysql_start.bat
START "" /B php start_daemon.php
echo Server started)

顺便说一句,如果你在命令提示符中复制/粘贴整个东西,它将运行第一行,然后按Enter键,它将运行最后一行。当然,最好的办法是在运行此命令时使用批处理文件:D

P.S。 谢谢,我需要知道如何在后台运行东西。的xD

更新:

在每个之后添加一个简单/超时:

(@ECHO OFF
call setenv
START "" /B xampp\apache_start.bat
timeout 1 >NUL
START "" /B xampp\mysql_start.bat
timeout 1 >NUL
START "" /B php start_daemon.php
timeout 1 >NUL
echo Server started)

答案 2 :(得分:0)

我有点晚了,但我会尝试至少解释一些行为。

使用

START "" /B node test.js

结果:

C:\Users\hedge\Projects\PHPStorm\gpstudios>this is a test

可以预期,因为起始node test.js异步通常需要一些时间才能开始 因此,cmd.exe已完成Start命令并在node test.js能够打印文本之前打印提示。

为避免这种情况,您需要在start之后添加延迟 我建议为此测试使用批处理文件。

@echo off
START "" /B node test.js
timeout /t 1 > nul

php或python需要更多ENTER个密钥的问题似乎是您系统的本地问题。
作为一个简单的测试适用于Windows7。

@echo off
start "" /b php -r "echo 1;"
start "" /b php -r "echo 2;"
start "" /b php -r "echo 3;"
timeout /t 1 > nul

多次运行,我得到不同的输出

  

213
  123个
  ...

这是可以预期的,因为每个php实例都是异步启动的。