关于 PHP 启动的进程怎么退出的问题

dzdh · 2024-7-15 17:06:42 · 71 次点击
经典套娃。

场景这样的使用 symfony process 启动了一个 php 进程。

symfony 启动使用的命令是:

```php
$commandline = '{ ('.$commandline.') <&3 3<&- 3>/dev/null & } 3<&0;';
$commandline .= 'pid=$!; echo $pid >&3; wait $pid 2>/dev/null; code=$?; echo $code >&3; exit $code'
```

启动成功后进程树类似:(假设执行的是 php -r "sleep(10);")

|---master
|-----|---(PID:100) sh -c php -r "sleep(10);"
|-----------|---(PID:101) php -r "sleep(10);"

当在 master 中执行 `posix_kill(101, 15) sigterm`后。sh 立刻退出了。剩余一个 php -r "sleep(10);" 还在跑。

通过这种形式启动的进程应该怎么“优雅”的退出呢?
举报· 71 次点击
登录 注册 站外分享
4 条回复  
proxytoworld 初学 2024-7-15 17:08:46
kill
ysc3839 小成 2024-7-15 17:40:49
很麻烦,POSIX 没有一个稳妥的连带子进程都 kill 掉的方案。
只考虑一层子进程的情况下,可以考虑 shell 里面用 exec 来避免多产生进程。
Rache1 小成 2024-7-15 17:53:58
之前也找过类似的资料,不过算是一个已知问题了,如果不考虑跨平台,解决办法就是加一个 exec

Process::stop() might not work as expected · Issue #5030 · symfony/symfony https://github.com/symfony/symfony/issues/5030


不过如果你使用 Process 启动的话,应该是可以使用 stop 方法,正确停止,我看这后面还有个 fallbackStatus
sagaxu 初学 2024-7-15 22:06:22
https://unix.stackexchange.com/questions/124127/kill-all-descendant-processes
返回顶部