Section 0. 背景说明:

在进行自己的程序数次执行和不断优化的过程中,或者不断跑网络训练的过程中,尤其是程序规模大任务耗时的时候(注:程序很大,也很耗硬件资源,资源有限,只能一个一个跑),人工守着前一个任务跑完再手动执行下一个,这样的做法——笨!也浪费了自己的宝贵时间。我最近遇到了这样的问题,想着几年前用linux的时候定时后台执行任务的脚本挺常用的,如今到了windows平台下,就果断决定自己写一个这样的windows脚本(batch file, 批处理文件)来“智能地管理自己指定的任务进程”。

Section 1. 简单描述:

“智能地管理自己指定的任务进程”,简单来说,就是写一个脚本,不断地检测前一个任务进程执行完毕与否,待前一个任务进程完毕后,再自动跳转去执行脚本所指定的下一个任务即可。一般一个任务需要跑好几个小时甚至好多天,这样以来,这几天内自己就不用操心和手动去执行自己的程序了,还可以再增加个重定向,到时拿日志和运行结果即可。想更省事儿的话就是一下子把需要执行的所有任务都依次写进脚本即可。

Section 2. 程序示例:

demo(autoRunScript.cmd)如下:

::#@autoRunScript.cmd(or .bat).
::##//%%automatical shell/script for windows, By SpeedyZJF

::  --------------------------------------------------
@echo off 
echo [0].NAME:autoRunScript.cmd(or .bat)
set  CUR_DIR=%~f0
echo     NOTE:This is an automatical running shell/script for windows, By SpeedyZJF
echo     LOCATION: %CUR_DIR%
echo     HOSTNAME:%computername%
echo     USERNAME:%username%
echo     RANDINTNUM:%random%
echo.

rem --------------------------------------------------
echo     CURRENT OS TIME[START]:
echo     %date%%time%
echo.   
::pause

rem --------------------------------------------------
echo [1].Check the related processID.

::******************** 这里输入要检测的进程***************
set Program="calc.exe"
::******************** 这里输入要检测的进程***************

set /a runCallingCode=0
set /a tmpLoopCounter=0
set /a totalCounter=1
:loopCheck
tasklist -v | findstr %Program% > NUL
if ErrorLevel 1 (
  echo     The process %Program% is not existing. %date%%time%
  set /a runCallingCode=1
  goto end
  ) else (
  if %tmpLoopCounter%==10 (
  echo     %totalCounter%.The process %Program% is existing. Keep Checking. %date%%time%
  set /a totalCounter+=1
  set /a tmpLoopCounter=0
  )
  set /a runCallingCode=0
  set /a tmpLoopCounter+=1
  ping -n 1 LOCALHOST >NUL
  goto loopCheck
)
:end
echo.   

rem --------------------------------------------------
echo [2].Check over. Start the Schedule Task.
if %runCallingCode%==1 (
  echo     Begin to run the Schedule Task.
  echo     %date%%time%
  goto schtasks01
) else (
  echo     The related process is busy now. Don't run the Schedule Task.
  goto :eof
)

:schtasks01

::******************** 这里输入要执行的进程***************
set tskFullStr="E:\SpeedyZJF\Codes\C_CDoublePlus\DynamicPGSSolver_V6.3DST\Release\DynamicPGSSolver.exe"
if not exist %tskFullStr% (
	echo     The Schedule Task bin file is missing. EXITING NOW.
	pause
	goto :eof
)
echo.
::start "" %tskFullStr%
%tskFullStr%
echo.
set tskKeyStr="DynamicPGSSolver.exe"
tasklist -v | findstr %tskKeyStr% > NUL
if ErrorLevel 1 (
  echo     The schtasks01 running over. 
  goto endtime
  ) else (
  echo     The schtasks01 keeps running now.
  
)
goto :eof

:endtime
rem --------------------------------------------------
echo.    
echo     CURRENT OS TIME[OVER]:
echo     %date%%time%
goto :eof

Section 3. 补充说明:

最终自己测试的效果基本达标了,作为基本的demo满足要求,有其他需要可再增加其他内容,或者直接用windows自带的schtasks.exe(windows定时任务设置)也可以整出来类似的效果。附一张自己的测试结果图如下,Make a difference, 分享完毕。

当calc.exe运行时(即打开自带的计算器):

windows 监控进程 模块 内存占用 windows监控进程脚本_自动跑程序脚本

当关闭计算器后(模拟calc.exe运行完毕),脚本1秒左右能及时检测到,并作出反应,执行下一个指定好的目标任务程序:

windows 监控进程 模块 内存占用 windows监控进程脚本_自动跑程序脚本_02