linux系统进程和计划任务管理
一.程序和进程的关系
程序:保存在磁盘,光盘等介质中的可执行代码和数据的静态集合
进程:在CPU及内存中处于执行状态的计算机程序
进程是个动态的概念,他是随着程序运行而开启,程序不运行来了他也就不存在了
进程是程序执行的过程
每个程序可以创建一个或多个进程
二.进程的分类和属性
1.父进程
已创建一个或多个子进程的进程。在UNIX里,除了进程0以外的所有进程都是由其他进程使用系统调用fork创建的,这里调用fork创建新进程的进程即为父进程,而相对应的为其创建出的进程则为子进程,因而除了进程0以外的进程都只有一个父进程,但一个进程可以有多个子进程。
2.子进程
是由另一进程(对应称之为父进程)所创建的进程。子进程继承了对应的父进程的大部分属性,如文件描述符。在Unix中,子进程通常为系统调用fork的产物。在此情况下,子进程一开始就是父进程的副本,而在这之后,根据具体需要,子进程可以借助exec调用来链式加载另一程序。
3.僵尸进程
僵尸进程是处于僵死状态的进程(只要子进程退出,父进程还在运行,但父进程没有读取子进程状态,子进程便进入Z状态)
产生原因:子进程先于父进程退出,父进程(使用wait()系统调用)没有读取到子进程退出的返回代码,这时候子进程为了保存退出原因,因此进入僵死态不会释放所有资源。僵死进程会以终止状态保持在进程表中,并且会⼀直在等待父进程读取其退出状态代码。
4.孤儿进程
相对于僵尸进程,那么必须提到的就是孤儿进程,同僵尸进程相反,假如父进程先于子进程退出,子进程便进入后台运行,成为孤儿进程,孤儿进程随后会被1号init进程领养并回收,也就是将其父进程变为init进程。
5.进程的生命周期和状态
生命周期:每个进程它是由自己的父进程fork出来的子进程,相当于复制了一份出来,继承自己的父进程的一些资源如权限,内存空间等,当运行完毕之后告诉父进程自己结束了,父进程就会把它结束掉
6.五大状态
R正在运行或等待运行或可以被运行的意思
S可中断睡眠 被挂起
D不可中断睡眠(例如对写进行保护,磁盘在写数据时不希望被打断)
T停止进程
Z僵尸进程:该进程应该已经终止但是其父进程无法正常的终止他
(X死掉的进程)
7.进程的属性
进程id 唯一识别一个进程的
父id
启动进程的用户id
进程状态
进程优先级
进程所连接的终端名
进程资源的占用,内存占用比,cpu占用比
三.进程的相关命令
PS命令
使用ps指令即可查看当前系统中正在执行的进程的各种进程信息
ps aux 显示当前用户下所有的终端信息
[root@localhost home]# ps -o user,pid 指定要输出的内容
USER PID
root 10358
root 16602
root 17175
root 19103
USER:启动改进程的用户账号和名称
PID:该进程在系统中的ID号,在当前系统中是唯一的
TTY:表明该进程在哪个终端上进行
STAT:显示了进程当前的状态
TIME:该进程占用CPU时间
COMMAND:启动该进程的命令名称
%CPU:CPU占用的百分比
%NEM:内存占用的百分比
VSZ:占用虚拟内存(swap空间)的大小
RSS:占用常驻内存(物理内存)的大小
最后一列如果是用[]表示内核态的进程,否则是用户启动的进程
STAT状态位常见的状态字符
D //无法中断的休眠状态(通常 IO 的进程);
R //正在运行可中在队列中可过行的;
S //处于休眠状态;
T //停止或被追踪;
W //进入内存交换 (从内核2.6开始无效);
X //死掉的进程 (基本很少见);
Z //僵尸进程;
< //优先级高的进程
N //优先级较低的进程
L //有些页被锁进内存;
s //控制性进程(在它之下有子进程);
l //多线程,克隆线程(使用 CLONE_THREAD, 类似 NPTL pthreads);
+ //位于后台的进程组;
linux是一个多用户,多任务的系统,可以同时运行多个用户的多个程序,就必然会产生很多的进程,而每个进程会有不同的状态。
ps -elf 命令
则以长格式显示系统中的进程信息,输出信息包含PPID(对应进程的父进程PID号)
ps -elf 则以长格式显示系统中的进程信息
ps -ef | awk '$3==1' 查看PPID=1的进程
TTY 表示终端 ?没有终端 1表示本地终端 pts/0 通过远程连接的
PID是随机产生的
- ADDR/SZ/WCHAN:都与内存有关,ADDR表示该进程在内存的哪个部分,如果是个running的进程,一般会显示【-】,SZ表示该进程用掉了多少内存,WCHAN表示进程是否运行,【-】表示正在运行
PRI越小越优先,NI(NICE值 用来调整优先级大小,于PRI成对出现)
ps aux | grep bash 检索bash的信息
ps -elf | grep bash 检索bash的信息以长格式显示
top命令——查看进程动态信息
以动态刷新的方式显示各进程的状态信息 默认排序按CPU从大到小 类似于windows系统的任务管理器
load average :平均负载,程序等待CPU的运行 >1表示超负载 <1表示正常
查看系统平均负载:
top | head -1
uptime
cat /proc/loadavg
开头显示了系统任务(Tasks), CPU占用,内存占用(Mem),交换空间(Swap)
系统任务(Tasks)信息:total,总进程数;running,正在运行的进程数;sleeping,休眠的进程数;
stopped,中停的进程数;zombie,僵死无响应的进程数
CPU占用信息:us,用户占用;sy,内核占用;ni,优先级调度占用;id,空闲cpu; wa,I//O等待占用,hi,硬件中段占用;st,虚拟化占用。要了解空闲的CPU百分比,主要看%id部分。
内存占用(Mem)信息:total,总内存空间;used,已用交换空间;free,空间内存。buffers,缓冲区域,cache 缓存空间
交换空间(Swap)占用:total,总交换空间,used,已用交换空间;free,空间内存,avail 有用的空间
快捷键命令:M(内存) P(CPU) N(PID号)s(该更新时间,默认3S)
Z(变色) 多个CPU按数字1显示多个CPU k(显示CPU占用高的进程并杀掉)
pstree 命令——查看进程树
pstree -aup P表示对应的PID a表示完整的命令信息 u可以列出对应的用户名
pgrep命令-----查询进程信息
pgrep -l log 查询进程包含log的进程及其PID
[root@localhost home]# pgrep -l pickup 显示进程名和进程号
14570 pickup
[root@localhost home]# pgrep -U postfix // -U后加用户会过滤出用户运行的进程号
6839
14570
[root@localhost home]# pgrep -U postfix -l //查询用户下运行的进程和进程号
6839 qmgr
14570 pickup
pgrep -t tty1 查看tty1 的进程
[root@localhost ~]# pgrep -l sshd
6496 sshd
20550 sshd
[root@localhost ~]# pgrep -l -o sshd 当匹配多个时,检索PID最小的那个进程
6496 sshd
[root@localhost ~]# pgrep -l -n sshd 当匹配多个时,检索PID最大的那个进程
20550 sshd
启动进程
在Linux系统中,可以由用户手工启动或者按预定计划调度启动新的进程。手工启动又分为前台启动和后台启动
cp /dev/sr0 /home/d & &放在命令后面,进程启动后会直接放入后台运行
[1] 16237
jobs -l 查看当前终端中在后台运行的进程任务 // -l同时显示该进程对应的PID
Ctrl +Z 讲当前进程挂起
bg 可以将后台中暂停的任务恢复运行,继续在后台执行操作
fg 将后台任务恢复到前台运行
终止进程执行
Ctrl +C 强制中断
kill 1602 杀死进程 // 友好的方式 等于 -15
kill -9 16778 强制杀死
kill -9 %1:杀死后台进程号1
kill -1 重启
killall 可以以进程名来杀死进程
root@localhost ~]# killall -9 vim
[root@localhost ~]# jobs -l
[1]- 21559 已杀死 vim a
[2]+ 21568 已杀死 vim b
pkill 可以根据进程的名称,运行该进程的用户,
[root@localhost ~]# pkill -9 -U postfix
[root@localhost ~]# pgrep -U postfix -l
pkill -f "ping 8.8.8.8" 终止程序