在 Windows 中主要是使用"任务管理器"来进行进程管理的。目的是:
1)利用"应用程序"和"进程"标签来査看系统中到底运行了哪些程序和进程;
2)利用"性能"和"用户"标签来判断服务器的健康状态;
3)在"应用程序"和"进程"标签中强制中止任务和进程;
但是,在使用 Windows 系统的过程中,使用任务管理器,很大程度上是为了强制关闭“未反应”的软件,也就是杀死进程。
Linux 中是使用命令进行进程管理,主要目的都是是一样的,进程管理的作用:
1) 判断服务器的健康状态
2)查看系统中所有的进程
3) 杀死进程
一、进程管理中的有些概念1、程序(program)
程序是人使用计算机语言编写的指令和数据的代码集合。用来实现特定目标或解决特定问题,其本身没有任何运行的含义,是一个静态的概念。
2、进程(process)
进程是正在执行的一个程序或命令,每个进程都是一个运行的实体,都有自己的地址空间,并占用一定的系统资源。
主要包含两点:
1)进程是一个“执行中的程序”。
程序是一个没有生命的实体,只有处理器赋予程序生命时,它才能成为一个活动的实体,我们称其为进程。
2)进程是一个实体,拥有资源。
每一个进程都有它自己的地址空间,一般情况下,包括文本区域(text region)、数据区域(data region)和堆栈(stack region)。文本区域存储处理器执行的代码;数据区域存储属性变量和进程执行期间使用的动态分配的进程的内存地址;堆栈区域存储着活动过程调用的指令和临时变量。
顺便说一下线程:
线程是进程的一个执行流,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。一个进程由几个线程组成,线程与同属一个进程的其他的线程共享进程所拥有的全部资源。
总结:进程是资源分配的最小单位。线程是程序执行的最小单位。
3、Linux中的进程状态
R (TASK_RUNNING),可执行状态,只有在该状态的进程才可能在CPU上运行。
S (TASK_INTERRUPTIBLE),可中断的睡眠状态,处于这个状态的进程因为等待某某事件的发生(比如等待socket连接、等待信号量),而被挂起。
D (TASK_UNINTERRUPTIBLE),不可中断的睡眠状态,与TASK_INTERRUPTIBLE状态类似,进程处于睡眠状态,但是此刻进程是不可中断的,这种进程的特征就是kill -9命令杀不死,而TASK_UNINTERRUPTIBLE状态存在的意义就在于,内核的某些处理流程是不能被打断的。
T (TASK_STOPPED or TASK_TRACED),暂停状态或跟踪状态,向进程发送一个SIGSTOP信号,它就会因响应该信号而进入TASK_STOPPED状态,向进程发送一个SIGCONT信号,可以让其从TASK_STOPPED状态恢复到TASK_RUNNING状态,被跟踪的进程下一个断点,进程在断点处停下来的时候就处于TASK_TRACED状态。
Z (TASK_DEAD - EXIT_ZOMBIE),退出状态,进程成为僵尸进程,进程在退出的过程中,处于TASK_DEAD状态,在这个退出过程中,进程占有的所有资源将被回收,除了task_struct结构(以及少数资源)以外。于是进程就只剩下task_struct这么个空壳,故称为僵尸。
之所以保留task_struct,是因为task_struct里面保存了进程的退出码、以及一些统计信息。而其父进程很可能会关心这些信息。
4、父进程和子进程
某些进程会产生一些新的进程,我们把这些进程称作子进程,而把这个进程本身称作父进程。子进程是依赖父进程而产生的,如果父进程不存在,那么子进程也不存在了。
每一个子进程都有一个父进程,当进程终止或者结束的时候,都会给父进程发送一个SIGCHLD信号,系统默认是父进程忽略这个信号,如果父进程希望被告知其子进程的这种状态改变,则应该捕获这个信号,捕捉函数一般是wait函数来取得子进程ID和子进程状态。CentOS6.x,系统启动的第一个进行是init,CentOS7.x,系统启动的第一个进行是systemd,其他的所有进程,都是第一个系统进程的后代。
5、Linux后台进程与前台进程的区别:
前台进程:是在终端中运行的命令,那么该终端就为进程的控制终端,一旦这个终端关闭,这个进程也随着消失
后台进程::也叫守护进程(Daemon),是运行在后台的一种特殊进程,不受终端控制,它不需要与终端交互;
Linux的大多数服务器就是用守护进程实现的。比如,Web服务器httpd等。
6、缓冲(buffer)和缓存(cache)的区别:
缓存(cache):是在读取硬盘中的数据时,把最常用的数据保存在内存的缓存区中,再次读取该数据时,就不去硬盘中读取了,而在缓存中读取。
缓冲(buffer):是在向硬盘写入数据时,先把数据放入缓冲区,然后再一起向硬盘写入,把分散的写操作集中进行,减少磁盘碎片和硬盘的反复寻道,从而提高系统性能。
简单来说,缓存(cache)是用来加速数据从硬盘中"读取"的,而缓冲(buffer)是用来加速数据"写入"硬盘的。
二、进程与管理操作1、查看正在运行的进程 -- ps命令
ps 命令用于查看系统中所有运行进程的详细信息。
基本格式为:
[root@centos7 ~]# ps aux
#查看系统中所有的进程,使用 BS 操作系统格式
[root@centos7 ~]# ps -le
#查看系统中所有的进程,使用 Linux 标准命令格式
选项:
- a:显示一个终端的所有进程,除会话引线外;
- u:显示进程的归属用户及内存的使用情况;
- x:显示没有控制终端的进程;
- -l:长格式显示更加详细的信息;
- -e:显示所有进程;
ps 命令有些与众不同,它的部分选项不能加入"-",比如命令"ps aux",其中"aux"是选项,但是前面不能带“-”。
ps 命令有多种不同的使用方法,记住下面几个固定选项即可。
1)"ps aux" 可以查看系统中所有的进程;
[root@centos7 ~]# ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 1.8 0.1 125708 4188 ? Ss 21:38 0:01 /usr/lib/systemd/systemd --switched-r
root 2 0.0 0.0 0 0 ? S 21:38 0:00 [kthreadd]
root 3 0.0 0.0 0 0 ? S 21:38 0:00 [ksoftirqd/0]
root 4 0.0 0.0 0 0 ? R 21:38 0:00 [kworker/0:0]
root 5 0.0 0.0 0 0 ? S< 21:38 0:00 [kworker/0:0H]
...
表头含义USER该进程是由哪个用户产生的。PID进程的 ID。%CPU该进程占用 CPU 资源的百分比,占用的百分比越高,进程越耗费资源。%MEM该进程占用物理内存的百分比,占用的百分比越高,进程越耗费资源。VSZ该进程占用虚拟内存的大小,单位为 KB。RSS该进程占用实际物理内存的大小,单位为 KB。TTY该进程是在哪个终端运行的。其中,tty1 ~ tty7 代表本地控制台终端(可以通过 Alt+F1 ~ F7 快捷键切换不同的终端),tty1~tty6 是本地的字符界面终端,tty7 是图形终端。pts/0 ~ 255 代表虚拟终端,一般是远程连接的终端,第一个远程连接占用 pts/0,第二个远程连接占用 pts/1,依次増长。STAT进程状态。常见的状态有以下几种:
- -D:不可被唤醒的睡眠状态,通常用于 I/O 情况。
- -R:该进程正在运行。
- -S:该进程处于睡眠状态,可被唤醒。
- -T:停止状态,可能是在后台暂停或进程处于除错状态。
- -W:内存交互状态(从 2.6 内核开始无效)。
- -X:死掉的进程(应该不会出现)。
- -Z:僵尸进程。进程已经中止,但是部分程序还在内存当中。
- -192.168.198.1:65231 (ESTABLISHED)
6、终止/关闭进程 -- kill、killall 和 pkill命令
kill 命令:通过进程号关闭单个进程,不能通过进程名。
killall和pkill命令:通过进程名字杀死指的进程
1) kill 命令
kill 命令用来杀死进程的命令,但其实,kill 命令只是用来向进程发送一个信号,至于这个信号是什么,是用户指定的。
kill 命令的执行原理是这样的,kill 命令会向操作系统内核发送一个信号(多是终止信号)和目标进程的 PID,然后系统内核根据收到的信号类型,对指定进程进行相应的操作。
kill 命令只是“发送”一个信号,因此,只有当信号被程序成功“捕获”,系统才会执行 kill 命令指定的操作;反之,如果信号被“封锁”或者“忽略”,则 kill 命令将会失效。
基本格式为:[root@centos7 ~]# kill [信号] 进程号PID
Linux 定义了几十种不同类型的信号,可以使用 kill -l 命令查看所有信号及其编号,各个信号名称的前缀 SIG可以省略,如SIGTERM 和 TERM 这两种写法都对,常用的几个信号如下:
信号编号信号名含义0EXIT 程序退出时收到该信息。1HUP挂掉电话线或终端连接的挂起信号,这个信号也会造成某些进程在没有终止的情况下重新初始化。2INT表示结束进程,但并不是强制性的,常用的 "Ctrl+C" 组合键发出就是一个 kill -2 的信号。3QUIT退出。9KILL杀死进程,即强制结束进程。11SEGV 段错误。15TERM正常结束进程,是 kill 命令的默认信号。[root@centos7 ~]# kill -l 1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP 6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1 11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM 16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP 21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ 26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR 31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3 38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8 43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13 48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12 53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7 58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2 63) SIGRTMAX-1 64) SIGRTMAX
杀死httpd进程(9607):
[root@centos7 ~]# ps aux | grep httpd root 9607 0.0 0.1 230408 5168 ? Ss 14:53 0:00 /usr/sbin/httpd -DFOREGROUND apache 9608 0.0 0.0 230408 3008 ? S 14:53 0:00 /usr/sbin/httpd -DFOREGROUND apache 9609 0.0 0.0 230408 3008 ? S 14:53 0:00 /usr/sbin/httpd -DFOREGROUND apache 9610 0.0 0.0 230408 3008 ? S 14:53 0:00 /usr/sbin/httpd -DFOREGROUND apache 9611 0.0 0.0 230408 3008 ? S 14:53 0:00 /usr/sbin/httpd -DFOREGROUND apache 9612 0.0 0.0 230408 3008 ? S 14:53 0:00 /usr/sbin/httpd -DFOREGROUND root 9662 0.0 0.0 112724 984 pts/0 S+ 15:06 0:00 grep --color=auto httpd [root@centos7 ~]# kill -9 9608 [root@centos7 ~]# ps aux | grep httpd root 9607 0.0 0.1 230408 5168 ? Ss 14:53 0:00 /usr/sbin/httpd -DFOREGROUND apache 9609 0.0 0.0 230408 3008 ? S 14:53 0:00 /usr/sbin/httpd -DFOREGROUND apache 9610 0.0 0.0 230408 3008 ? S 14:53 0:00 /usr/sbin/httpd -DFOREGROUND apache 9611 0.0 0.0 230408 3008 ? S 14:53 0:00 /usr/sbin/httpd -DFOREGROUND apache 9612 0.0 0.0 230408 3008 ? S 14:53 0:00 /usr/sbin/httpd -DFOREGROUND apache 9663 0.0 0.0 230408 3012 ? S 15:07 0:00 /usr/sbin/httpd -DFOREGROUND root 9665 0.0 0.0 112724 988 pts/0 S+ 15:07 0:00 grep --color=auto httpd
2)killall 命令
killall 命令通过程序的进程名来杀死一类进程。
基本格式为:killall [选项] [信号] 进程名
选项:
- -i:交互式,询问是否要杀死某个进程;
- -I:忽略进程名的大小写;
[root@centos7 ~]# systemctl start httpd [root@centos7 ~]# ps aux | grep httpd root 9683 0.3 0.1 230408 5172 ? Ss 15:11 0:00 /usr/sbin/httpd -DFOREGROUND apache 9684 0.0 0.0 230408 3012 ? S 15:11 0:00 /usr/sbin/httpd -DFOREGROUND apache 9685 0.0 0.0 230408 3012 ? S 15:11 0:00 /usr/sbin/httpd -DFOREGROUND apache 9686 0.0 0.0 230408 3012 ? S 15:11 0:00 /usr/sbin/httpd -DFOREGROUND apache 9687 0.0 0.0 230408 3012 ? S 15:11 0:00 /usr/sbin/httpd -DFOREGROUND apache 9688 0.0 0.0 230408 3012 ? S 15:11 0:00 /usr/sbin/httpd -DFOREGROUND root 9690 0.0 0.0 112724 988 pts/0 S+ 15:11 0:00 grep --color=auto httpd [root@centos7 ~]# killall -9 httpd [root@centos7 ~]# ps aux | grep httpd root 9698 0.0 0.0 112724 988 pts/0 S+ 15:12 0:00 grep --color=auto httpd
3)pkill 命令
pkill 命令通过程序的进程名来杀死一类进程。
基本格式为:[root@centos7 ~]# pkill [信号] 进程名
pkill 命令还有一个功能,即按照终端号来踢出用户登录,此时的 pkill 命令的基本格式如下:
[root@centos7 ~]#pkill [-t 终端号] 进程名
[-t 终端号] 选项用于按照终端号踢出用户;
[root@centos7 ~]# ps aux | grep httpd root 9733 0.1 0.1 230408 5172 ? Ss 15:16 0:00 /usr/sbin/httpd -DFOREGROUND apache 9734 0.0 0.0 230408 3012 ? S 15:17 0:00 /usr/sbin/httpd -DFOREGROUND apache 9735 0.0 0.0 230408 3012 ? S 15:17 0:00 /usr/sbin/httpd -DFOREGROUND apache 9736 0.0 0.0 230408 3012 ? S 15:17 0:00 /usr/sbin/httpd -DFOREGROUND apache 9737 0.0 0.0 230408 3012 ? S 15:17 0:00 /usr/sbin/httpd -DFOREGROUND apache 9738 0.0 0.0 230408 3012 ? S 15:17 0:00 /usr/sbin/httpd -DFOREGROUND root 9740 0.0 0.0 112724 988 pts/0 S+ 15:17 0:00 grep --color=auto httpd [root@centos7 ~]# pkill -9 httpd [root@centos7 ~]# ps aux | grep httpd root 9751 0.0 0.0 112724 984 pts/0 S+ 15:18 0:00 grep --color=auto httpd
关闭CRT连接工具
三、进程的优先级Linux 是一个多用户、多任务的操作系统,系统中通常运行着非常多的进程。当 Linux 内核尝试决定哪些运行中的进程可以访问 CPU 时,其中一个需要考虑的因素就是进程优先级的值,由于进程优先级的存在,进程并不是依次运算的,而是哪个进程的优先级高,哪个进程会在一次运算循环中被更多次地运算。也就是说在同一个调度周期中,优先级高的进程占用的时间长些,而优先级低的进程占用的短些。
在 Linux 系统中,表示进程优先级的有两个参数:Priority 和 Nice。PRI 代表 Priority,NI 代表 Nice。这两个值都表示优先级,数值越小代表该进程越优先被 CPU 处理。
PRI 和 NI 的关系如下:PRI (最终值) = PRI (原始值) + NI
但是,PRI值是由内核动态调整的,用户不能直接修改。所以我们只能通过修改 NI 值来影响 PRI 值,间接地调整进程优先级。
修改 NI 值时注意事项:
- NI 范围是 -20~19。
- 普通用户调整 NI 值的范围是 0~19,而且只能调整自己的进程。
- 普通用户只能调高 NI 值,而不能降低。如原本 NI 值为 0,则只能调整为大于 0。
- 只有 root 用户才能设定进程 NI 值为负值,而且可以调整任何用户的进程。
1、nice命令修改
nice 命令可以给要启动的进程赋予 NI 值,但是不能修改已运行进程的 NI 值。
基本格式为:[root@centos7 ~]# nice [-n NI值] 命令
-n NI值:给命令赋予 NI 值,该值的范围为 -20~19;
[root@centos7 ~]# systemctl start httpd [root@centos7 ~]# ps aux | grep httpd root 11483 0.1 0.1 230408 5164 ? Ss 15:42 0:00 /usr/sbin/httpd -DFOREGROUND apache 11484 0.0 0.0 230408 3004 ? S 15:42 0:00 /usr/sbin/httpd -DFOREGROUND apache 11485 0.0 0.0 230408 3004 ? S 15:42 0:00 /usr/sbin/httpd -DFOREGROUND apache 11486 0.0 0.0 230408 3004 ? S 15:42 0:00 /usr/sbin/httpd -DFOREGROUND apache 11487 0.0 0.0 230408 3004 ? S 15:42 0:00 /usr/sbin/httpd -DFOREGROUND apache 11488 0.0 0.0 230408 3004 ? S 15:42 0:00 /usr/sbin/httpd -DFOREGROUND root 11490 0.0 0.0 112724 984 pts/0 S+ 15:42 0:00 grep --color=auto httpd [root@centos7 ~]# systemctl stop httpd [root@centos7 ~]# nice -n -5 httpd [root@centos7 ~]# systemctl start httpd [root@centos7 ~]# ps -le | grep httpd 1 S 0 11542 1 0 75 -5 - 57602 poll_s ? 00:00:00 httpd 5 S 48 11543 11542 0 75 -5 - 57602 inet_c ? 00:00:00 httpd 5 S 48 11544 11542 0 75 -5 - 57602 inet_c ? 00:00:00 httpd 5 S 48 11545 11542 0 75 -5 - 57602 inet_c ? 00:00:00 httpd 5 S 48 11546 11542 0 75 -5 - 57602 inet_c ? 00:00:00 httpd 5 S 48 11547 11542 0 75 -5 - 57602 inet_c ? 00:00:00 httpd [root@centos7 ~]#
2、 renice 命令修改
renice 命令可以在进程运行时修改其 NI 值,从而调整优先级。
基本格式为:[root@centos7 ~]# renice [NI值] PID
[root@centos7 ~]# renice 10 11542 11542 (进程 ID) 旧优先级为 -5,新优先级为 10 [root@centos7 ~]# ps -le | grep httpd 1 S 0 11542 1 0 90 10 - 57602 poll_s ? 00:00:00 httpd 5 S 48 11543 11542 0 75 -5 - 57602 inet_c ? 00:00:00 httpd 5 S 48 11544 11542 0 75 -5 - 57602 inet_c ? 00:00:00 httpd 5 S 48 11545 11542 0 75 -5 - 57602 inet_c ? 00:00:00 httpd 5 S 48 11546 11542 0 75 -5 - 57602 inet_c ? 00:00:00 httpd 5 S 48 11547 11542 0 75 -5 - 57602 inet_c ? 00:00:00 httpd
命令显示的信息含义太多,用到了回头查就好
ends~