程序和进程的关系
进程查看
ps-aux a:显示终端上所有的进程 u:列出进程的用户 x:显示进程的详细信息
ps -elf
-e
:显示所有进程,而不仅仅是与终端会话相关的进程。
-l
:以长格式显示进程信息。
-f
:显示完整的进程信息,
top动态查看进程信息
第一行:任务队列信息
第二行:进程信息
Tasks 总进程数
running 正在运行的进程数
sleeping 休眠的进程数
stopped 中止的进程数
zombie 僵死的进程数
第三行:cpu信息
第四行为内存的信息
total 总内存空间
free 空闲内存
used 已用内存
buff/cache 物理内存和交换内存的缓冲区总和
第五行为交换空间的信息
total 总交换空间
free 空闲交换空间
used 已用交换空间
avail Mem 可用物理空间
进程信息区各列解释:
PID 进程id
USER 进程所有者的用户名
PR 优先级 --系统优先级
NI 谦让度值。负值表示高优先级,正值表示低优先级 --人为设置的优先级
VIRT 进程使用的虚拟内存总量,单位kb
RES 进程使用的物理内存大小,单位kb SHR 共享内存大小,单位kb
S 进程状态
%CPU 上次更新到现在的CPU时间占用百分比
%MEM 进程使用的物理内存百分比 TIME+ 进程使用的CPU时间总计,单位1/100秒
COMMAND 命令名/命令行
top常用命令
h或者?:帮助
M:按内存的使用排序
P:按cpu使用排序
N:以PID的大小排序
:向后
z:彩色 Z:设置彩色,数字调整
僵尸进程
父进程先结束,子进程,这个时候子进程就会变成一个僵尸进程。
子进程在结束的时候,父进程已经不再了,而且父进程也没有收回子进程的资源,子进程也会成为一个僵尸进程。
解决办法:只有重启,不能强制结束(kill)
模拟一个僵尸进程
wait.c #僵尸进程的脚本
#include <stdio.h>
#include <unistd.h>
#include <sys/wait.h>
int main(int argc, char **argv)
{
pid_t pid;
pid = fork();
if (pid == 0) { // child
printf("child pid = %d\n", getpid());
printf("in child...\r\n");
sleep(2);
} else if (pid > 0) { // father
sleep(10); /* 子进程 2s 钟后提前结束,等待父进程回收其资源,在这期间,子进程处于僵尸状态 */
wait(NULL);
}
return 0;
}
yum -y install gcc #C语言环境
gcc wait.c -o wait.out
./wait.out
查看进程树
pstree命令
以树形结构列出进程信息
-a 显示每个程序的完整指令,包含路径,参数或是常驻服务的标示
-c 不使用精简标示法
-G 使用 VT100 终端机的列绘图字符
-h 列出树状图时,特别标明现在执行的程序
-H 此参数的效果和指定 -h 参数类似,但特别标明指定的程序
-l 采用长列格式显示树状图
-n 用程序识别码排序。预设是以程序名称来排序
-p 显示进程 id
-u 显示进程所属用户
-U 使用 UTF-8 列绘图字符
-V 显示版本信息
查看进程所属的线程:
[root@localhost ~]# pstree -p 2543 #只显示线程 httpd(2543)─┬─httpd(2545) ├─httpd(2546) ├─httpd(2547) ├─httpd(2548) └─httpd(2549)
[root@localhost ~]# pstree -up 2543 #显示线程的用户 httpd(2543)─┬─httpd(2545,apache) ├─httpd(2546,apache) ├─httpd(2547,apache) ├─httpd(2548,apache) └─httpd(2549,apache)
进程终止
我们经常会用到kill命令去杀死一个进程,但是有时会出现kill不成功的现象,这是就要用到kill -9。 之所以这两个命令会有区别是因为所发送的信号(Signal)是不同的。默认情况下kill命令的参数为-15。 kill -15代表的信号为SIGTERM,这是告诉进程你需要被关闭,请自行停止运行并退出; 而kill -9代表的信号是SIGKILL,表示进程被终止,需要立即退出; 因此kill -9表示强制杀死该进程,这个信号不能被捕获也不能被忽略。
kill -9
kill只是传递信号,-9强制结束
计划任务管理
at命令
定时任务crontab命令
删除是全删除