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)潔。 以所舍,求所獲;有所依,方所成!

支付寶贊助
微信贊助

免責(zé)聲明,若由于商用引起版權(quán)糾紛,一切責(zé)任均由使用者承擔(dān)。

您必須遵守我們的協(xié)議,如您下載該資源,行為將被視為對(duì)《免責(zé)聲明》全部?jī)?nèi)容的認(rèn)可->聯(lián)系老梁投訴資源
LaoLiang.Net部分資源來(lái)自互聯(lián)網(wǎng)收集,僅供用于學(xué)習(xí)和交流,請(qǐng)勿用于商業(yè)用途。如有侵權(quán)、不妥之處,請(qǐng)聯(lián)系站長(zhǎng)并出示版權(quán)證明以便刪除。 敬請(qǐng)諒解! 侵權(quán)刪帖/違法舉報(bào)/投稿等事物聯(lián)系郵箱:service@laoliang.net
意在交流學(xué)習(xí),歡迎贊賞評(píng)論,如有謬誤,請(qǐng)聯(lián)系指正;轉(zhuǎn)載請(qǐng)注明出處: » Windows使用bat腳本實(shí)現(xiàn)軟件進(jìn)程檢測(cè)(服務(wù)守護(hù)進(jìn)程)

發(fā)表回復(fù)

本站承接,網(wǎng)站推廣(SEM,SEO);軟件安裝與調(diào)試;服務(wù)器或網(wǎng)絡(luò)推薦及配置;APP開(kāi)發(fā)與維護(hù);網(wǎng)站開(kāi)發(fā)修改及維護(hù); 各財(cái)務(wù)軟件安裝調(diào)試及注冊(cè)服務(wù)(金蝶,用友,管家婆,速達(dá),星宇等);同時(shí)也有客戶管理系統(tǒng),人力資源,超市POS,醫(yī)藥管理等;

立即查看 了解詳情