【问题标题】:Find if process is alive in windows查找进程是否在 Windows 中处于活动状态
【发布时间】:2016-05-16 14:03:17
【问题描述】:

短版:

  • 在具有 PID 的 Windows 中,我的程序需要确定我的进程是否仍在运行/活着。

在 linux 中,我只需要使用“grep pid”就可以了,在 windows 中会出现类似的情况吗?


加长版:

我正在 Windows 上制作一个 php(7) 系统,它运行蓝牙 Java 服务器。我的系统通过命令行运行服务器并保存PID:

    $command = 'java -jar app\InterfaceBluetooth.jar /k > storage\logs\bluetoothServerToten.txt';
    $descriptorspec = array (
        0 => array("pipe", "r"),
        1 => array("pipe", "w")
    );

    if(is_resource($prog = proc_open("start /b " . $command, $descriptorspec, $pipes))){
        $ppid = proc_get_status($prog)['pid'];
    }// IF
    else{
        // error stuff
        exit();
    }// ELSE

    $output = array_filter(explode(" ", shell_exec("wmic process get parentprocessid,processid | find \"$ppid\"")));
    array_pop($output);
    $pid = end($output);

所以,此时进程已启动并正在运行,并且我有 PID。

现在,重要的是用户可以确定服务器正在运行。不知何故,我的系统需要对此进行检查,这可以追溯到简短版本。

不管怎样,php 7函数,命令行还是其他方式,只要我的系统能查到它是否正在运行。

【问题讨论】:

  • 你能控制蓝牙服务器源代码吗?如果是这样,在你的蓝牙服务器中实现简单的hello-service,它监听一个特殊的端口。然后在您的其他应用程序中,只需将网络数据包发送到此 hello-port 并等待响应。如果服务器响应,则它已启动并正在运行,否则它不是。这种方式比记忆和处理进程 id 标记要好。
  • 你要求两个不同的东西:1 给定一个 PID,我怎么知道进程已经到了可以通信的阶段? 2 给定一个 PID,我怎么知道一个进程仍在运行并响应请求?任何一个问题的答案都可能不同。
  • @RafaelOsipov 我确实制作了蓝牙服务器,但我选择在 java 中进行,因为我无法在 PHP 或 JS 中进行这种通信。到目前为止,发送网络数据包是最好的方法,只是当时不是一种选择。
  • @IInspectable 我的问题是第二个问题“给定一个 PID,我怎么知道一个进程仍在运行并响应请求”
  • 最简单的解决方案:监听您用作通信传输的管道的断开连接事件。

标签: java php windows cmd


【解决方案1】:

如果您需要的只是ps aux | grep PID,请尝试tasklist /nh /fi "pid eq PID"

【讨论】:

  • 错误:无法识别搜索过滤器。 :(
  • 用您的进程 ID 代替 PID,例如如果您的进程 ID 为 1423,则查询将为 tasklist /nh /fi "pid eq 1423"
  • 我不相信..我用“pid eq PID”替换了 PID (tasklist /nh /fi 1234) ¬¬.. 但是它有 50 个赏金 ^^"跨度>
【解决方案2】:

只需执行下面的命令并捕获输出:

TASKLIST /v /fi "PID eq your_pid"

【讨论】:

  • 错误:无法识别搜索过滤器。 :(
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-10
  • 1970-01-01
  • 2020-01-11
  • 2019-12-10
  • 1970-01-01
相关资源
最近更新 更多