成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Linux 系統(tǒng)僵尸進程詳解

系統(tǒng) Linux
本文我們將來討論一下什么是僵尸進程,僵尸進程是怎么產(chǎn)生的,如何殺死一個僵尸進程。

[[433627]]

大安好,我是良許。

本文我們將來討論一下什么是僵尸進程,僵尸進程是怎么產(chǎn)生的,如何殺死一個僵尸進程。

Linux中的進程是什么?

講到進程,我們要先了解一下另一個概念:程序。

程序說白了就是躺在電腦硬盤上的一個文件而已(如同硬盤女神一樣),在被 CPU 執(zhí)行之前,它啥也做不了。

當程序被執(zhí)行之后,它運行的實例就稱為進程 。一個程序可以對應(yīng)多個進程。

進程是系統(tǒng)的工作單元。系統(tǒng)由多個進程組成,其中有的是操作系統(tǒng)進程(執(zhí)行系統(tǒng)代碼),其他的是用戶進程(執(zhí)行用戶代碼)。所有這些進程都會并發(fā)執(zhí)行,例如通過在單 CPU 上采用多路復(fù)用來實現(xiàn)。

你可以使用 ps 命令查看 Linux 系統(tǒng)中的所有進程 。

  1. $ ps -ax 
  2.         PID TTY         STAT   TIME COMMAND 
  3.         1 ?     Ss      0:01 /usr/lib/systemd/systemd rhgb --switched-root --sys 
  4.         2 ?     S       0:00 [kthreadd] 
  5.         3 ?     I<      0:00 [rcu_gp] 
  6.         4 ?     I<      0:00 [rcu_par_gp] 

當一個進程調(diào)用 fork 函數(shù)生成另一個進程,原進程就稱為父進程,新生成的進程則稱為子進程。

Linux 系統(tǒng)中這樣父子進程非常多,我們可以使用 pstree 命令查看系統(tǒng)上的進程「譜系」。

  1. $ pstree -psn 
  2. systemd(1)─┬─systemd-journal(952) 
  3.         ├─systemd-udevd(963) 
  4.         ├─systemd-oomd(1137) 
  5.         ├─systemd-resolve(1138) 
  6.         ├─systemd-userdbd(1139)─┬─systemd-userwor(12707) 
  7.         │                     ├─systemd-userwor(12714) 
  8.         │                     └─systemd-userwor(12715) 
  9.         ├─auditd(1140)───{auditd}(1141) 
  10.         ├─dbus-broker-lau(1164)───dbus-broker(1165) 
  11.         ├─avahi-daemon(1166)───avahi-daemon(1196) 
  12.         ├─bluetoothd(1167) 

每個進程在系統(tǒng)中都被分配了一個編號。在這所有的進程中,有個非常特殊的進程,它的 ID 號是 1 。它是系統(tǒng)在引導(dǎo)過程中執(zhí)行的第一個進程,PID 1 之后的每個后續(xù)進程都是它的后代。

什么是僵尸進程?

前面提到過,在 Linux 環(huán)境中,我們是通過 fork 函數(shù)來創(chuàng)建子進程的。創(chuàng)建完畢之后,父子進程獨立運行,父進程無法預(yù)知子進程什么時候結(jié)束。

通常情況下,子進程退出后,父進程會使用 wait 或 waitpid 函數(shù)進行回收子進程的資源,并獲得子進程的終止狀態(tài)。

但是,如果父進程先于子進程結(jié)束,則子進程成為孤兒進程。孤兒進程將被 init 進程(進程號為1)領(lǐng)養(yǎng),并由 init 進程對孤兒進程完成狀態(tài)收集工作。

而如果子進程先于父進程退出,同時父進程太忙了,無瑕回收子進程的資源,子進程殘留資源(PCB)存放于內(nèi)核中,變成僵尸(Zombie)進程,如下圖所示:

僵尸進程是怎么產(chǎn)生的?

前面已經(jīng)介紹了僵尸進程產(chǎn)生的原理,下面我們通過代碼來模擬僵尸進程的產(chǎn)生。

  1. #include   
  2. #include   
  3. #include   
  4. #include   
  5.  
  6. int main(void)   
  7. {   
  8.     pid_t pid;   
  9.     pid = fork();   
  10.     if (pid == 0) {   
  11.             printf("I am child, my parent= %d, going to sleep 3s\n", getppid());   
  12.             sleep(3);   
  13.             printf("-------------child die--------------\n");   
  14.     } else if (pid > 0) {   
  15.             printf("I am parent, pid = %d, myson = %d, going to sleep 5s\n", getpid(), pid);   
  16.             sleep(5);   
  17.             system("ps -o pid,ppid,state,tty,command");   
  18.     } else {   
  19.         perror("fork");   
  20.         return 1;   
  21.     }   
  22.  
  23.     return 0;   
  24. }   

