我想要的只是从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终端中运行一个。
我只是想稍微改一下这个问题,希望得到一些回复,如果这有帮助......
答案 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实例都是异步启动的。