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