Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Batch file 正在等待八个并行批处理脚本_Batch File_Locking - Fatal编程技术网

Batch file 正在等待八个并行批处理脚本

Batch file 正在等待八个并行批处理脚本,batch-file,locking,Batch File,Locking,我对批处理文件的编码有0点经验,实际上我是在引用一篇老文章 “”和dbenham的答案 他的答案很好,但我想调整他的解决方案,使其不是同时运行2个文件,而是同时运行8个文件,然后再运行8个文件,以此类推 有人能帮我吗 到目前为止,我尝试的是这个(针对3个块,每个块包含8个批处理文件) 但它似乎不起作用。正常情况下,一个包含八个批处理文件的块将在最长3小时后完成,但我等了将近24小时,他似乎被困在第一个块中 关键信息:当执行批处理文件(或作业)时,“cmd”窗口会打开5秒钟,然后关闭,另一个程序会

我对批处理文件的编码有0点经验,实际上我是在引用一篇老文章 “”和dbenham的答案

他的答案很好,但我想调整他的解决方案,使其不是同时运行2个文件,而是同时运行8个文件,然后再运行8个文件,以此类推

有人能帮我吗

到目前为止,我尝试的是这个(针对3个块,每个块包含8个批处理文件)

但它似乎不起作用。正常情况下,一个包含八个批处理文件的块将在最长3小时后完成,但我等了将近24小时,他似乎被困在第一个块中

关键信息:当执行批处理文件(或作业)时,“cmd”窗口会打开5秒钟,然后关闭,另一个程序会启动,该程序正在执行最长3小时的实际计算作业。我查看了任务管理器,结果是,启动了3个进程。“standard.exe”和“eliT_DriverLM.exe”在大约20秒之后,而“python.exe”在5秒之后。由于当这3个进程不再运行(不再显示在任务管理器中)时,进程已完成,因此程序应至少等待“standard.exe”终止。

