使命令提示符等待所有进程执行完毕

Make command prompt wait till all processes finish execution

我是运行一个通过java代码的批处理文件。我的批处理文件包含几个命令。我希望此进程仅在所有进程执行后终止。 我的 java 密码是

String command = "cmd /c start /wait C:\python27\tutorial\check.bat "+key+" "+formattedDate;
Process p=Runtime.getRuntime().exec(command);
p.waitFor();

在我的批处理文件中的所有进程完成后,我想在这之后执行一些函数。 我的批处理文件有

cd\
cd python27
cd tutorial
start scrapy crawl flipkart -a key="%1" -o %2flipkart.xml
start scrapy crawl myntra -a key="%1" -o %2myntra.xml
start scrapy crawl jabong -a key="%1" -o %2jabong.xml
start scrapy crawl hs18 -a key="%1" -o %2hs18.xml
start scrapy crawl indiatimes -a key="%1" -o %2indiatimes.xml
start scrapy crawl shopclues -a key="%1" -o %2shopclues.xml
start scrapy crawl croma -a key="%1" -o %2croma.xml
start scrapy crawl amazon -a key="%1" -o %2amazon.xml
exit

由于这个退出命令,批处理文件正在返回并且主线程继续。我希望这个批处理文件仅在所有过程完成后退出。 感谢任何帮助。

您是否打算将所有 scrapy 线程设置为异步启动?如果没有,只需从每一行中删除 start 即可实现您的目标。

如果非阻塞线程是有意的,那么我猜这些线程可能会在不可预测的持续时间后完成,并且 scrapy crawl amazon 可能不一定是最后一个完成的线程。

您可以在 exit 上方的批处理脚本中添加一个循环,以检查 scrapy 是否存在于进程列表中 - 如下所示:

cd \python27\tutorial
start scrapy crawl flipkart -a key="%1" -o %2flipkart.xml
start scrapy crawl myntra -a key="%1" -o %2myntra.xml
start scrapy crawl jabong -a key="%1" -o %2jabong.xml
start scrapy crawl hs18 -a key="%1" -o %2hs18.xml
start scrapy crawl indiatimes -a key="%1" -o %2indiatimes.xml
start scrapy crawl shopclues -a key="%1" -o %2shopclues.xml
start scrapy crawl croma -a key="%1" -o %2croma.xml
scrapy crawl amazon -a key="%1" -o %2amazon.xml

echo Waiting for other threads to complete...
:wait
>NUL 2>NUL (
    timeout /t 1 /nobreak || ping -n 2 localhost
    tasklist /fi "imagename eq scrapy.exe" | find /i "scrapy" && goto wait
)
exit

我通过 cmd.exe 执行每个命令,以便我可以将未使用的文件句柄重定向到锁定文件。该进程在文件上持有独占锁,直到它完成。直到释放锁(进程结束)才能删除文件

我有一个尝试删除锁定文件的循环。如果删除失败,则该进程必须仍然存在,因此它会循环回去重试。我使用 TIMEOUT 来引入延迟,这样删除循环就不会淹没 CPU.

@echo off
setlocal
cd \python27\tutorial

set "jobs=flipkart myntra jabong hs18 indiatimes shopclues croma amazon"

for %%A in (%jobs%) do start cmd /c scrapy crawl %%A -a key="%1" -o "%~2%%A.xml" 9^>%%A.lock

:waitForCompletion
timeout /t 1 nobreak >nul
for %%A in (%jobs%) do (
  del %%A.lock >nul 2>nul
  if exist %%A.lock goto :waitForCompletion
)

exit

可能不需要在您的控制台中看到任何输出 windows,因此您可以使用 START /B 来 运行 同一控制台中的每个进程,并将 stdout 重定向到 nul 以隐藏输出。我保留了 stderr,以防出现错误。

@echo off
setlocal
cd \python27\tutorial

set "jobs=flipkart myntra jabong hs18 indiatimes shopclues croma amazon"

for %%A in (%jobs%) do start /b cmd /c scrapy crawl %%A -a key="%1" -o "%~2%%A.xml" ^>nul 9^>%%A.lock

:waitForCompletion
timeout /t 1 nobreak >nul
for %%A in (%jobs%) do (
  del %%A.lock >nul 2>nul
  if exist %%A.lock goto :waitForCompletion
)

exit