进程和程序
进程和程序的区别
1、程序是静态概念,本身作为一种软件资源长期保存;而进程是程序的执行过程,它是动态概念,有一定的生命期,是动态产生和消亡的。
2、程序和进程无一一对应关系。一个程序可以由多个进程共用;另一方面,一个进程在活动中有可顺序地执行若干个程序。
父进程和子进程
1、子进程是由一个进程所产生的进程,产生这个子进程的进程称为父进程。
2、在Linux系统中,使用系统调用 fork 创建进程。fork 复制的内容包括父进程的数据和堆栈段以及父进程的进程环境。
3、父进程终止子进程自然终止。
前台进程和后台进程
前台进程:在Shell 提示处打入命令后,创建一个子进程,运行命令,Shell 等待命令退出,然后返回到对用户给出提示符。这条命令与 Shell 异步运行,即在前台运行,用户在它完成之前不能执行另一个命令。
后台进程:在Shell 提示处导入命令,若后随一个&,Shell 创建的子进程运行此命令,单不等待命令退出,而直接返回到对用户给出提示。这条命令与Shell 同步运行,即在后台运行。后台进程必须是非交互式的。
进程状态
三种状态
就绪:进程已经分配到资源,但因为其它进程正占用CPU,所以暂时不能运行而等待分配CPU的状态。
等待:因等待某时间而暂时不能运行的状态。
运行:进程分配到CPU,正在处理器上运行。
进程状态细化
用户运行态:在CPU上执行用户代码。
核心运行态:在CPU上执行核心代码。
在内存就绪:具备运行条件,只等待调度程序为它分配CPU。
在内存睡眠:因等待某一时间的发送,而在内存中排队等待。
在外存就绪:就绪进程被交换到外存上继续处于就绪状态。
在外存睡眠:睡眠进程被交换到外存上继续等待。
在内存暂停:因调用 stop 程序而进入跟踪暂停状态,等待其父进程发送命令。
在外存暂停:处于跟踪暂停态的进程被交换到外存上。
创建态 :新进程正在被创建、但尚未完毕的中间状态。
终止态 :进程终止自己。
进程管理命令
查看用户信息(w)
语法:w [参数选项] [用户名]
参数:
-f :开启或关闭显示用户从何处登入系统。
-h :不显示各栏位的标题信息列。
-l :使用详细格式列表,此为预设值。
-s :使用简洁格式列表,不显示用户登入时间,终端机阶段作业和程序所耗费的CPU时间。
-u :忽略执行程序的名称,以及该程序耗费CPU时间信息。
-V :显示版本信息。
我们输入命令:w 可以看到类似如下结果:
[root@localhost ~]# w
09:32:25 up 7 days, 14 min, 4 users, load average: 0.00, 0.00, 0.00
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root pts/0 192.168.0.179 06:20 1:35m 0.19s 0.19s -bash
root pts/1 192.168.0.179 06:40 1:38m 0.12s 0.07s bash
root pts/2 192.168.0.179 07:54 1:34m 0.15s 0.05s bash
root pts/3 192.168.0.179 09:18 0.00s 0.18s 0.12s w
w 显示信息的含义:
load average :分别显示系统在过去1、5、15分钟内的平均负载程度。
FROM :显示用户从何处登录系统,“:0”的显示代表该用户时从X Window下,打开文本模式窗口登录的。
IDLE :用户闲置的时间。这是一个计时器,一旦用户执行任何操作,该计时器便会被重置。
JCPU :以终端代号来区分,该终端所有相关的进程执行时,所消耗的CPU时间会显示再这里。
PCPU :CPU执行程序耗费的时间。
WHAT :用户正在执行的操作。
查看进程状态的命令(ps)
语法:ps [参数选项]
参数:
-a :显示所有用户的进程
-u :显示用户名和启动时间
-x :显示没有控制终端的进程
-e :显示所有进程,包括没有控制终端的进程
-l :长格式显示
-w :宽行显示,可以使用多个w进行加宽显示
ps应用实例
1、ps 查看隶属于自己的进程
[root@localhost ~]# ps
PID TTY TIME CMD
24867 pts/3 00:00:00 bash
25143 pts/3 00:00:00 ps
2、ps -u or -l 查看隶属于自己进程的详细信息
[root@localhost ~]# ps -u
Warning: bad syntax, perhaps a bogus '-'? See /usr/share/doc/procps-3.2.8/FAQ
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1087 0.0 0.0 2008 8 tty2 Ss+ Sep30 0:00 /sbin/mingetty
root 1089 0.0 0.0 2008 8 tty3 Ss+ Sep30 0:00 /sbin/mingetty
root 1091 0.0 0.0 2008 8 tty4 Ss+ Sep30 0:00 /sbin/mingetty
root 1093 0.0 0.0 2008 8 tty5 Ss+ Sep30 0:00 /sbin/mingetty
root 1102 0.0 0.0 2008 8 tty6 Ss+ Sep30 0:00 /sbin/mingetty
root 23319 0.0 0.0 2008 496 tty1 Ss+ Oct06 0:00 /sbin/mingetty
root 24867 0.0 0.3 5256 1684 pts/3 Ss 09:18 0:00 -bash
root 25144 0.0 0.2 4932 1048 pts/3 R+ 14:26 0:00 ps -u
[root@localhost ~]# ps -l
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
4 S 0 24867 24863 0 80 0 - 1314 - pts/3 00:00:00 bash
4 R 0 25145 24867 0 80 0 - 1220 - pts/3 00:00:00 ps
3、ps -le or -aux 查看所有用户执行的进程的详细信息
[root@localhost ~]# ps -le
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
4 S 0 1 0 0 80 0 - 725 - ? 00:00:02 init
1 S 0 2 0 0 80 0 - 0 - ? 00:00:00 kthreadd
1 S 0 3 2 0 -40 - - 0 - ? 00:00:00 migration/0
1 S 0 4 2 0 80 0 - 0 - ? 00:00:09 ksoftirqd/0
1 S 0 5 2 0 -40 - - 0 - ? 00:00:00 migration/0
5 S 0 6 2 0 -40 - - 0 - ? 00:00:11 watchdog/0
1 S 0 7 2 0 80 0 - 0 - ? 00:04:02 events/0
[root@localhost ~]# ps -aux
Warning: bad syntax, perhaps a bogus '-'? See /usr/share/doc/procps-3.2.8/FAQ
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.1 2900 640 ? Ss Sep30 0:02 /sbin/init
root 2 0.0 0.0 0 0 ? S Sep30 0:00 [kthreadd]
root 3 0.0 0.0 0 0 ? S Sep30 0:00 [migration/0]
root 4 0.0 0.0 0 0 ? S Sep30 0:09 [ksoftirqd/0]
root 5 0.0 0.0 0 0 ? S Sep30 0:00 [migration/0]
root 6 0.0 0.0 0 0 ? S Sep30 0:11 [watchdog/0]
4、ps -aux --sort pid 可按进程执行的时间、PID、UID等对进程进行排序
[root@localhost ~]# ps -aux --sort pid
Warning: bad syntax, perhaps a bogus '-'? See /usr/share/doc/procps-3.2.8/FAQ
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.1 2900 640 ? Ss Sep30 0:02 /sbin/init
root 2 0.0 0.0 0 0 ? S Sep30 0:00 [kthreadd]
root 3 0.0 0.0 0 0 ? S Sep30 0:00 [migration/0]
root 4 0.0 0.0 0 0 ? S Sep30 0:09 [ksoftirqd/0]
root 5 0.0 0.0 0 0 ? S Sep30 0:00 [migration/0]
root 6 0.0 0.0 0 0 ? S Sep30 0:11 [watchdog/0]
root 7 0.0 0.0 0 0 ? S Sep30 4:03 [events/0]
root 8 0.0 0.0 0 0 ? S Sep30 0:00 [cgroup]
root 9 0.0 0.0 0 0 ? S Sep30 0:00 [khelper]
5、ps -uU sam 查看系统中指定用户执行的进程
6、ps -le | grep init
[root@localhost ~]# ps -le | grep init
4 S 0 1 0 0 80 0 - 725 - ? 00:00:02 init
显示的信息含义:
PID:进程号
PPID:父进程的进程号
TTY:进程启动的终端
STAT:进程当前状态
S休眠状态,D不可中断的休眠状态,R运行状态,Z僵死状态,T停止
NI:进程优先级
TIME:进程自从启动以来启动CPU的总时间
COMMAND/CMD:进程的命令名
USER:用户名
%CPU:占用CPU时间和总时间的百分比
%MEM:占用内存与系统内存总量的百分比
杀死进程(kill)
为什么要杀死进程:
1、该进程占用了过多的CPU时间
2、该进程锁住了一个终端,使其他前台进程无法运行
3、运行时间过长,但没有预期效果
4、产生了过多到屏幕或磁盘文件的输出
5、无法正常退出
指令:
关闭进程:kill 进程号
强行关闭:kill -9 进程号
重启进程:kill -l 进程号
关闭图形程序:xkill
结束所有进程:killall
查找服务进程号:pgrep 服务名称
关闭进程:pkill 进程名称
TIPS:父进程关闭,子进程也就自然终止了。在Linux 系统中,父进程关闭了,其对应的子进程也会随之关闭。但有种可能,就是父进程死了,而子进程还存在,则子进程成为了孤儿进程。在Linux 系统中,是不允许有孤儿进程的。因此,如果Linux检测到孤儿进程,会将其父进程指向init。父进程和子进程存在关联关系,如果,子进程死了,而父进程不知道,关联关系没有切断,那么子进程就成为了僵尸进程。
优先级(nice、renice)
nice :指定程序的运行优先级
格式:nice -n command (如:nice -5 myprogram)
renice:改变一个正在运行的进程的优先级
格式:renice -n pid (如:renice -5 777)
TIPS:优先级取值范围为(-20,19)
nohup命令
使进程在用户退出登陆后仍旧继续执行,nohup命令执行后的数据信息和错误信息默认存储到文件 nohup.out 中。
格式:nohup program &
进程的挂起和恢复
进程的中止(挂起)和终止:
挂起(Ctrl + Z)
终止(Ctrl + C)
进程的恢复:
恢复到前台继续运行(fg)
恢复到后台继续运行(bg)
查看被挂起的进程(jobs)
top命令
作用:进程状态显示和进程控制,每5秒钟自动刷新一次(动态显示)
格式:top [参数选项]
常用选项:
-d: 指定刷新的时间间隔
-c: 显示整个命令行而不仅仅显示命令名
-u: 查看指定用户的进程
-k: 终止执行中的进程
-h or ?: 获得帮助
-r: 重新设置进程优先级
-s:改变刷新的时间间隔
-W:将当期设置写入~/.toprc 文件中
-
-