Windows使用bat腳本實現軟件進程檢測(服務守護進程)
[重要通告]如您遇疑難雜癥,本站支持知識付費業務,掃右邊二維碼加博主微信,可節省您寶貴時間哦!
寫這篇文章還是前段時間因為一個守護進程的事兒,一直想著如何能處理更簡潔,有想用軟件的,有喜歡Bat的,不過不管是哪種方式,只要能解決問題才是最好的;
Windows進程監控(守護)小工具(Process Monitor)以及其他小軟件-Bat腳本實現監控進程功能
下面是記錄的一些手機bat腳本命令以及服務
批處理文件,在DOS和Windows(任意)系統中,.bat文件是可執行文件,由一系列命令構成,其中可以包含對其他程序的調用。這個文件的每一行都是一條DOS命令(大部分時候就好像我們在DOS提示符下執行的命令行一樣),你可以使用DOS下的Edit或者Windows的記事本(notepad)等任何文本文件編輯工具創建和修改批處理文件。
bat實現守護?腳本代碼:
@echo off :run :: 標題定義 title sanxingtest :: 當前路徑 set strPath=%~dp0 :: 帶絕對路徑的文件名 set strFile=%strPath%%date:~0,4%%date:~5,2%%date:~8,2%.log :: 輸出時間到文件 echo [%time%] >>%strFile% :: 輸出計算器的進程信息到文件 :: tasklist -nh -fo csv -fi "IMAGENAME eq WeChat.exe" >>%strFile% tasklist -fi "IMAGENAME eq WeChat.exe" >>%strFile% :: 下面是檢查進程是否存在,不存在啟動當前路徑下的腳本文件1.bat tasklist|find /i "WeChat.exe" if %errorlevel%==0 ( echo 微信已存在 ) else ( echo 微信不存在,啟動 start /d"C:/Program Files (x86)/Tencent/WeChat" WeChat.exe ) :: 定時10秒 choice /t 10 /d y /n >nul goto run
go start實現:
:start choice /t 10 /d y /n >nul tasklist|find /i " WeChat.exe" if %errorlevel%==0 ( echo 微信已存在 ) else ( echo 微信不存在,啟動 start /d"C:/Program Files (x86)/Tencent/WeChat" WeChat.exe ) goto start
小拓展
1、bat文件執行亂碼問題
解:修改編碼格式為ANSIode>
2、后臺運行bat文件
@echo off if "%1"=="h" goto begin start mshta vbscript:createobject("wscript.shell").run("""%~nx0"" h",0)(window.close)&&exit :begin ::下面是你的代碼。
3、linux java進程檢測
#!/bin/sh while true;do count=`ps -ef|grep java|grep -v grep` if [ "$?" != "0" ];then echo "java is running" else echo "java is stop..." break fi sleep 10 done
4、清理垃圾??命令代碼如下:
@echo off echo 正在清除系統垃圾文件,請稍等...... del /f /s /q %systemdrive%\*.tmp del /f /s /q %systemdrive%\*._mp del /f /s /q %systemdrive%\*.log del /f /s /q %systemdrive%\*.gid del /f /s /q %systemdrive%\*.chk del /f /s /q %systemdrive%\*.old del /f /s /q %systemdrive%\recycled\*.* del /f /s /q %windir%\*.bak del /f /s /q %windir%\prefetch\*.* rd /s /q %windir%\temp & md %windir%\temp del /f /q %userprofile%\cookies\*.* del /f /q %userprofile%\recent\*.* del /f /s /q "%userprofile%\Local Settings\Temporary Internet Files\*.*" del /f /s /q "%userprofile%\Local Settings\Temp\*.*" del /f /s /q "%userprofile%\recent\*.*" echo 清除系統垃圾文件完成! pause
5、網絡設置
@echo off ::判斷本地連接賦值a for /f "tokens=3,4 delims== " %%i in ('ipconfig ^|findstr /r "本"') do echo %%i %%j >DNS.txt for /f "tokens=1 delims==:" %%d in (DNS.txt) do set a=%%d echo 請根據實際情況更改下面三行 set slection1= set/p slection1=請輸入IP地址: netsh interface ip set address name="%a%" source=static addr=%slection1% mask=255.255.255.0 set slection2= set/p slection2=請輸入網關地址: netsh interface ip set address name="%a%" gateway=%slection2% gwmetric=0 set slection3= set/p slection3=請輸入主dns地址 netsh interface ip set dns name="%a%" source=static addr=%slection3% register=PRIMARY set slection4= set/p slection4=請輸入備份dns地址 netsh interface ip add dns name="%a%" addr=%slection4% netsh interface ip set wins name="%a%" source=static addr=none del DNS.txt exit 改完IP后可用這個完成本機ARP的綁定: @echo off if exist ipconfig.txt del ipconfig.txt ipconfig /all >ipconfig.txt if exist phyaddr.txt del phyaddr.txt find "Physical Address" ipconfig.txt >phyaddr.txt for /f "skip=2 tokens=12" %%M in (phyaddr.txt) do set Mac=%%M if exist IPAddr.txt del IPaddr.txt find "IP Address" ipconfig.txt >IPAddr.txt for /f "skip=2 tokens=15" %%I in (IPAddr.txt) do set IP=%%I arp -s %IP% %Mac% del ipaddr.txt del ipconfig.txt del phyaddr.txt exit
6、調用bat時動態傳參??內容如下:
@echo off set username = %1% set password = %2% start java -jar test.jar %username% %password%
7、背景顏色窗口大小設置
color 1F – 設置顏色,1F前面表示背景顏色,后面表示字體顏色,代表顏色如下:
0=黑、1=藍、2=綠、3=淺綠、4=紅、5=紫、6=黃、7=白、8=灰、9=淡藍、A=淡綠、B=淡淺綠、C=淡紅、D=淡紫、E=淡黃、F=亮白
mode con cols=100 lines=60 – 設置窗口大小,cols表示寬度,lines表示高度
windows下bat批處理實現守護進程(有日志)
實現:檢查是否有notepad,要用的話就換成自己的進程名,如果進程宕了就過會自動重啟(會在當前目錄下生成一個start.bat)
@echo off set _task=notepad.exe set _svr=c:/windows/notepad.exe set _des=start.bat :checkstart for /f "tokens=5" %%n in ('qprocess.exe ^| find "%_task%" ') do ( if %%n==%_task% (goto checkag) else goto startsvr ) :startsvr echo %time% echo ********程序開始啟動******** echo 程序重新啟動于 %time% ,請檢查系統日志 >> restart_service.txt echo start %_svr% > %_des% echo exit >> %_des% start %_des% set/p=.nul echo . echo Wscript.Sleep WScript.Arguments(0) >%tmp%/delay.vbs cscript //b //nologo %tmp%/delay.vbs 10000 del %_des% /Q echo ********程序啟動完成******** goto checkstart :checkag echo %time% 程序運行正常,10秒后繼續檢查.. echo Wscript.Sleep WScript.Arguments(0) >%tmp%/delay.vbs cscript //b //nologo %tmp%/delay.vbs 10000 goto checkstart
這個腳本提供兩種方式守護:
一種是通過進程名,但對于進程名都是java.exe的java程序不適用;
另一種是通過netstat查找應用程序所監聽的端口是否正在被監聽。
這兩種方式可以在腳本中通過兩個冒號注釋來選擇切換。下面是設置成通過端口來守護的,當端口沒被監聽則打開一個zip文件,所以運行后會發現沒過5秒會重復打開這個zip文件,除非這個zip文件打開后會自動監聽8080端口,那當然是不可能的!腳本涉及的命令就不解釋了搜一下就知道了。
@echo off ::檢測時間間隔,單位:秒 set _interval=5 ::需要守護的進程名稱 set _processName=WinRAR ::需要守護的進程啟動命令 set _processCmd=C:ideavim-0.32.zip ::需要守護的進程預估啟動完畢所需時間,單位:秒 set _processTimeout=10 ::需要守護的進程所監聽的端口 set _port=8080 ::進程用戶名,一般是Administrator set _username=Administrator :LOOP set /a isAlive=false ::通過進程名稱檢測 ::tasklist /FI "username eq %_username%" | find /C "%_processName%" > temp.txt ::set /p num= < temp.txt ::del /F temp.txt ::通過進程的端口是否正在被監聽檢測 netstat -an | find /C "0.0.0.0:%_port%" > temp.txt set /p num= < temp.txt del /F temp.txt if "%num%" == "0" ( start %_processCmd% | echo 啟動 %_processName% 于 %time% choice /D y /t %_processTimeout% > nul ) if "%num%" NEQ "0" echo 已啟動 ::ping -n %_interval% 127.1>nul choice /D y /t %_interval% >nul goto LOOP
該腳本運行后會出現一個dos窗口,若覺得礙眼可以用記事本將下面保存為擴展名為.vbs的文件。其中guard.bat是上面批處理保存的文件名。兩個文件放在同一目錄下雙擊vbs文件后,守護進程就在后臺運行了,單這樣得通過資源管理器結束cmd進程才能停止守護進程。
set ws=WScript.CreateObject("WScript.Shell") ws.Run "guard.bat",0
根據上面的內容自己修改一個放到項目上使用:
1)可以根據參數,執行指定的程序
2)可以保存詳細的執行日志
echo off title processWatch cls set d=%date:~0,10% set d=%d: =0% echo %d% set logFile=.processWatch_%d:-=%.txt echo 現在時間:%date%%time% echo ********程序開始啟動******** >> %logFile% set runAppPath=%1 set runAppPath="C:UsersAdministratorDesktop新建文件夾Cares.AutoUpdate.exe" set runAppFolder='' if '%runAppPath%'=='' (goto end) set _processName='' set _processNameExt='' ::檢測時間間隔,單位:秒 set _interval=10 for %%a in (%runAppPath%) do ( set _processName=%%~na set _processNameExt=%%~nxa set runAppFolder=%%~dpa ) goto checkstart rem 以下是測試代碼 echo %_processName% echo %_processNameExt% echo %runAppFolder% echo %runAppPath% echo ==================================================== goto end :checkstart set d=%date:~0,10% set d=%d: =0% set logFile=.processWatch_%d:-=%.txt for /f "tokens=1" %%n in ('tasklist.exe ^| find /I "%_processNameExt%" ') do ( if '%%n'=='%_processNameExt%' (echo 檢查進程【%_processNameExt%】正在運行 >> %logFile% && goto checkend) ) echo 檢查進程【%_processNameExt%】未在運行 >> %logFile% :startApp echo, && echo ********開始啟動程序******** echo ********開始啟動程序******** >> %logFile% echo [%date:~0,10%%time:~0,8%] 未檢測到【%_processNameExt%】的進程,將重新啟動程序 >> %logFile% echo [%date:~0,10%%time:~0,8%] 重新啟動程序:%runAppPath% echo [%date:~0,10%%time:~0,8%] 重新啟動程序:%runAppPath% >> %logFile% echo 開始執行 start "" %runAppPath% >> %logFile% pushd %runAppFolder% start "" %runAppPath% popd echo ********啟動程序完成******** && echo, echo ********啟動程序完成******** >> %logFile% echo, >> %logFile% :checkend echo [%date:~0,10%%time:~0,8%] 程序【%_processNameExt%】運行正常,%_interval%秒后繼續檢查...... choice /t %_interval% /d y /n >nul goto checkstart :end echo end.
線上運行的windows服務有時候可能會掛掉,又不確定掛掉的原因,目前的辦法是在服務器上運行守護進程,監控服務一旦停止盡快重啟,用一個bat批處理來簡單實現此監控:
Windows服務守護進程bat批處理腳本
@echo off title "Elasticsearch 主服務(windows 服務)"守護進程【若需停止服務請先臨時關閉此進程】 rem 定義循環間隔時間和監測的服務: set secs=60 set srvname="es-master" set showname="Elasticsearch 主服務" echo. echo ======================================== echo == 查詢計算機服務的狀態, == echo == 每間隔%secs%秒種進行一次查詢 == echo == 如發現其停止,則立即啟動 == echo ======================================== echo. echo 此腳本監測的服務是:%showname% echo. if %srvname%. == . goto end :chkit set svrst=0 for /F "tokens=1* delims= " %%a in ('net start') do if /I "%%a %%b" == %srvname% set svrst=1 if %svrst% == 0 net start %srvname% set svrst= echo 檢測時間:%date:~0,10% %time:~0,8% rem 下面的命令用于延時,否則可能會導致 cpu 單個核心滿載。 ping -n %secs% 127.0.0.1 > nul goto chkit :end
腳本不間斷監控notepad.exe,若停止,則自動重啟,程序如下:
@echo off set _task = notepad.exe set _svr = c:\windows\notepad.exe set _des = start.bat :checkService for /f "tokens=5" %%n in ('qprocess.exe ^| find "%_task%" ') do ( if %%n==%_task% (goto checkMessage) else goto restartService ) :restartService echo %time% echo ********程序開始啟動******** echo 程序重新啟動于 %time% ,請檢查系統日志 >> restart_service.txt echo start %_svr% > %_des% echo exit >> %_des% start %_des% REM set /p=.nul echo . del %_des% /Q echo ********程序啟動完成******** goto checkService :checkMessage echo %time% 程序運行正常,5秒后繼續檢查.. ping localhost -n 5 goto checkService
實現批處理文件每隔一段時間運行一次
需求說明:實現雙擊一個批處理文件,每隔一個小時啟動exe文件
實現步驟:
新建一個文本文檔 run.txt
復制以下代碼到run.txt文件中
更改文件后綴txt為bat,雙擊啟動
@echo off set INTERVAL=3600 :Again echo start server taskkill /f /t /im demo.exe C: cd C:\Users\Denison\Desktop\Demo start demo.exe timeout %INTERVAL% goto Again
詳細說明:就上述代碼做詳細說明
1、@echo off :關閉回顯,即關閉批處理文件在DOS中一行一行命令的顯示
2、set INTERVAL=3600 :設置間隔時間參數,單位秒,3600即一個小時
3、:Again ~ goto Again :":"是一個標簽,"goto"是一個跳轉命令,和循環的效果一樣
4、echo start server:回顯,即將echo后面的內容現在在DOS中
5、taskkill /f /t /im demo.exe:強制關閉名為demo.exe的進程
6、C::回到C盤的根目錄
7、cd C:\Users\Denison\Desktop\Demo:進入后面的路徑目錄
8、start demo.exe:運行當前目錄中的demo.exe文件
9、timeout %INTERVAL%:暫停命令 后面是上面設置的時間參數
問題未解決?付費解決問題加Q或微信 2589053300 (即Q號又微信號)右上方掃一掃可加博主微信
所寫所說,是心之所感,思之所悟,行之所得;文當無敷衍,落筆求簡潔。 以所舍,求所獲;有所依,方所成!