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


starting multiple long running background processes in one Command Prompt window?

我只想从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

当我通过双击批处理文件来运行它时,一切都很好。我在一个窗口中得到所有3个进程的输出。但是,如果我在同一目录中启动shell,键入"start_servers.bat"并点击enter,它会运行apache_start和mysql_start,但php脚本"start_demon"似乎没有运行,但我会输出"Server started"。

不过,最奇怪的是,如果我再次点击enter,那么php start_demon.php就会运行!就好像在我的键盘上输入了"phpstart_daemon.php",但我看不见。当我点击回车键时,它看起来是这样的:

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

请注意"[cwd]>Server started"部分,就像我将其作为命令输入一样。

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

请帮帮我。

编辑:

我只是尝试了一些其他的事情,但我仍然得到了同样糟糕的结果。如果我将.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脚本需要我再次点击return,而Python3脚本需要2次return!这一点都不直观。我再次请求帮助。这简直要了我的命。

编辑2:

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

我只是试着重新表述一下这个问题,希望能得到一些回复,如果这有帮助的话。。。

在启动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

我有点迟到了,但我会尽量解释至少一些行为。

使用

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实例都是异步启动的。

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

(@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)