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