在使用计划任务启动kettle任务的过程中,发现任务在后台卡住的情况。因为没有界面,所以一直占用内存,卡住的任务越多,就导致新的任务无法启动。

对于这种情况,发现计划任务中配置的,如果任务执行超过三天就结束任务并没有生效。所以需要再考虑其他的方式解决这个问题。
就考虑自己写一个脚本定时执行,获取java进程中执行时间最长的pid,超过某个时间,停掉这个任务。
修改kitchen进程名称
当我们启动一个任务的时候,执行的是一个java进程。但是因为我们还有tomcat等其他的java进程,所以不能直接停java,就考虑修改我们kettle任务执行的名称。
修改jdk中java进程名称
因为kettle需要特定版本jdk,所以jkd并不是使用环境变量中的,是我写死再spoon.bat/spoon.sh中的。所以我们可以直接修改配置好的jdk的bin路径中java.exe的名称,这里我改成了kettle_java.exe 。
修改kettle文件
进入kettle路径D:\Soft\kettle\data-integration
1.找到文件set-pentaho-env.bat
修改文件中的java.exe,改为kettle_java.exe

2. 找到文件spoon.bat
修改文件中所有的java.exe,改为kettle_java.exe

修改的这些配置不会影响界面的kettle,因为界面启动的进程是javaw.exe。脚本执行的kettle进程名称就改为kettle_java.exe了。
编写powershell脚本停止超时任务
原本想直接在之前的bat文件中编写,发现还是无法停止任务,所以还是使用powershell脚本解决这个问题。
获取执行时间最长的kettle_java.exe进程pid和starttime,如果执行时间超过120秒,就停止这个pid。脚本内容如下:
# 获取所有kettle_java.exe进程
$processes = Get-Process kettle_java
# 初始化最长运行时间和对应的进程
$max_runtime = 0
$longest_pid = $null
# 遍历所有进程
foreach ($process in $processes) {
# 计算进程运行时间(秒)
$runtime = ((Get-Date) - $process.StartTime).TotalSeconds
# 如果运行时间超过当前最长运行时间,就更新最长运行时间和对应的进程
if ($runtime -gt $max_runtime) {
$max_runtime = $runtime
$longest_pid = $process.Id
}
}
# 如果最长运行时间超过120秒,就结束对应的进程
if ($max_runtime -gt 120) {
Stop-Process -Id $longest_pid -Force
}
这样我们将脚本保存为.ps1后缀。再编写一个bat文件执行这个脚本,内容如下:
:: @echo off 后面是文件的绝对路径
powershell -ExecutionPolicy Bypass -File "C:\Users\Administrator\Desktop\KILL.ps1"
最后还是使用计划任务,执行这个bat脚本就可以了,定时执行,就可以防止任务卡死的情况占用内存了。
