当前位置: 首页> 最新文章列表> proc_terminate无法终止进程怎么办?可能原因和解决方案分析

proc_terminate无法终止进程怎么办?可能原因和解决方案分析

gitbox 2025-06-26

三、完整解决示例

<span><span><span class="hljs-variable">$cmd</span></span><span> = </span><span><span class="hljs-string">'exec sleep 100'</span></span><span>;
</span><span><span class="hljs-variable">$descriptorspec</span></span><span> = [
    </span><span><span class="hljs-number">0</span></span><span> =&gt; [</span><span><span class="hljs-string">"pipe"</span></span><span>, </span><span><span class="hljs-string">"r"</span></span><span>],
    </span><span><span class="hljs-number">1</span></span><span> =&gt; [</span><span><span class="hljs-string">"pipe"</span></span><span>, </span><span><span class="hljs-string">"w"</span></span><span>],
    </span><span><span class="hljs-number">2</span></span><span> =&gt; [</span><span><span class="hljs-string">"pipe"</span></span><span>, </span><span><span class="hljs-string">"w"</span></span><span>]
];

</span><span><span class="hljs-variable">$process</span></span><span> = </span><span><span class="hljs-title function_ invoke__">proc_open</span></span><span>(</span><span><span class="hljs-variable">$cmd</span></span><span>, </span><span><span class="hljs-variable">$descriptorspec</span></span><span>, </span><span><span class="hljs-variable">$pipes</span></span><span>);

</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-title function_ invoke__">is_resource</span></span><span>(</span><span><span class="hljs-variable">$process</span></span><span>)) {
    </span><span><span class="hljs-title function_ invoke__">sleep</span></span><span>(</span><span><span class="hljs-number">2</span></span><span>); </span><span><span class="hljs-comment">// 模拟一些处理</span></span><span>
    </span><span><span class="hljs-title function_ invoke__">proc_terminate</span></span><span>(</span><span><span class="hljs-variable">$process</span></span><span>, </span><span><span class="hljs-number">15</span></span><span>); </span><span><span class="hljs-comment">// 尝试 SIGTERM</span></span><span>
    </span><span><span class="hljs-title function_ invoke__">sleep</span></span><span>(</span><span><span class="hljs-number">1</span></span><span>);

    </span><span><span class="hljs-variable">$status</span></span><span> = </span><span><span class="hljs-title function_ invoke__">proc_get_status</span></span><span>(</span><span><span class="hljs-variable">$process</span></span><span>);
    </span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$status</span></span><span>[</span><span><span class="hljs-string">'running'</span></span><span>]) {
        </span><span><span class="hljs-comment">// 如果还在运行,尝试 SIGKILL</span></span><span>
        </span><span><span class="hljs-title function_ invoke__">proc_terminate</span></span><span>(</span><span><span class="hljs-variable">$process</span></span><span>, </span><span><span class="hljs-number">9</span></span><span>);
    }

    </span><span><span class="hljs-title function_ invoke__">proc_close</span></span><span>(</span><span><span class="hljs-variable">$process</span></span><span>); </span><span><span class="hljs-comment">// 清理资源</span></span><span>
}
</span></span>

四、其他可行替代方案

  • 使用 popen()exec() 配合外部 kill 命令管理进程。

  • 在 Linux 上使用 pcntl_fork()(CLI 环境)自行实现进程管理。

  • 对于复杂任务,考虑使用进程管理框架(如 Supervisord)代替 proc_open()