项目场景:
`windows server 2016 添加定时任务
背景:给一个jar 包 在任务计划程序中创建一个定时重启的任务
问题描述
在创建定时任务后手动运行定时任务失败没有反应
一开始用的时根据服务名杀掉进程,手动执行脚本没有问题,在定时任务中手动运行没有问题(选择:只在用户登录时运行)脚本命令如下
@echo off
title "operation工程服务"
for /f "delims= " %%a in ('jps -lv ^| find /i "micro-modules-operation.jar"') do set PID=%%a
taskkill /f /PID %PID%
ping 127.0.0.1 -n 20
echo 该进程已结束
start java -Dfile.encoding=utf-8 -Xmx512m -Xms512m -jar D:\project\nginx_web\oneplatform\micro-modules-operation.jar
原因分析:
根据服务名选择杀掉进程失败后(没搞明白为什么根据服务名taskkill 进程不行),选择换一种方式根据端口杀掉进程 脚本内容如下
@echo off
title "operation工程服务"
set port=8087
for /f "tokens=1-5" %%a in ('netstat -ano ^| findstr ":%port%"') do (
echo 占用的进程号为%%e
taskkill /f /pid %%e
echo 已经杀死 %%e
)
start java -Dfile.encoding=utf-8 -Xmx512m -Xms512m -jar D:\project\nginx_web\oneplatform\micro-modules-operation.jar
调整了定时任务选项不管用户是否登录都要运行脚本,并且选择最高权限运行,且在设置中选择:停止现有实例 (注意选择用户是否登录选项 jar 包运行是不会弹出dos 窗口)设置内容如下图所示
![在这里插入图片描述](https://img-blog.csdnimg.cn/59633d0f8be840498df061d25aec4164.png
原因分析:
定时任务能够正常启动脚本,后操作几次发现,定时任务启动服务无法关闭手动执行脚本启动的服务,反之一样,该服务没有办法关闭,排查后发现,需要获取到超级管理员的权限才能正常关闭掉定时任务启动的服务或者手动执行脚本启动的服务,修改脚本,添加获取超级管理员权限,内容如下
@echo off
title "operation工程服务"
%1 mshta vbscript:CreateObject("Shell.Application").ShellExecute("cmd.exe","/c %~s0 ::","","runas",1)(window.close)&&exit
set port=8087
for /f "tokens=1-5" %%a in ('netstat -ano ^| findstr ":%port%"') do (
echo 占用的进程号为%%e
taskkill /f /pid %%e
echo 已经杀死 %%e
)
start java -Dfile.encoding=utf-8 -Xmx512m -Xms512m -jar D:\project\nginx_web\oneplatform\micro-modules-operation.jar
原因分析:
现在发现服务启动不管是定时任务还是脚本执行都可以正常启动。
操作几次后发现,该任务的重启会关闭掉另一个一直请求他的服务,通过排查发现,根据端口查询,一直请求的他服务也在其中 状态为Establised 如下图所示 再次修改脚本内容,根据端口的listening 的状态来查询
@echo off
title "operation工程服务"
%1 mshta vbscript:CreateObject("Shell.Application").ShellExecute("cmd.exe","/c %~s0 ::","","runas",1)(window.close)&&exit
set port=8087
netstat -ano |find /i "listening" | findstr ":%port%" >C:\Users\14848\Desktop\pc\tet.log
for /f "tokens=5" %%A in (C:\Users\14848\Desktop\pc\tet.log) do (
taskkill /f /pid %%A
echo 进程已关闭
)
start java -Dfile.encoding=utf-8 -Xmx512m -Xms512m -jar D:\project\nginx_web\oneplatform\micro-modules-operation.jar
本来想着利用管道的方式for 循环中写成如下所示但是发现 FINDSTR无法打开 | 所以换了个方式,先把查询到的进程放到 放到一个文件中,然后再从文件中获取到相关的内容for 循坏他,每次的结果都会覆盖原来文件中的内容,如上代码所示
for /f "tokens=5" %%A in ('netstat -ano |find /i "listening" | findstr ":%port%"') do (
taskkill /f /pid %%A
echo 进程已关闭
)
注:
1:选择不管是否登录都要运行,不会弹出窗口
2:定时任务中启动如果无法关闭手动启动的服务需要或许超级管理员权限
3:关闭进程时不要关闭了其他的进程,所以写脚本的时候还是需要多注意一些
写文章的时候听的歌名为:爱要怎么说出口(女声版)
山有木兮木有枝,心悦君兮君不知。