自动恢复挂起的Windows进程

时间:2014-07-22 21:39:28

标签: windows batch-file suspend

我正在尝试编写一个Windows批处理文件,以便恢复一个获得Suspended的Windows进程。我正在使用pssuspend(来自pstools)来恢复这个过程。但是,我正在尝试编写Windows批处理文件脚本,它将不断获取进程的状态(例如myExe.exe)。如果脚本没有被暂停,我希望它继续检查它是否被暂停。如果它被挂起,我希望它运行pssuspend代码。我不确定如何获得暂停状态。到目前为止,我有这个:

if myExe.exe == "Suspend" (
    pssuspend -r myExe.exe
    suspend_fix.bat
) else (
    suspend_fix.bat
)

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

Windows服务(使用正确的属性创建)可以暂停,但我不确定如何暂停可执行文件,或者你究竟是什么意思。

如果你的意思是 程序已经停止,那么你想要重新启动它,那么这里有几个代码块我已经用过了确定程序是否正在运行:

1) 通过检查 ,如果exe名称存在 ,即正在运行。
顺便说一句,我从你对你的帖子的解释中推荐这个:

BOOL ExeExists(char *exe)
{
    HANDLE pss = CreateToolhelp32Snapshot(TH32CS_SNAPALL, 0); 
    PROCESSENTRY32 pe = { 0 };
    pe.dwSize = sizeof(pe);
    if (Process32First(pss, &pe)) 
    {
        do
        {
            if (strstr(pe.szExeFile,exe))
            {
                CloseHandle(pss);
                return TRUE;
            }
        }
        while(Process32Next(pss, &pe));
    } 
    CloseHandle(pss);

    return FALSE;
}  

2) 检查 是否存在PID

BOOL PidExists(int pid)
{ 
    HANDLE pss = CreateToolhelp32Snapshot(TH32CS_SNAPALL, 0); 
    PROCESSENTRY32 pe = { 0 };
    pe.dwSize = sizeof(pe);
    if (Process32First(pss, &pe)) 
    {
        do
        {
            if (pe.th32ProcessID == pid)
            {
                CloseHandle(pss);
                return TRUE;
            }
        }
        while(Process32Next(pss, &pe));
    } 
    CloseHandle(pss);

    return FALSE;
}  

顺便说一句 这用于获取进程ID(在winbase.h中定义)
打电话的应用程序。

int GetProcessIdApp(void)
{
    return GetProcessId(GetCurrentProcess());//defined in WinBase.h
}  

在WinBase.h中

WINBASEAPI
DWORD
WINAPI
GetProcessId(
    __in HANDLE Process
    );  

在我的方案中 ,应用程序在启动时广播其PID,以便 我的监控程序(Windows服务)可以读取它,然后使用它来持续确定应用程序的状态。如果发现该应用程序已死亡,并且其他条件表明它仍应运行,我的服务将重新启动它。