在Windows环境中,如果从不同的CMD环境调用,那么用于处理pipe道输出的可执行程序是否保证是唯一的任务?
例如,假设script1.cmd包含这一行:
echo "some logging information" | my_pipe_program >> logfile1.txt
还有script2.cmd包含这一行:
echo "some other information" | my_pipe_program >> logfile2.txt
如果脚本1和脚本2碰巧同时运行,Windows将调用my_pipe_program.exe的单独实例吗?
我得到一个零星的错误,其中一个命令脚本失败,并出现错误“进程无法访问该文件,因为它正在被另一个进程使用”这个错误总是发生在通过my_pipe_program.exepipe道的一行之后。
它会导致CMD脚本在该点停止,使CMD窗口保持打开状态。
冲突可能是与my_pipe_program.exe或它可能是logfile2.txt。 程序my_pipe_program.exe用于多个CMD文件,这些文件可能同时运行。 日志文件对于CMD文件是唯一的,所以它似乎不太可能是罪魁祸首,除非在CMD文件存在之后Windows没有closures它。 有没有办法来诊断问题并修复错误?
相关的问题 – 是否有任何方法来陷阱和处理“…被其他进程使用”错误,并防止CMD文件中止?
这听起来像这个EXE的问题,以及它如何处理在内存中同时运行的同一台机器上调用。 在这个级别启用高级日志logging来捕获详细的详细信息或堆栈跟踪,同时模拟同一台机器在内存中同时运行,就像问题发生时一样,可能是最准确的答案为什么这样做。
从超级用户那里看我的答案在这里( 超级用户 )从前一天如何杀死一个进程批处理,如果CMD或BAT文件是喜欢某个名字。
你可以合并类似的东西来检查,看看是否有一些已经运行一段时间的batch file的名称和杀死,但你必须看看WMIC其他选项,看看是否有一个计时器等如果这件事情在你的情况下工作。 修复EXE逻辑在这个级别,捕捉错误和结束可能是最好的,但如果你在这个级别的控制。
一个简单的解决scheme可能是在批处理CMD文件启动时创build一个锁文件,以便从同一台机器启动相同EXE所有脚本首先检查锁文件是否存在(如果存在),然后结束脚本暂停这么多分钟,然后再次检查等)。
你可以结束这个脚本[ GOTO locked ]或者暂停这么多秒钟,然后转到那个例程[ GOTO lockedrecheck ],然后再次检查另一个进程是否已经完成,并删除了这个文件。
如果locking文件不存在,它会创build该文件,然后运行该进程,并在完成时删除locking文件,以便其他进程可以运行(下面的示例)。
您也可以将2<&1添加到日志文件的末尾以获取更多详细信息,如果EXE允许以其他方式捕获它(例如下面的脚本逻辑)。
<ABOVE LOGIC> <ABOVE LOGIC> <ABOVE LOGIC> <ABOVE LOGIC> :SetLockFile ::SET check for, and create lock file to ensure concurrent runs aren't possible SET lockfile=\\server\share\lockfiles\my_pipe_program.lck IF EXIST %lockfile% GOTO locked ::IF EXIST %lockfile% GOTO lockedrecheck ECHO This file is locked until current %~nx0 script ends or finishes using the EXE >> %lockfile% ECHO "some logging information" | my_pipe_program >> %logfile% 2<&1 <More Logic> <More Logic> <More Logic> <More Logic> :end ECHO ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ >> %logfile% ECHO End: %date% at %time% >> %logfile% ECHO ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ >> %logfile% DEL /Q /F "%lockfile%" ENDLOCAL GOTO EOF :locked :: Come here to end the script since the lock file does exist ECHO + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +>> %logfile% ECHO LOCKED FILE: %~nx0 - %date% at %time%: FILE IS IN USE AND LOCKED >> %logfile% ECHO + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +>> %logfile% ENDLOCAL GOTO EOF :lockedrecheck :: Come here to Pause the script with a loopback ping to nul for 3 minutes or roughly 180 seconds PING 127.0.0.1 -n 180 > nul GOTO :SetLockFile
2<&1例子 echo "some logging information" | my_pipe_program >> logfile1.txt 2<&1