目錄
1.1 进程状态
1.2 僵尸进程是如何产生的?
1.3 搜索僵尸进程
2、清理僵尸进程" >2、清理僵尸进程
2.1 使用 SIGCHLD 信号" >2.1 使用 SIGCHLD 信号
2.2 kill 父过程" >2.2 kill 父过程
首頁 電腦教學 電腦知識 Linux如何殺死殭屍行程

Linux如何殺死殭屍行程

Feb 19, 2024 pm 04:24 PM
linux 行程 講師

本文主要介紹Linux殭屍行程以及清理殭屍行程的方法。

1、什麼是殭屍行程?

#

Linux中的僵尸进程(Zombie processes)有时也被称为失效或死亡进程。

它们是已执行完毕的进程,但其条目并未从进程表中删除。

Linux如何殺死殭屍行程

1.1 进程状态

Linux 会维护一个进程表,其中包含所有正在运行的进程及其状态。

下面简要介绍一下各种进程状态: 

(1)Running (R): 表示这些进程目前正在运行或可运行,用字母 R 表示。需要说明:进程是 R 状态,不代表正在运行,代表可被调度。换句话说,进程只有是 R 状态才可被调度,其他状态要先转为 R 状态,才能被 OS 调度;

(2)Waiting (S/D): 表示这些进程正在等待事件完成或某种资源就绪,用字母 S/D 表示,等待可以是可中断休眠 S(interruptible sleep) 或不中断休眠 D (uninterruptible sleep);

(3)Stopped (T):  可以通过发送 SIGSTOP 信号给进程来停止(T)进程。这个被暂停的进程可以通过发送 SIGCONT 信号让进程继续运行。

(4)Zombie (Z): 一个比较特殊的状态。当子进程退出并且父进程没有读取到子进程退出的返回代码时,就会产生僵死(尸)进程。僵死进程会以终止状态保持在进程表中,并且会一直在等待父进程读取退出状态代码。所以,只要子进程退出,父进程还在运行,但父进程没有读取子进程状态,子进程进入 Z 状态。

1.2 僵尸进程是如何产生的?

当一个进程完成其工作时,Linux 内核会通过发送 SIGCHLD 信号通知其父进程。然后,父进程执行 wait() 系统调用,读取子进程的状态并读取其退出代码。这会清除进程表中子进程条目,从而结束进程。

但是,如果父进程没有在创建子进程时执行 wait() 系统调用,就不会进行适当的清理。在这种情况下,父进程无法监控子进程的状态变化,最终会忽略 SIGCHLD 信号。这将导致已完成进程的僵尸状态留在进程表中,从而使其作为僵尸进程出现在进程列表中。

另一种情况是,父进程无法处理或接收来自子进程的 SIGCHLD 信号,这种情况也会导致僵尸的产生。

1.3 搜索僵尸进程

使用 ps 命令来检索僵尸进程列表:

ps ux
USER PID %CPU %MEMVSZ RSS TTYSTAT START TIME COMMAND
shubh90.00.0169162760 tty1 SDec19 0:00 /bin/bash --login
shubh1080.00.00 0 tty1 Z16:25 0:00 [zombie] <defunct> 
shubh1090.00.0173841928 tty2 R16:25 0:00 ps ux
登入後複製

从输出中可以看出,STAT 列中的 Z 即为僵尸进程状态,或者使用 awk 命令根据 Z 进程状态进一步过滤输出:

ps ux | awk '{if($8=="Z") print}'
shubh 1080.00.00 0 tty1 Z16:25 0:00 [zombie] <defunct>
登入後複製

另一种方法是使用 top 命令:

top
Tasks: 8 total, 1 running, 6 sleeping, 0 stopped, 1 zombie
%Cpu(s):0.7 us,1.6 sy,0.0 ni, 96.5 id,0.0 wa,1.2 hi,0.0 si,0.0 st
KiB Mem :8269412 total,3161228 free,4878832 used, 229352 buff/cache
KiB Swap: 15483260 total, 14830144 free, 653116 used.3256848 avail Mem

PID USERPRNIVIRTRESSHR S%CPU %MEM TIME+ COMMAND
1 root20 08936192148 S 0.00.0 0:00.17 init
8 root20 08936 96 56 S 0.00.0 0:00.00 init
9 shubh 20 0 16916 2748 2640 S 0.00.0 0:00.43 bash
 76 root20 08936224184 S 0.00.0 0:00.00 init
 77 shubh 20 0 16784 3432 3332 S 0.00.0 0:00.35 bash
161 shubh 20 0 000 Z 0.00.0 0:00.00 zombie
162 shubh 20 0 17624 2084 1508 R 0.00.0 0:00.00 top
登入後複製

