日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > php >内容正文

php

php defunct,通过swoole观察僵尸进程和孤儿进程出现和消亡

發(fā)布時(shí)間:2023/12/4 php 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 php defunct,通过swoole观察僵尸进程和孤儿进程出现和消亡 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

聲明:維基百科上沒有僵死進(jìn)程的詞條,這里認(rèn)為僵死進(jìn)程同僵尸進(jìn)程,即ZOMBIE。

一、定義

什么是僵尸進(jìn)程

維基百科的定義:在類UNIX系統(tǒng)中,僵尸進(jìn)程是指完成執(zhí)行(通過exit系統(tǒng)調(diào)用,或運(yùn)行時(shí)發(fā)生致命錯(cuò)誤或收到終止信號(hào)所致)但在操作系統(tǒng)的進(jìn)程表中仍然有一個(gè)表項(xiàng)(進(jìn)程控制塊PCB),處于”終止?fàn)顟B(tài)”的進(jìn)程。

這個(gè)定義很準(zhǔn)確,但并不好理解,通俗的說法是一個(gè)進(jìn)程fork了一個(gè)子進(jìn)程,子進(jìn)程先于父進(jìn)程退出,但父進(jìn)程沒有調(diào)用wait(通過wait系統(tǒng)調(diào)用讀取退出進(jìn)程的退出態(tài),退出進(jìn)程的在進(jìn)程表中的表項(xiàng)就被刪除),導(dǎo)致這個(gè)進(jìn)程已經(jīng)退出但是仍在進(jìn)程表中占有一個(gè)位置,這種進(jìn)程稱為僵尸進(jìn)程。

什么是孤兒進(jìn)程

孤兒進(jìn)程:一個(gè)進(jìn)程fork了一個(gè)子進(jìn)程, 父進(jìn)程先于子進(jìn)程退出,運(yùn)行中的子進(jìn)程稱為孤兒進(jìn)程。

孤兒進(jìn)程將被init進(jìn)程(進(jìn)程號(hào)為1)所收養(yǎng),并由init進(jìn)程對(duì)它們完成狀態(tài)收集工作。

下面,讓我們來看2個(gè)示例:

二、僵尸進(jìn)程示例

0、通過swoole在一個(gè)進(jìn)程中創(chuàng)建子進(jìn)程,讓子進(jìn)程先于父進(jìn)程退出。

echo 'ppid = ' . getmypid(), PHP_EOL;

$process = new swoole_process(function (swoole_process $worker) {

echo 'pid = ' . getmypid(), PHP_EOL;

sleep(10);

echo 'child process exit', PHP_EOL;

}, false);

$process->start();

sleep(1000);

echo 'parent process exit', PHP_EOL;

1、以上代碼保存文件zombie.php, 執(zhí)行

[root@salmonl process]# php zombie.php

ppid = 4899

pid = 4900

child process exit

2、另開一個(gè)窗口查看進(jìn)程

# 子進(jìn)程退出前

$ ps aux | grep -v 'grep' | grep 'zombie'

root 4899 0.3 0.6 321644 24612 pts/0 S+ 16:07 0:00 php zombie.php

root 4900 0.0 0.2 321644 8956 pts/0 S+ 16:07 0:00 php zombie.php

# 子進(jìn)程退出后

$ ps aux | grep -v 'grep' | grep 'zombie'

root 4899 0.0 0.6 321644 24612 pts/0 S+ 16:07 0:00 php zombie.php

# 查看僵尸進(jìn)程(狀態(tài)為Z, 或者COMMAND中出現(xiàn)defunct)

$ ps aux | grep -v 'grep' | grep 'defunct'

root 4900 0.0 0.0 0 0 pts/0 Z+ 16:07 0:00

3、kill僵尸進(jìn)程無效

$ kill 4900

$ ps aux | grep -v 'grep' | grep 'defunct'

root 4900 0.0 0.0 0 0 pts/0 Z+ 16:07 0:00

4、kill父進(jìn)程,僵尸進(jìn)程就會(huì)消亡

$ kill 4899

$ ps aux | grep -v 'grep' | grep 'defunct'

三、孤兒進(jìn)程示例

0、通過swoole在一個(gè)進(jìn)程中創(chuàng)建子進(jìn)程,讓父進(jìn)程先于子進(jìn)程退出。

echo 'ppid = ' . getmypid(), PHP_EOL;

$process = new swoole_process(function (swoole_process $worker) {

echo 'pid = ' . getmypid(), PHP_EOL;

sleep(1000);

echo 'child process exit', PHP_EOL;

}, false);

$process->start();

sleep(10);

echo 'parent process exit', PHP_EOL;

1、以上代碼保存文件orphan.php, 執(zhí)行

$ php orphan.php

ppid = 5041

pid = 5042

parent process exit

2、另開一個(gè)窗口查看進(jìn)程

# 父進(jìn)程退出之前,進(jìn)程狀態(tài)

$ ps aux | grep -v 'grep' | grep 'orphan'

root 5041 0.5 0.6 321644 24612 pts/0 S+ 16:22 0:00 php orphan.php

root 5042 0.0 0.2 321644 8956 pts/0 S+ 16:22 0:00 php orphan.php

# 父進(jìn)程退出之后進(jìn)程狀態(tài)(子進(jìn)程的ppid變?yōu)?)

$ ps -ef | grep -v 'grep' | grep orphan

root 5042 1 0 16:22 pts/0 00:00:00 php orphan.php

四、總結(jié)

0、swoole中避免出現(xiàn)僵尸進(jìn)程,在父進(jìn)程中調(diào)用wait即可

while ($res = swoole_process::wait()) {

echo PHP_EOL, 'worker process exit pid: ' . $res['pid'] . PHP_EOL;

}

1、僵尸進(jìn)程占用進(jìn)程ID,多了之后,影響進(jìn)程調(diào)度。

2、清除僵尸進(jìn)程可通過清除父進(jìn)程,或者等待很長(zhǎng)時(shí)間后被內(nèi)核清除。

總結(jié)

以上是生活随笔為你收集整理的php defunct,通过swoole观察僵尸进程和孤儿进程出现和消亡的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。