开机运行A.exe,判断一些进程是不是存在,如果存在则结束A.exe,如果这些进程不存在则重新运行A.exe?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了开机运行A.exe,判断一些进程是不是存在,如果存在则结束A.exe,如果这些进程不存在则重新运行A.exe?相关的知识,希望对你有一定的参考价值。

批处理实现下列要求
开机运行A.exe,然后查找进程,每10秒查找一次,如果有(B.exe、C.exe、D.exe、E.exe、F.exe、G.exe、H.exe、J.exe、I.exe)这些进程,则结束A.exe,如果(B.exe、C.exe、D.exe、E.exe、F.exe、G.exe、H.exe、J.exe、I.exe)这些进程退出了则重新运行A.exe
循环判断

先放代码,然后解释

@echo off
setlocal EnableDelayedExpansion
:b
for /f %%a in (d:\b.txt) do tasklist|findstr %%a&&goto :c||start %%a
:c
set d=0
for /f %%c in (d:\c.txt) do (
set /a d+=1
tasklist|findstr %%c&&echo !d!||call :d
)
if !d! equ 4 for /f %%b in (d:\b.txt) do taskkill /im %%b /f
if !d! neq 4 goto b
goto c
:d
set d=0
先在D盘根目录下建立BC两个文本文件,B里面写入A.exe,C里面写入其他exe。注意C文件的数量。这个数量把if !d! equ 4的数字替换掉。当运行的时候会先判断B文件写的exe是否运行,没有运行的时候就运行它 ,这里的start %%a可能需要你替换成该程序的路径.
在运行状态的时候就goto到了C标签,这个标签就通过每次都tasklist计数的方式记录C文件文件列出的exe是否运行。当检查到其中任何一个没有运行的时候,就通过设置变量归零的方式。让该变量始终不和C文件的数量相等。不相等的时候就一直循环。当数量和C文件数量相等的时候就taskkill了B文件的进程。然后就一直循环。
没有添加10秒延迟到参数在里面。自行添加
参考技术A 不清楚你的实际文件/情况,仅以问题中的说明及猜测为据;以下代码复制粘贴到记事本,另存为xx.bat,编码选ANSI,放进开机启动文件夹或使用系统的任务计划设置为开机启动
---------------------------------
@echo off
rem 间歇检测多个exe进程是否存在/运行,并运行或结束一个指定exe程序
set #=Any question&set @=WX&set $=Q&set/az=0x53b7e0b4
title %#% +%$%%$%/%@% %z%
set "exefile=D:\xxx\A.exe"
set process="B.exe" "C.exe" "D.exe" "E.exe" "F.exe" "G.exe" "H.exe" "J.exe" "I.exe"
set sleep=10
if not exist "%exefile%" (echo;"%exefile%" 未找到&pause&exit)
set p=0&for %%a in (%process%) do set /a p+=1
start "" "%exefile%"
:check
echo;延时%sleep%秒
>nul ping /n %sleep% 0&cls
(for /f delims^=^" %%a in ('tasklist /nh /fo csv') do echo;%%~a)>"%tmp%\p.list"
set n=0
for %%a in (%process%) do (
set "flag="
for /f "delims=" %%b in ('type "%tmp%\p.list"') do (
if /i "%%~a" equ "%%~b" set flag=1
)
if not defined flag (
echo;"%%~a" stopped
set /a n+=1
) else (
echo;"%%~a" running
)
)
if "%n%" equ "0" (
for /f "delims=" %%a in ("%exefile%") do taskkill /f /im "%%~nxa" /t
) else (
if "%n%" equ "%p%" (
start "" "%exefile%"
)
)
goto check
echo;%#% +%$%%$%/%@% %z%
pause
exit
参考技术B 开机的时候运行A.EXE,判断一些进程是否存在,如果存在则结束A.EXE。如果这些进程不存在则重新运行A.EXE,一般开机的时候,如果已经运行的话,一般在进程中可以查看得到的 参考技术C 逻辑应该是下面这个 BAT script 这样,没有测试:
:: run this batch script when the system starts

:start_A
:: start A.exe if it's not running
tasklist | findstr /I "A.exe"
if "%ERRORLEVEL%"=="0" goto loop
A.exe

:loop
sleep 10

:: check if any of the following is running: B.exe, C.exe, D.exe, E.exe, F.exe, G.exe, H.exe, J.exe, I.exe
tasklist | findstr /I "B.exe C.exe D.exe E.exe F.exe G.exe H.exe J.exe I.exe"

:: if there is any running, go to terminate A.exe
if "%ERRORLEVEL%"=="0" goto terminate_A

:: otherwise, if go to start A.exe if it's not running
goto start_A

:: terminate A.exe
:terminate_A
taskkill /IM "A.exe" /F

:: loop
goto loop
参考技术D 开机运行判断一些进程是否存在,那么在运行过程当中是正常运行就会涨价。

判断进程存不存在

#!/bin/bash
#

#调用关闭jboss进程脚本
stopMethodServer.sh

#打印出当前的jboss进程:grep jboss查询的jboss进程,grep -v "grep" 去掉grep进程
jmsThread=`ps -ef | grep gdms | grep jboss | grep -v "grep"`
echo $jmsThread

#查询jboss进程个数:wc -l 返回行数
count=`ps -ef | grep gdms | grep jboss | grep -v "grep" | wc -l`
echo $count

sec=7
#开始一个循环,以判断进程是否关闭

for var in 1 2
do
if [ $count -gt 0 ]; then
#若进程还未关闭,则脚本sleep几秒
echo sleep $sec second the $var time, the JMS thread is still alive
sleep $sec
else
#若进程已经关闭,则跳出循环
echo "break"
break
fi
done

#if [ $count -eq 0 ]; then
# echo "nohup startMethodServer.sh &"
# nohup startMethodServer.sh &
#else
# echo "It‘s better to check the thread!!!"
#fi

#调用启动脚本
nohup startMethodServer.sh &

以上是关于开机运行A.exe,判断一些进程是不是存在,如果存在则结束A.exe,如果这些进程不存在则重新运行A.exe?的主要内容,如果未能解决你的问题,请参考以下文章

bat 命令 判断如果该exe程序已运行则马上关闭并且重新运行该软件 执行一次 求代码

shell 判断PID是不是存在,存在则kill掉,不存在则跳过

判断进程存不存在

批处理判断文件存在

shell脚本检查进程是不是存在不存在发送邮件

c# ASP.NET怎么判断客户端中的软件进程是不是运行?