Bat再次小试

本文介绍了一个使用bat脚本解决Windows服务因数据库响应慢而无法正常重启的问题。通过修改bat文件内容,使用taskkill命令精准地杀死指定服务,并在重启前插入ping操作来避免误杀子进程。同时,利用筛选器参数进一步优化任务执行流程,确保服务成功重启。此外,文章还展示了如何结合Windows的任务计划功能实现定时任务,以及如何在bat文件中添加日志记录以监控执行过程。

《Bat小试牛刀》之后,今天又需要一个小的bat文件。需求是这样的,有一个windows服务(服务名:xxxx,进程映像名:xxxx.exe)被数据库拖慢了,但目前又没时间调整代码,所以打算定时重启,此需求看似不合理,实则比较无奈。

然而这个windows服务有很多子进程,通过net stop杀不死子进程或者杀的不及时,所以打算使用taskkill命令,所以我的bat文件是这样:

@echo off
taskkill /f /t /im xxxx.exe
net start xxxx

但由于taskkill和net start 操作间隔太近,导致服务没能成功重启,提示:

请求的服务已经启动。

因此故技重施,修改如下:

@echo off
taskkill /f /t /im xxxx.exe
ping -n 3 127.1>nul
net start xxxx

这样就好使了,但悲催的事情又来了,居然发现了两个进程映像名都是xxxx.exe的,上面的bat杀掉了两个进程:

成功: 已终止进程 "xxxx.exe",其 PID 为 6872。
成功: 已终止进程 "xxxx.exe",其 PID 为 10784。

好在taskkill提供了筛选器FI:

 筛选器名      有效运算符                有效值
 -----------   ---------------           -------------------------
 STATUS        eq, ne                    RUNNING |
                                         NOT RESPONDING | UNKNOWN
 IMAGENAME     eq, ne                    映像名称
 PID           eq, ne, gt, lt, ge, le    PID 值
 SESSION       eq, ne, gt, lt, ge, le    会话编号。
 CPUTIME       eq, ne, gt, lt, ge, le    CPU 时间,格式为
                                         hh:mm:ss。
                                         hh - 时,
                                         mm - 分,ss - 秒
 MEMUSAGE      eq, ne, gt, lt, ge, le    内存使用量,单位为 KB
 USERNAME      eq, ne                    用户名,格式为 [domain\]user
 MODULES       eq, ne                    DLL 名称
 SERVICES      eq, ne                    服务名称
 WINDOWTITLE   eq, ne                    窗口标题

于是修改bat如下:

@echo off
taskkill /f /t /fi "SERVICES eq xxxx"
ping -n 3 127.1>nul
net start xxxx

这下完全符合要求了^_^,然后利用windows自带的“任务计划”功能做个定时任务(使用NT AUTHORITY\SYSTEM运行,可以不用密码)。

但如果再加一个日志就更完美了,于是乎:

@echo off
set logfile=d:\log.txt
echo %date% %time% >> %logfile%
taskkill /f /t /fi "SERVICES eq xxxx" >> %logfile%
ping -n 3 127.1>nul
net start xxxx >> %logfile%

PS:
预定义的变量

下面是些已经被底层定义好可以直接使用的变量:不会出现在 SET 显示的变量列表中
%CD% - 扩展到当前目录字符串。
%DATE% - 用跟 DATE 命令同样的格式扩展到当前日期。
%TIME% - 用跟 TIME 命令同样的格式扩展到当前时间。
%RANDOM% - 扩展到 0 和 32767 之间的任意十进制数字。
%ERRORLEVEL% - 扩展到当前 ERRORLEVEL 数值。
%CMDEXTVERSION% - 扩展到当前命令处理器扩展名版本号。
%CMDCMDLINE% - 扩展到调用命令处理器的原始命令行。
%0 bat的完整路径名如"C:\Windows\system32\xxx.bat"
%1 bat参数1依次类推%2参数2...
%path% - 当前的环境变量。以分号隔开的路径列表,路径可包含空格,可以以'\'结尾, 可以以双引号包围之。


扩展变量

@ 与%i相关的变量(bat参数或者for循环的%i)
假设文件为C:\Documents and Settings\jinsun\桌面\ParseSinglePkgs.bat
%0        C:\Documents and Settings\jinsun\桌面\ParseSinglePkgs.bat
%~dp0  C:\Documents and Settings\jinsun\桌面\
%cd%   C:\Documents and Settings\jinsun\桌面
%~nx0   ParseSinglePkgs.bat
%~n0     ParseSinglePkgs
%~x0     .bat

@ 与%VAR%相关的变量
%VAR:str1=str2%   会将VAR中的str1替换为str2(str2如果为空则可以达到删除的效果,str1前可以加*,变量%ABC:*B=%是C)
%VAR:~0,-2%          会提取VAR 变量的所有字符,除了最后两个
%VAR:~2%              会提取VAR 变量的除前两个的所有字符
%VAR:~-2%             会提取VAR 变量的最后两个
%VAR:~2,5%           提取从第2个字符开始的5个字符

转载于:https://www.cnblogs.com/zhaiqianfeng/p/4621280.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值