ubuntu系统进程 Ubuntu查看进程
其实ubuntu系统进程的问题并不复杂,但是又很多的朋友都不太了解Ubuntu查看进程,因此呢,今天小编就来为大家分享ubuntu系统进程的一些知识,希望可以帮助到大家,下面我们一起来看看这个问题的分析吧!
怎么样结束关闭linux/ubuntu系统中的进程
Linux中杀掉一个进程可以用kill和killall命令,killall命令用命令名字来杀死指定进程,而kill命令则是用进程PID来杀死进程。
killall命令,顾名思义就是杀死所有以某个命令启动的所有进程,用killall命令杀死进程的命令是这样的(这里是杀死以httpd命令启动的所有进程):
killall-9 httpd
-9参数表示强制终止进程。
最常用的是用kill命令结束进程,但是kill命令需要用进程的PID作为参数。如何知道指定进程的PID呢?如果是通过进程命令名字查看对应PID,可以通过ps或pstree命令看到它的PID;如果是通过网络监听端口号查看进程,需要用netstat命令看看端口号对应的进程的PID。
ps命令用于查看系统所有进程,而pstree命令以树状显示进程之间的关系,有助于判断要杀死哪个进程。记住在它们显示的结果中记下需要结束的进程PID。ps命令的常用用法是:
ps aux
-a参数表示不与终端有关的进程也显示出来。
pstree命令的常见用法是:
pstree-Aup
-p参数表示列出进程PID。
netstat命令可以查看监听端口的进程是哪个,常用的方式是:netstat-tlnp
这条命令的意思是列出系统里面监听网络连接的端口号和相应的进程PID。
参数说明:
-t:表示列出TCP连接(也可以加上-u参数表示同时列出UDP网络连接)
-l:表示列出正在网络监听的服务
关键是下面两个参数:
-n:表示以端口号来显示
-p:表示列出进程PID
Local Address这一列下面就有端口号,可以看到它对应的PID是多少,还有Program name那一列是进程名字。同样是要记下需要结束的进程的PID。
知道了指定进程的PID后,就可以用kill命令结束进程了:
kill-9 PID号码
或者kill-2 PID号码
-9参数是强制结束进程,而-2参数是相当于用键盘组合键Ctrl+C的方式正常结束进程。
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。
怎么查看ubuntu下怎么杀死进程
方法/步骤
要关闭进程,我们首先要打开类似于windows系统下面的“任务管理器”程序,在Ubuntu系统下“任务管理器”叫做“系统监视器”,他们的功能基本类似,不过Ubuntu下面的“系统监视器”比windows的任务管理器功能更强大。
有两种方法可以打开“系统监视器”,下面我们分别说明
打开系统监视器方法一
依次点击“system”--->“Administration”----->“System Monitor”,如下图所示:
打开系统监视器方法二
对于喜欢命令的朋友来说,可以用下面的命令打开系统监视器,打开终端命令窗口,然后输入以下命令执行:
gnome-system-monitor
系统监视器打开后如下图所示,默认的页面我们可以看到关于系统的配置情况
我们点击“Processes”,进入到进程列表界面,现在感觉到和windows下的任务管理器很相似吧。
下面我们就进入我们的正题,结束进程,一般结束之前自己一定要对这个进程有所了解,知道它具体的功能作用,不然结束后,可能会引起系统的不稳定甚至死机。
因为我这个电脑上面没有蓝牙模块,但是进程里面有提供蓝牙模块的服务功能,所以我们就以这个进程为例来作为我们结束的对象,我们选择这个进程bluetooth-applet,如下图所示:
在bluetooth-applet进程上面点鼠标右键,之后会弹出如下关于对进程操作的一些菜单,我们这里要彻底的结束bluetooth-applet进程,所以我们选择“kill process”
选择并点击“kill process”后,会弹出结束进程的确认提示框,如下图所示,我们选择选择“kill process”就可以结束bluetooth-applet进程了。
结束bluetooth-applet进程后,我们再看进程列表里面已经没有bluetooth-applet进程了,操作非常简单,也和windows系统下面结束进程的方法类似-_-