top 除了输出其他详细信息外,还可以在输出顶部的摘要中看到僵尸进程的数量。

2、清理僵尸进程

我们无法真正杀死僵尸进程,因为本身它已经结束了。但是,可以使用一些方法来清理僵尸进程。

2.1 使用 SIGCHLD 信号

可以手动向僵尸进程的父进程发送 SIGCHLD 信号。这样,父进程就会主动触发 wait()系统调用,从而从进程表中清除已失效的子进程。

找到僵尸进程的父进程 PID: 

ps -A -ostat,pid,ppid | grep -e '[zZ]'
Z108 103
登入後複製

这里 108 表示僵尸进程 PID,103 表示其父进程 PID,接下来,可以使用 kill 命令向父进程发送 SIGCHLD 信号:

kill -s SIGCHLD 103
登入後複製

不过,并不能保证向父进程发送 SIGCHLD 信号就能杀死僵尸进程。只有在父进程可以处理 SIGCHLD 信号的情况下,它才会起作用。

2.2 kill 父过程

如果上一节的方法无法清除失效进程,就需要考虑杀死其父进程:

kill -9 103
登入後複製

但是,杀死父进程会影响其所有子进程。因此,应该格外谨慎,在杀死父进程之前必须确定其影响。

如果存在大量僵尸进程,或者僵尸进程的父进程是 init 进程(pid=1),可以考虑重启系统来清除失效进程。

以上是Linux如何殺死殭屍行程的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

<🎜>:泡泡膠模擬器無窮大 - 如何獲取和使用皇家鑰匙
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
Mandragora:巫婆樹的耳語 - 如何解鎖抓鉤
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系統,解釋
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1668
14
CakePHP 教程
1427
52
Laravel 教程
1329
25
PHP教程
1273
29
C# 教程
1256
24
Linux體系結構:揭示5個基本組件 Linux體系結構:揭示5個基本組件 Apr 20, 2025 am 12:04 AM

Linux系統的五個基本組件是:1.內核,2.系統庫,3.系統實用程序,4.圖形用戶界面,5.應用程序。內核管理硬件資源,系統庫提供預編譯函數,系統實用程序用於系統管理,GUI提供可視化交互,應用程序利用這些組件實現功能。

vscode上一步下一步快捷鍵 vscode上一步下一步快捷鍵 Apr 15, 2025 pm 10:51 PM

VS Code 一步/下一步快捷鍵的使用方法:一步(向後):Windows/Linux:Ctrl ←;macOS:Cmd ←下一步(向前):Windows/Linux:Ctrl →;macOS:Cmd →

git怎麼查看倉庫地址 git怎麼查看倉庫地址 Apr 17, 2025 pm 01:54 PM

要查看 Git 倉庫地址,請執行以下步驟:1. 打開命令行並導航到倉庫目錄;2. 運行 "git remote -v" 命令;3. 查看輸出中的倉庫名稱及其相應的地址。

notepad怎麼運行java代碼 notepad怎麼運行java代碼 Apr 16, 2025 pm 07:39 PM

雖然 Notepad 無法直接運行 Java 代碼,但可以通過借助其他工具實現:使用命令行編譯器 (javac) 編譯代碼,生成字節碼文件 (filename.class)。使用 Java 解釋器 (java) 解釋字節碼,執行代碼並輸出結果。

sublime寫好代碼後如何運行 sublime寫好代碼後如何運行 Apr 16, 2025 am 08:51 AM

在 Sublime 中運行代碼的方法有六種:通過熱鍵、菜單、構建系統、命令行、設置默認構建系統和自定義構建命令,並可通過右鍵單擊項目/文件運行單個文件/項目,構建系統可用性取決於 Sublime Text 的安裝情況。

Linux的主要目的是什麼? Linux的主要目的是什麼? Apr 16, 2025 am 12:19 AM

Linux的主要用途包括:1.服務器操作系統,2.嵌入式系統,3.桌面操作系統,4.開發和測試環境。 Linux在這些領域表現出色,提供了穩定性、安全性和高效的開發工具。

laravel安裝代碼 laravel安裝代碼 Apr 18, 2025 pm 12:30 PM

要安裝 Laravel,需依序進行以下步驟:安裝 Composer(適用於 macOS/Linux 和 Windows)安裝 Laravel 安裝器創建新項目啟動服務訪問應用程序(網址:http://127.0.0.1:8000)設置數據庫連接(如果需要)

git軟件安裝 git軟件安裝 Apr 17, 2025 am 11:57 AM

安裝 Git 軟件包括以下步驟:下載安裝包運行安裝包驗證安裝配置 Git安裝 Git Bash(僅限 Windows)

See all articles