
实验名称: Linux观察行为
实验时间:年 月 日
实验人员: (姓名) (学号) (年级)
实验目的: 掌握监视系统的几个Linux基本命令以及其他常用命令,学习linux内核,进程,存储和其他资源的一些重要特征,熟悉/proc虚拟文件系统。
实验环境: linux
实验步骤:
1. 用帐户root,密码123456登陆linux系统
2. 运行ps、man ps、cal、date、clear、who、which命令,观察输出结果
3. 运行/proc文件系统的相关命令(参见以下实验陈述3),观察输出结果
实验陈述:
1、基础知识:
为什么说/proc是一个虚拟文件系统:
proc文件系统是一个伪文件系统,它只存在内存当中,而不占用外存空间。
该文件的作用:
它以文件系统的方式为访问系统内核数据的 *** 作提供接口。用户和应用程序可以通过 proc得到系统的信息,并可以改变内核的某些参数。
2、写出下列运行指令的结果(在终端里原样输入命令即可得到结果)
cal: 返回当前年月日历
who am I:返回当前用户信息
find /usr -name "clear":
返回 一直到/clear的路径 如:/use/bin/clear
which ls: alias ls='ls --color=tty'
/bin/ls
3、完成下列liunx机器问题(/proc文件系统)
² CPU的类型和型号
Ø指令:cat /proc/cpuinfo
Ø结果:(原样输入指令即可得到结果)
² 使用的Linux内核版本、编译器版本
Ø指令:cat /proc/version
Ø结果:(原样输入指令即可得到结果)
² 配置了多少内存
Ø指令:cat /proc/meminfo
Ø结果:
MemTotal项就是总的内存.
² 当前有多少可用内存
Ø指令:cat /proc/meminfo
Ø结果:
MemFree项就是可用内存.
² 有多少磁盘读写请求
Ø指令:cat /proc/stat
Ø结果:
disk_io项
² 从系统启动以来已经创建了多少进程
Ø指令:cat /proc/stat
Ø结果:
processes项即为总的线程数
实验总结:...
查看所有进程:
1.ps -ef
2.ps -aux
e = all processes 显示所有进程
f = full全格式
a = show processes for all users 显示所有用户的进程
u = display the process's user/owner 显示用户
x = also show processes not attached to a terminal 显示无控制终端的进程
查看单个进程是否运行:
ps -ef|grep 进程
ps -aux|grep 进程
ps -ef显示参数详解:
UID 用户ID
PID 进程ID
PPID 父进程ID
C CPU占用率
STIME 开始时间
TTY 开始此进程的TTY
TIME 此进程运行的总时间
CMD 命令名
ps -aux显示参数详解:
PID 进程的ID
PPID 父进程
%CPU 进程占用的CPU百分比
%MEM 占用内存的百分比
NI 进程的NICE值,数值大,表示较少占用CPU时间
VSZ 进程虚拟大小
RSS 驻留中页的数量
TTY 终端ID
STAT 进程状态(有以下几种)
D 无法中断的休眠状态(通常 IO 的进程)
R 正在运行可中在队列中可过行的
S 处于休眠状态
T 停止或被追踪
W 进入内存交换(从内核2.6开始无效)
X 死掉的进程(从来没见过)
Z 僵尸进程
<优先级高的进程
N 优先级较低的进程
L 有些页被锁进内存
s 进程的领导者(在它之下有子进程)
l 多进程的(使用 CLONE_THREAD, 类似 NPTL pthreads)
+ 位于后台的进程组
WCHAN 正在等待的进程资源
START 启动进程的时间
TIME 进程消耗CPU的时间
COMMAND 命令的名称和参数
ps 为我们提供了进程的一次性的查看,它所提供的查看结果并不动态连续的如果想对进程时间监控,应该用 top 工具.
定义In UNIX System terminology, a process that has terminated,but whose parent has not yet waited for it, is called a zombie.
在UNIX 系统中,一个进程结束了,但是他的父进程没有等待(调用wait / waitpid)他, 那么他将变成一个僵尸进程. 在fork()/execve()过程中,假设子进程结束时父进程仍存在,而父进程fork()之前既没安装SIGCHLD信号处理函数调用 waitpid()等待子进程结束,又没有显式忽略该信号,则子进程成为僵尸进程。
如何查看linux系统上的僵尸进程,如何统计有多少僵尸进程?
#ps -ef | grep defunct
或者查找状态为Z的进程,Z就是代表zombie process,僵尸进程的意思。
另外使用top命令查看时有一栏为S,如果状态为Z说明它就是僵尸进程。
Tasks: 95 total, 1 running, 94 sleeping, 0 stopped, 0 zombie
top命令中也统计了僵尸进程。或者使用下面的命令:
ps -ef | grep defunct | grep -v grep | wc -l
如何杀死僵尸进程呢?
一般僵尸进程很难直接kill掉,不过您可以kill僵尸爸爸。父进程死后,僵尸进程成为”孤儿进程”,过继给1号进程init,init始终会负责清理僵尸进程.它产生的所有僵尸进程也跟着消失。
ps -e -o ppid,stat | grep Z | cut -d” ” -f2 | xargs kill -9
或
kill -HUP `ps -A -ostat,ppid | grep -e ’^[Zz]‘ | awk ’{print $2}’`
当然您可以自己编写更好的shell脚本,欢迎与大家分享。
我将nova-novncproxy stop后再start,僵尸进程即消失,问题解决。
另外子进程死后,会发送SIGCHLD信号给父进程,父进程收到此信号后,执行waitpid()函数为子进程收尸。就是基于这样的原理:就算父进程没有调用wait,内核也会向它发送SIGCHLD消息,而此时,尽管对它的默认处理是忽略,如果想响应这个消息,可以设置一个处理函数。
如何避免僵尸进程呢?
处理SIGCHLD信号并不是必须的。但对于某些进程,特别是服务器进程往往在请求到来时生成子进程处理请求。如果父进程不等待子进程结束,子进程将成为僵尸进程(zombie)从而占用系统资源。如果父进程等待子进程结束,将增加父进程的负担,影响服务器进程的并发性能。在Linux下 可以简单地将 SIGCHLD信号的 *** 作设为SIG_IGN。
signal(SIGCHLD,SIG_IGN)
这样,内核在子进程结束时不会产生僵尸进程。这一点与BSD4不同,BSD4下必须显式等待子进程结束才能释放僵尸进程
或者
用两次fork(),而且使紧跟的子进程直接退出,是的孙子进程成为孤儿进程,从而init进程将负责清除这个孤儿进程。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)