在這個程序里,父進程創(chuàng)建子進程之后,就休眠 5 秒鐘。而子進程只休眠 3 秒鐘就退出,在它退出之后,父進程還未蘇醒,因此沒人給子進程「收尸」,所以它就變成了僵尸進程。

如何殺死僵尸進程

對于普通進程,我們可以通過使用 kill 命令來殺死它們。kill 命令它還有幾個兄弟,比如 pkill 和 killall ,雖然它們名稱里都帶 kill 這樣殺氣騰騰的字眼,但它們實際上是被設(shè)計為向一個或多個進程發(fā)送信號。

在未指定的情況下,這幾個命令默認發(fā)送的是 SIGTERM 信號。

普通進程可以被 kill ,但僵尸進程是不行的。為什么?因為僵尸進程本身就已經(jīng)「死」過一次了!如果還可以再「死」,那「僵尸」這個名號就沒多大意義了。

僵尸進程其實已經(jīng)就是退出的進程,因此無法再利用kill命令殺死僵尸進程。僵尸進程的罪魁禍首是父進程沒有回收它的資源,那我們可以想辦法它其它進程去回收僵尸進程的資源,這個進程就是 init 進程。

因此,我們可以直接殺死父進程,init 進程就會很善良地把那些僵尸進程領(lǐng)養(yǎng)過來,并合理的回收它們的資源,那些僵尸進程就得到了妥善的處理了。

例如,如果 PID 5878 是一個僵尸進程,它的父進程是 PID 4809,那么要殺死僵尸進程 (5878),您可以結(jié)束父進程 (4809):

  1. $ sudo kill -9 4809  #4809 is the parent, not the zombie 

殺死父進程時要非常小心,如果一個進程的父進程就是 PID 1 ,并且你還殺死了它,那么系統(tǒng)將直接重啟!

 

這將是一個更可怕的故事!

 

責任編輯:武曉燕 來源: 良許Linux
相關(guān)推薦

2021-11-08 10:30:30

Linux僵尸命令

2025-05-29 08:10:00

Linux進程系統(tǒng)

2021-10-25 12:23:06

Linux僵尸進程

2009-03-05 09:43:32

Linux系統(tǒng)進程管理命令

2017-12-15 09:40:47

Linux僵尸進程

2024-02-05 18:23:23

父進程應(yīng)用程序程序

2021-11-01 12:13:53

Linux僵尸進程

2020-10-10 11:02:09

Linux 系統(tǒng) 數(shù)據(jù)

2022-05-30 11:50:45

僵尸網(wǎng)絡(luò)Sysrv-K

2024-08-26 08:39:26

PHP孤兒進程僵尸進程

2010-06-04 14:49:15

Linux 查看進程

2017-01-15 20:58:04

Linux進程作業(yè)管理

2019-02-25 09:50:25

Linux命令行僵尸進程

2021-09-14 13:25:23

容器pod僵尸進程

2020-05-08 16:39:01

內(nèi)存系統(tǒng)架構(gòu)Linux

2012-05-08 11:01:45

linux守護進程

2013-01-15 15:18:46

Linux守護進程

2010-03-03 09:16:17

2020-08-21 10:05:22

Linux系統(tǒng)結(jié)構(gòu)內(nèi)核

2021-01-14 15:41:22

LinuxSupervisor命令
點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 中文字幕日韩欧美 | 香蕉一区二区 | 亚洲精品888| 国产精品一区二区av | 国产精品黄视频 | 羞羞视频在线观看网站 | 久久精品久久综合 | 国产亚韩 | 一区二区在线 | 色播视频在线观看 | 久久国产精品视频观看 | 欧美国产日韩在线观看 | 欧美一区二区三区久久精品 | 欧美激情a∨在线视频播放 成人免费共享视频 | 成人在线免费 | 日韩高清一区 | 欧美一区二区在线观看视频 | 欧美日韩专区 | 日韩成人av在线 | 在线观看免费福利 | 国产一区二区三区四区 | 欧美韩一区二区三区 | 久久91精品国产一区二区三区 | 成人高清在线视频 | 亚洲一二三区免费 | 九色视频网站 | 久久国内 | 亚洲一区二区三区在线播放 | 欧美一级网站 | 国产一区二区精品 | 国产免费一区二区 | 亚洲综合日韩精品欧美综合区 | 日韩影音 | 日韩网站在线观看 | 免费观看一级视频 | 日韩精品视频在线 | 国内精品久久精品 | 91国内产香蕉 | 欧美性乱 | 日本午夜在线视频 | 欧美极品少妇xxxxⅹ免费视频 |