@ECHO OFF
SETLOCAL
设置“sourcedir=U:\sourcedir”
设置“filename1=%sourcedir%\q57071663.txt”
设置“lockfilename=%temp%\LOCK\
::BLOCKSIZE-如果为正,则在该大小的块中运行。
::如果为负数,请运行最大并行作业数
设置/a块大小=-5
对于(“%filename1%”中的/f“usebackqtokens=1*delims=|“%%a,请执行以下操作(
如果“%%b”==”(设置“jobname=”&设置“jobinstr=%%a”)其他(设置“jobname=%%a”并设置“jobinstr=%%b”)
电话:sub
)
后藤:EOF
:sub
设置/a absblocksize=块大小
如果%blocksize%gtr 0转到blockmode
设置/a absblocksize=-blocksize
:块模式
对于(1,1,%absblocksize%)中的/L%%c,如果不存在,则不存在“%lockfilename%\%%c”设置“lock=%lockfilename%\%%c”&转到发布
::没有空位,所以区块完整。等待一切结束
:阻塞等待
电话:wait1
如果%blocksize%gtr 0如果存在“%lockfilename%”(转到blockwait)其他(转到blockmode)
转到块模式
:释放
回显。>%lock%“
启动“%jobname%”命令/c“调用%jobinstr%”并删除“%lock%”
后藤:eof
:wait1
超时/T1>NUL2>NUL
后藤:eof
您需要更改
sourcedir
的设置以适应您的环境。清单使用了适合我的系统的设置

我使用了一个名为
q57071663.txt
的文件,其中包含一些用于测试的虚拟数据

%lockfile%
临时使用,是您选择的文件名

之所以需要使用
usebackq
选项,是因为我选择在源文件名周围添加引号

对于我的演示,q57071663.txt的内容是

作业1| q57071663_sub.bat 12
作业2| q57071663_sub.bat 4
作业3| q57071663_sub.bat 15
作业4| q57071663_sub.bat 2
作业5| q57071663_sub.bat
作业6| q57071663_sub.bat
作业7| q57071663_sub.bat
作业8| q57071663_sub.bat
作业9| q57071663_sub.bat 6
作业11 | q57071663_sub.bat 12
作业12| q57071663_sub.bat 4
作业13 | q57071663_sub.bat 15
作业14| q57071663_sub.bat 2
作业15| q57071663_sub.bat
作业16| q57071663_sub.bat
作业17| q57071663_sub.bat
作业18| q57071663_sub.bat
作业19| q57071663_sub.bat 6

每一行都是一个可选的作业名称、一个分隔符(显然,我选择了
|
)和
start…

q57071663_sub.bat
只是

@ECHO OFF
SETLOCAL
SET "delay=%1"
:: IF no delay defined, random 3..19 secs
IF NOT DEFINED delay SET /a delay=3+(%RANDOM% %% 17)
timeout /t %delay% >NUL 2>NUL
即延迟(参数)秒,或3至19(如果未提供参数)

对于主例程,
for/f
使用
|
分隔符从文件中分割每一行,并将这两部分分配给
jobname
jobinstr
,然后执行子例程
:sub

子例程计算
blocksize
的绝对值,并查找丢失的锁文件。如果发现该范围内缺少锁文件,
lock
获取锁文件名,
release
设置锁文件并启动作业,并在作业终止时附加删除锁文件的指令

如果没有空位,我们等待。如果
blocksize
大于0,那么如果没有剩余的锁文件,我们可以继续下一个块,否则我们等待。如果
blocksize
为负值,则我们只需重试

因此-如果
blocksize
为正值,则一次运行文件
n
中的所有作业,等待
n
的每个块完成后再开始下一个块。如果
blocksize
为负值,则我们并行运行
n
作业,在任何作业终止时启动列表中的下一个作业。这将始终运行
n
作业


根据问题中包含的评论和关键信息完成修订

看起来实际要求是最多有8个
standard.exe
实例并行运行

@ECHO关闭
SETLOCAL
设置“sourcedir=U:\sourcedir”
设置“filename1=%sourcedir%\q57071663_c.txt”
设置/a块大小=5
对于/f“usebackqdelims=“%%a IN”(“%filename1%”)DO(
设置“jobinstr=%%a”
电话:sub
)
后藤:EOF
:sub
::等待30秒(29+1)以确保上次启动的作业处于活动状态
超时/t 5>NUL 2>NUL
:delay1
超时/T1>NUL2>NUL
::Count#times critical.exe在任务列表中
设置/a活动=0
::对于/f%%c IN('tasklist^ findstr/b“standard.exe”^ find/c“standard.exe”),请将其设置为活动=%c
对于/f%%c IN('tasklist/v^ | findstr/b“cmd.exe”^ | find/c“q57071663”'),请将活动设置为%%c
回显%active%实例处于活动状态
如果%active%geq%blocksize%GOTO delay1
启动“%jobinstr%”命令/c“调用%jobinstr%”
后藤:eof
您需要更改
sourcedir
的设置以适应您的环境。清单使用了适合我的系统的设置

我使用了一个名为
q57071663_c.tx的文件
@echo off
setlocal
set "lock=%temp%\wait%random%.lock"

:: Launch 8 files asynchronously, with stream 9 redirected to a lock file.
:: The lock file will remain locked until the script ends.
start "" cmd /c 9>"%lock%1" one.bat
start "" cmd /c 9>"%lock%2" two.bat
start "" cmd /c 9>"%lock%3" three.bat
start "" cmd /c 9>"%lock%4" four.bat
start "" cmd /c 9>"%lock%5" five.bat
start "" cmd /c 9>"%lock%6" six.bat
start "" cmd /c 9>"%lock%7" seven.bat
start "" cmd /c 9>"%lock%8" eight.bat

:Wait for all scripts to finish (wait until lock files are no longer locked)
1>nul 2>nul ping /n 2 ::1
for %%N in (1 2 3 4 5 6 7 8) do (
  ( rem
  ) 9>"%lock%%%N" || goto :Wait
) 2>nul

::delete the lock files
del "%lock%*"

:: Launch 8 files asynchronously, with stream 9 redirected to a lock file.
:: The lock file will remain locked until the script ends.
start "" cmd /c 9>"%lock%1" nine.bat
start "" cmd /c 9>"%lock%2" ten.bat
start "" cmd /c 9>"%lock%3" eleven.bat
start "" cmd /c 9>"%lock%4" twelve.bat
start "" cmd /c 9>"%lock%5" thirteen.bat
start "" cmd /c 9>"%lock%6" fourteen.bat
start "" cmd /c 9>"%lock%7" fifteen.bat
start "" cmd /c 9>"%lock%8" sixteen.bat

:Wait for all scripts to finish (wait until lock files are no longer locked)
1>nul 2>nul ping /n 2 ::1
for %%N in (1 2 3 4 5 6 7 8) do (
  ( rem
  ) 9>"%lock%%%N" || goto :Wait
) 2>nul

::delete the lock files
del "%lock%*"

:: Launch three and four asynchronously
start "" cmd /c seventeen.bat
start "" cmd /c eighteen.bat
start "" cmd /c nineteen.bat
start "" cmd /c twenty.bat
start "" cmd /c twenty-one.bat
start "" cmd /c twenty-two.bat
start "" cmd /c twenty-three.bat
start "" cmd /c twenty-four.bat
@ECHO OFF
SETLOCAL
SET "delay=%1"
:: IF no delay defined, random 3..19 secs
IF NOT DEFINED delay SET /a delay=3+(%RANDOM% %% 17)
timeout /t %delay% >NUL 2>NUL