中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

第三章 九析帶你處理 zombie(defunct) 進程

發布時間:2020-02-26 03:55:00 來源:網絡 閱讀:795 作者:九析 欄目:系統運維

目錄

1 前言

2 僵尸進程

????2.1 進程簡介

????2.2 僵尸進程例子

????2.3 僵尸進程危害

3 處理僵尸進程

????3.1 kill 命令

????3.2 kill 父進程

????3.3 reboot

????3.4 magic sysrq key 方法


1 前言

????????在 centos7 跑 Docker 和 k8s 時,偶爾會出現 systemctl 失效的情況,現象如下:

Failed to get properties...

????????查看系統進程,發現僵尸進程(zombie/defunct):

ps -ef | grep defunct


2 僵尸進程

2.1 進程簡介

????????在 linux 中,父進程通過 fork 調用創建子進程。

第三章 九析帶你處理 zombie(defunct) 進程第三章 九析帶你處理 zombie(defunct) 進程

????????子進程執行完畢之后,內核會釋放該子進程所占用的資源,包括打開的文件,占用的內存等,但仍然會在進程表中保留一個槽位(slot)存放該子進程的文件描述符(比如進程PID、進程退出狀態、進程運行時間等),直到父進程發送 wait() 或 waitpid() 調用,內核才會把子進程文件描述符從進程表中徹底清除。如果父進程不調用 wait() 或 waitpid()對子進程進行清理,那子進程將處于僵尸狀態。

????????但是如果父進程先于子進程結束的話,會導致子進程變成僵尸進程嗎?答案是不會。因為每當進程結束的時候,系統都會掃描當前所有運行的進程,查找是否有這個結束進程的子進程,如果有,就由 init 進程(或者 systemd 進程)來接管子進程,成為子進程的新父進程,并自動 wait 這個子進程,確保以后該子進程不會變成僵尸進程。

2.2 僵尸進程例子

????????下面展示一個 c 語言編寫的僵尸進程樣例,樣例中主進程并不會 wait 子進程,生成文件 zombie.c:

#include <unistd.h>

#include <stdio.h>

#include <stdlib.h>

int main(void) ?{

????int i = 60;

????pid_t pid = fork();


????if ( pid < 0 ) ?{

????????perror( "fork error." );

????????exit(1);

????}


????if ( pid == 0 ) {

????????printf( "This is the child process. My PID is: %d. My PPID is: %d\n", getpid(), getppid() );

????}


????if (pid > 0) ? ?{

????????printf( "This is the parent process. My PID is %d.\n", getpid() );

????????for( ; i > 0; i-- ) {

????????????sleep(1);

????????}

????}


????return 0;

}

????????編譯 zombie.c 并執行 zombie:

yum install gcc

gcc zombie.c -o zombie

./ zombie

第三章 九析帶你處理 zombie(defunct) 進程第三章 九析帶你處理 zombie(defunct) 進程

????????上圖中主進程 PID:11552,子進程 PID:11553。執行如下語句:發現 PID 為 11553 的子進程正好處于僵尸狀態(defunct),由程序可知,因為主進程并沒有 wait 子進程。

ps aux | grep -i defunct

第三章 九析帶你處理 zombie(defunct) 進程第三章 九析帶你處理 zombie(defunct) 進程? ? ? ? 分析一下 zombie.c,特別注意 fork() 調用,在 pid_t pid = fork() 語句之前,只有一個進程,但是執行到這條語句之后,就變成2個進程了,這2個進程幾乎完全相同,將要執行的下一條語句都是 if ( pid < 0 )。

????????fork() 函數比較特殊,它被調用一次,卻能夠返回兩次結果,它的返回值也根據進程的不同而不同:

1)在父進程中,fork 返回新創建子進程的 PID

2) 在子進程中,fork 返回 0

3)如果出現錯誤,則 fork 返回負值

2.3 僵尸進程危害

????????如果父進程沒有 wait 子進程,子進程將變成僵尸狀態,處于僵尸狀態的進程將保留進程號(PID),眾所周知,操作系統對進程號是有限制的,如果出現大量僵尸進程占用進程號,系統有可能無法創建新的進程。

3 處理僵尸進程

????????一般情況下處于僵尸狀態的進程很難殺掉,當然你可以試著刪除:

3.1 kill 命令

kill -9 PID

3.2 kill 父進程

kill -9 PPID

3.3 reboot

????????如果采用上面兩種方式依然殺不掉,那么只能通過重啟了。

reboot

????????如果重啟也不生效,可以需要加選項 -nf

reboot -nf

3.4 magic sysrq key 方法

????????有時執行 reboot 命令還是無法重啟,可以執行 magic sysrq 方法來通過提供給用戶的 proc 接口直接向 kernel 發底層命令。

????????重啟命令如下:

echo 1 > /proc/sys/kernel/sysrq

echo b > /proc/sysrq-trigger

????????強制關機命令:

echo 1 > /proc/sys/kernel/sysrq

echo b > /proc/sysrq-trigger

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

册亨县| 固安县| 阿克苏市| 九龙城区| 封丘县| 卓资县| 远安县| 教育| 合水县| 井冈山市| 阿拉善左旗| 册亨县| 辽宁省| 江川县| 工布江达县| 奈曼旗| 沙洋县| 泸州市| 化州市| 南充市| 遵义市| 六枝特区| 岗巴县| 温泉县| 赞皇县| 临西县| 淮安市| 乌拉特前旗| 临江市| 阿鲁科尔沁旗| 辽阳市| 察隅县| 阳信县| 凉山| 太湖县| 同德县| 巩义市| 永仁县| 曲周县| 二连浩特市| 集贤县|