我正在通过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
由于此退出命令,批处理文件将返回并且主线程继续。我希望只有在完成所有进程后才能退出此批处理文件。 任何帮助表示赞赏。
答案 0 :(得分:1)
您是否打算将所有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
答案 1 :(得分:0)
我通过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
可能不需要在控制台窗口中看到任何输出,因此您可以使用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