有人会想到这样的解决方案吗? :
程序/脚本逻辑:它会不断监视Windows操作系统中的进程(*** 1.exe)(我猜它可以通过任务调度程序不断运行以进行持续监视?),同时它看到了*** 1.exe正在运行,它将杀死/结束另一个进程*** 2.exe,一旦*** 1.exe将消失,它将不再停止*** 2.exe进程
我认为它可以是bash脚本,PowerShell脚本还是Windows服务?
感谢!!!
答案 0 :(得分:2)
您可以使用Register-CimIndicationEvent
cmdlet注册Win32_ProcessStartTrace
WMI类引发的事件:
# Define which events to listen for
$NewProcessQuery = "SELECT ProcessId,ProcessName FROM Win32_ProcessStartTrace WHERE ProcessName LIKE '%1.exe'"
# Define the code to run every time a new process is created
$ProcessAction = {
# See if any instances of *2.exe processes are running
if(($TargetProcess = Get-CimInstance -ClassName Win32_Process -Filter "Name LIKE '%2.exe'"))
{
# Terminate them
$TargetProcess |Invoke-CimMethod -MethodName Terminate
}
}
# Register for the event
Register-CimIndicationEvent -Query $NewProcessQuery -SourceIdentifier ProcessCreated
答案 1 :(得分:0)
因此,由于上述解决方案仅适用于Windows 2012及更高版本,因此我决定尝试其他解决方案。这应该适用于常规流程,但是我必须尝试其他方法而不是%ERRORLEVEL%,因为我监控的进程最初是一个msi安装程序,看起来它一直返回并且errorlevel为1(正常进程返回0或1,具体取决于状态。我结束的过程自动开始备份,这就是这里没有启动服务命令的原因,超时设置为62秒,因为服务每60秒自动启动一次,如果想要消除用户输入启动它的可能性(如果在没有任务调度程序的情况下运行等),可以添加a / NOBREAK。
:loop_check
TIMEOUT /T 62
TASKLIST /FI "IMAGENAME eq process.exe" 2>NUL | find /I /N "process.exe">NUL
IF "%ERRORLEVEL%"=="0" (
GOTO stop_process2
) ELSE (
GOTO loop_check
)
:stop_process2
ECHO killing task
TASKKILL /F /IM process2.exe
GOTO loop_check
答案 2 :(得分:0)
在此之前阅读我之前的回复/评论,以便更清楚。这是对我有用的最终解决方案。星号(*)包含在'BeginningOfApplicationName'的末尾,因为我检测到的安装程序/ msi有时根据其版本有不同的名称,因此它会查找/完成结尾(通配符)。由于我正在监视的进程的名称可以有不同的名称,我无法将它与静态字符串进行比较,所以我将它与INFO进行比较:似乎那些windows(2008和2012!)都打印出来的时候找不到进程。
@ECHO OFF
SETLOCAL EnableExtensions
:loop_check
TIMEOUT /T 62
FOR /F %%x IN ('tasklist /NH /FI "IMAGENAME eq BeginningOfApplicationName*"') DO IF %%x == INFO: (
GOTO loop_check
) ELSE (
GOTO stop_process
)
:stop_process
TASKKILL /F /IM process.exe
GOTO loop_check