1. 程式人生 > >bat批處理命令檢視兩個程序是否存在

bat批處理命令檢視兩個程序是否存在

第一次接觸window下的批處理,領導要求寫兩個bat 批處理檔案 互相守護 同時保證兩個埠是執行的。
但是這倆個程序是相同的名稱。
第一次嘗試:
a.bat
判斷當前是否有當前任務的程序
如果有 判斷數量,呼叫B.bat
如果不存在 啟用兩個bat 呼叫要啟動的程式 返回再判斷。

@echo off

goto start 

:start
tasklist -v | findstr /i netsafe_log > NUL  
if ErrorLevel 1 (
 echo  啟動兩個埠程序 程序不存在
 call G:\BAT\start4437.bat
 call G
:\BAT\start5775.bat goto start ) else ( echo "程序存在" rem for /f %%i in ('tasklist^|findstr /i netsafe_log ) do set /a n+=1 rem if %n% EQU 2 ( echo 兩個程序存在 call G:\BAT\AAA\CheckRunning.bat )

B.bat

@echo off

goto start 

:start
tasklist -v | findstr /i netsafe_log > NUL  
if ErrorLevel
1 ( echo 啟動兩個埠程序 程序不存在 call G:\BAT\start4437.bat call G:\BAT\start5775.bat goto start ) else ( echo "程序存在" rem for /f %%i in ('tasklist^|findstr /i netsafe_log ) do set /a n+=1 rem if %n% EQU 2 ( echo 兩個程序存在 call G:\BAT\AAA\checkprocess.bat )

網上還有用telnet.exe 存在狀態來判斷 埠是否是通的,但是這種方法不好,因為一旦加入系統服務,bat檔案會殺死所有的telnet.exe 會導致 宿主機上的telnet.exe 無法應用,程式碼如下
mainfin.bat

@echo off

goto panduan
:panduan
start /min  telnet.exe 127.0.0.1 5775 
ping -n 5 127.1>nul
tasklist|find /i "telnet.exe" > nul
if %ERRORLEVEL% EQU 0 ( 
GOTO ok ) else ( 
echo 4337 service err
goto err  )
:err
call G:\BAT\start5775.bat
goto panduan
:ok
echo 這裡殺死了 telnet.exe 
taskkill /F /IM telnet.exe > nul
call G:\BAT\addfin.bat

addfin.bat

@echo off
goto panduan
:panduan
start /min  telnet.exe 127.0.0.1 4437 
ping -n 5 127.1>nul
tasklist|find /i "telnet.exe" > nul
if %ERRORLEVEL% EQU 0 ( 
GOTO ok ) else ( 
echo 4337 service err
goto err  )
:err
call G:\BAT\start4437.bat
goto panduan
:ok
taskkill /F /IM telnet.exe > nul
call G:\BAT\mainfin.bat

但是上面4個bat 檔案都是有問題的,問題在資源一直沒有釋放 而且所佔記憶體越來越多。 目前沒有想到解決辦法。 上面4個程式都不能解決時時檢測埠的功能,雖然a.bat成功檢測到了程式是否在程序中,但是程式在程序中不代表程式的埠的執行狀態。 需要再次改進
2017年10月7日11:33:53
改進的辦法是 用netstat 檢視埠是在執行狀態 如果是執行則繼續迴圈 如果不在 則進行重啟

@echo off
title CheckRunning

goto panduan

:panduan
ping -n 5 127.1>nul
netstat -ano | findstr ".*:5775\>" 
rem netstat -ano | findstr  0.0.0.0 | findstr 5775 | findstr LISTENING > nul
if %ERRORLEVEL% EQU 0 ( 
GOTO ok ) else ( 
echo 5775 service err
goto err  )

:err
call G:\BAT\start5775.bat
echo err 
goto panduan

:ok
echo ok 5775 ~~!!!
rem start/wait G:\BAT\final\CheckRunning.bat

ping -n 5 127.1>nul
netstat -ano | findstr ".*:4437\>" 
rem 可以加上判斷埠狀態的關聯
rem netstat -ano | findstr  0.0.0.0 | findstr 4437 | findstr LISTENING > nul 
if %ERRORLEVEL% EQU 0 ( 

GOTO ok4437 ) else ( 

echo 4437 service err4437
goto err4437  )

:ok4437
goto panduan

:err4437
call G:\BAT\final\CheckRunning.bat

@echo off
title checkprocess

goto panduan

:panduan

ping -n 5 127.1>nul
netstat -ano | findstr ".*:4437\>" 
rem netstat -ano | findstr  0.0.0.0 | findstr 5775 | findstr LISTENING > nul
if %ERRORLEVEL% EQU 0 ( 

GOTO ok ) else ( 

echo 4437 service err
goto err  )



:err
call G:\BAT\start4437.bat
echo err 
goto panduan


:ok
echo ok ~~!!!
call G:\BAT\final\checkprocess.bat
exit

最後隱藏 用vb

CreateObject("WScript.Shell").Run "cmd /c G:/BAT/final/checkprocess.bat",0