linux进程僵死 目前公认最流畅的linux
解救Linux系统中僵死进程的方法linux僵死的进程
计算机中的操作系统是一个非常重要的组成部分,我们依赖它来完成各种工作,但僵死进程却可能会影响正常的操作。Linux系统也不例外,当僵死进程出现时,我们可以通过以下几种方法来解救Linux系统中的僵死进程:
1.首先,我们可以使用Linux系统自带的kill命令来结束僵死进程,这是最简单的解决办法。使用kill命令可以让我们直接结束僵死进程,这将恢复系统稳定性,让系统继续正常运行
2.其次,我们可以使用Linux系统自带的ps命令来查看僵死进程,并尝试结束它。这是一个更专业的做法,因为我们可以先用ps命令来查看僵死进程的基本信息,然后再使用kill命令以最有效的方式去结束它
3.此外,如果僵死进程比较复杂,这时候可以试试Linux系统自带的top命令,这里可以更详细的看到进程的概况以及详细的CPU使用情况,然后再根据情况来决定如何结束僵死进程
4.最后,如果上述三种方法都无法解决僵死进程,则可以考虑重新启动该系统。一般来说,重新启动系统就可以重新正常使用,但前提是你所执行的操作没有损坏系统。
以上就是几种解救Linux系统中僵死进程的方法,它们都是不失为一种施展你所学,将Linux系统恢复正常的可能性,在系统出现僵死进程时,我们应当考虑以上几种方法,以便尽可能的节省时间,避免损害系统的操作。
ubuntu Linux怎么解决僵尸进程
Linux允许进程查询内核以获得其父进程的 PID,或者其任何子进程的执行状态。例如,进程可以创建一个子进程来执行特定的任务,然后调用诸如 wait()这样的一些库函数检查子进程是否终止。如果子进程已经终止,那么,它的终止代号将告诉父进程这个任务是否已成功地完成。
为了遵循这些设计原则,不允许 Linux内核在进程一终止后就丢弃包含在进程描述符字段中的数据。只有父进程发出了与被终止的进程相关的 wait()类系统调用之后,才允许这样做。这就是引入僵死状态的原因:尽管从技术上来说进程已死,但必须保存它的描述符,直到父进程得到通知。
如果一个进程已经终止,但是它的父进程尚未调用 wait()或 waitpid()对它进行清理,这时的进程状态称为僵死状态,处于僵死状态的进程称为僵尸进程(zombie process)。任何进程在刚终止时都是僵尸进程,正常情况下,僵尸进程都立刻被父进程清理了。
僵尸进程是如何产生的
在UNIX系统中,一个进程结束了,但是他的父进程没有等待(调用wait/ waitpid)他,那么他将变成一个僵尸进程。通过ps命令查看其带有defunct的标志。僵尸进程是一个早已死亡的进程,但在进程表(processs table)中仍占了一个位置(slot)。
但是如果该进程的父进程已经先结束了,那么该进程就不会变成僵尸进程。因为每个进程结束的时候,系统都会扫描当前系统中所运行的所有进程,看看有没有哪个进程是刚刚结束的这个进程的子进程,如果是的话,就由Init进程来接管他,成为他的父进程,从而保证每个进程都会有一个父进程。而Init进程会自动 wait其子进程,因此被Init接管的所有进程都不会变成僵尸进程。
为了观察到僵尸进程,我们自己写一个不正常的程序,父进程 fork出子进程,子进程终止,而父进程既不终止也不调用 wait清理子进程:
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include<unistd.h>
#include<stdio.h>
#include<stdlib.h>
intmain(void)
{
inti= 100;
pid_t pid=fork();
if(pid< 0)
{
perror("fork failed.");
exit(1);
}
if(pid> 0)
{
printf("This is the parent process. My PID is%d.\n", getpid());
for(; i> 0; i--)
{
sleep(1);
}
}
elseif(pid== 0)
{
printf("This is the child process. My PID is:%d. My PPID is:%d.\n", getpid(), getppid());
}
return0;
}
把上面的代码保存到文件 zomprocdemo.c文件中,并执行下面的命令编译:
?
1
$ gcc zomprocdemo.c-o zomprocdemo
然后运行编译出来的 zomprocdemo程序:
?
1
$./zomprocdemo
请点击输入图片描述
此时子进程已经退出,但是父进程没有退出也没有通过 wait()调用处理子进程。我们使用 ps命令查看进程的状态:
请点击输入图片描述
上图红框中的大写字母"Z"说明 PID为 112712的进程此时处于僵死的状态。
让我们接着往下看!在结束 sleep后父进程退出。当父进程退出后,子进程会变成孤儿进程,此时它会被一个管理进程收养。在不同的系统中,这个管理进程不太一样,早期一般是 init进程,Ubuntu上是 upstart,还有近来的 Systemd。但是它们都完成相同的任务,就是 wiat()这些孤儿进程,并最终释放它们占用的系统进程表中的资源。这样,这些已经僵死的孤儿进程就彻底的被清除了。
僵尸进程的危害
在进程退出的时候,内核释放该进程所有的资源,包括打开的文件,占用的内存等。但是仍然为其保留一定的信息(包括进程号 PID,退出状态 the termination status of the process,运行时间 the amount of CPU time taken by the process等)。直到父进程通过 wait/ waitpid来取时才释放。
如果进程不调用 wait/ waitpid的话,那么保留的那段信息就不会释放,其进程号就会一直被占用,但是系统所能使用的进程号是有限的,如果大量的产生僵死进程,将因为没有可用的进程号而导致系统不能产生新的进程。
如何处理僵尸进程
僵尸进程的产生是因为父进程没有 wait()子进程。所以如果我们自己写程序的话一定要在父进程中通过 wait()来避免僵尸进程的产生。
当系统中出现了僵尸进程时,我们是无法通过 kill命令把它清除掉的。但是我们可以杀死它的父进程,让它变成孤儿进程,并进一步被系统中管理孤儿进程的进程收养并清理。
下面的 demo中,父进程通过 wait()等待子进程结束:
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include<sys/types.h>
#include<sys/wait.h>
#include<unistd.h>
#include<stdio.h>
#include<stdlib.h>
intmain(void)
{
pid_t pid;
pid= fork();
if(pid< 0)
{
perror("fork failed");
exit(1);
}
if(pid== 0){
inti;
for(i= 3; i> 0; i--)
{
printf("This is the child\n");
sleep(1);
}
// exit with code 3 for test.
exit(3);
}
else
{
intstat_val;
wait(&stat_val);
if(WIFEXITED(stat_val))
{
printf("Child exited with code%d\n", WEXITSTATUS(stat_val));
}
}
return0;
}
demo中父进程不仅等待子进程结束,还通过 WEXITSTATUS宏取到了子进程的 exit code。
linux进程僵死状态linux进程僵死
linux中如何杀掉锁死的进程?
首先使用ps-ef命令确定要杀死进程的PID,然后输入以下命令:#kill-pid注释:标准的kill命令通常都能达到目的。
终止有问题的进程,并把进程的资源释放给系统。然而,如果进程启动了子进程,只杀死父进程,子进程仍在运行,因此仍消耗资源。为了防止这些所谓的“僵尸进程”,应确保在杀死父进程之前,先杀死其所有的子进程。*确定要杀死进程的PID或PPID#ps-ef|grephttpd结束进程#kill-lPID-l选项告诉kill命令用好像启动进程的用户已注销的方式结束进程。当使用该选项时,kill命令也试图杀死所留下的子进程。但这个命令也不是总能成功--或许仍然需要先手工杀死子进程,然后再杀死父进程。给父进程发送一个TERM信号,试图杀死它和它的子进程。#kill-TERMPPID*killall命令killall命令杀死同一进程组内的所有进程。其允许指定要终止的进程的名称,而非PID。#killallhttpd*停止和重启进程有时候只想简单的停止和重启进程。如下:该命令让Linux和缓的执行进程关闭,然后立即重启。在配置应用程序的时候,这个命令很方便,在对配置文件修改后需要重启进程时就可以执行此命令。
如何杀掉Linux中的僵尸进程?
1、使用top命令就可以查看到僵尸进程。
2、查看具体进程pid#ps-A-ostat,ppid,pid,cmd|grep-e"^"说明:不是查不出僵尸进程,是因为我重启了系统,没有僵尸进程。
3、杀死僵尸进程#kill-9pid号
linux里面怎么杀掉一个程序?
首先使用ps-ef命令确定要杀死进程的PID,然后输入以下命令:#kill-pid注释:标准的kill命令通常都能达到目的。终止有问题的进程,并把进程的资源释放给系统。然而,如果进程启动了子进程,只杀死父进程,子进程仍在运行,因此仍消耗资源。为了防止这些所谓的“僵尸进程”,应确保在杀死父进程之前,先杀死其所有的子进程。*确定要杀死进程的PID或PPID#ps-ef|grephttpd结束进程#kill-lPID-l选项告诉kill命令用好像启动进程的用户已注销的方式结束进程。当使用该选项时,kill命令也试图杀死所留下的子进程。但这个命令也不是总能成功--或许仍然需要先手工杀死子进程,然后再杀死父进程。给父进程发送一个TERM信号,试图杀死它和它的子进程。#kill-TERMPPID*killall命令killall命令杀死同一进程组内的所有进程。其允许指定要终止的进程的名称,而非PID。#killallhttpd*停止和重启进程有时候只想简单的停止和重启进程。如下:#kill-HUPPID该命令让Linux和缓的执行进程关闭,然后立即重启。在配置应用程序的时候,这个命令很方便,在对配置文件修改后需要重启进程时就可以执行此命令。
linuxkill杀不掉进程?
linux进程kill不掉
一是进程已经成为僵死进程,当它的父进程将它回收或将它的父进程kill掉即可在ps输出看不到了;
二是进程正处在内核状态中,Linux进程运行时分内核和用户两种状态,当进程进入内核状态后,会屏蔽所有信号,包括SIGKIL,所以这个时候kill-9也变得无效了。