【问题标题】:Automatically Resume a Suspended Windows Process自动恢复暂停的 Windows 进程
【发布时间】:2014-07-22 21:39:28
【问题描述】:

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

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

感谢您的帮助!

【问题讨论】:

  • 很遗憾,进程无法暂停。当您使用 pssuspend 时,它只会暂停所有线程。所以你只能启发式地检测到一个进程被挂起。事实上,如果在挂起之后恰好创建了另一个线程,Process Explorer 将不再允许您恢复,因为该进程不再被检测为挂起。
  • 恢复一个实际上没有挂起的进程应该是安全的,所以你可能不需要检查。

标签: windows batch-file suspend


【解决方案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 服务)可以读取它,然后使用它来持续确定应用程序的状态。如果发现该应用已死,并且如果其他条件表明它仍应运行,我的服务将启动它。

【讨论】:

  • 这还不错。您可能应该遍历线程并恢复它们。请参阅我的评论。
  • @usr - 谢谢。在我的应用程序中,当使用线程时,我会遍历并使用这些调用来获取进程状态。它们被写成离散的,所以我可以根据需要使用它们。
  • @usr - 关于这些的一个注释:此代码段:while(Process32Next(pss, &pe)); 可能非常昂贵。它的工作量完全取决于调用时有多少东西正在运行。它可以遍历整个列表,然后在最后一次循环迭代中找到目标进程。我还没有找到让 Windows 提供 exe 名称或进程 ID 的排序列表的方法 :)
猜你喜欢
  • 2021-12-19
  • 2015-04-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多