Linux进程管理
概述
在Linux中,每个运行的程序都是一个进程。进程有两种存在的方式:前台和后台。前台的程序我们可以通过可视化界面与其进行交互操作,后台的程序我们一般看不到它,但它实际在运行。而后台的进程一般都是系统服务,它们会常驻内存。
我们可以通过windows的任务管理器直观地感受 mysqld 这个后台进程
注:注意区分程序和进程的概念。
程序是静态的,是一串代码块。
进程是动态的,是程序运行后加载到内存的结果。
查看系统当前执行的进程
ps
#显示当前所有进程信息
ps -a
#显示当前用户中的进程信息
ps -u
显示后台进程的运行参数
ps -x
#分页显示全部进程
ps -aux | more
USER | PID | %CPU | %MEM | VSZ | RSS | TTY | STAT | START | TIME | COMMAND |
---|---|---|---|---|---|---|---|---|---|---|
进程的执行者 | 进程号 | 进程占用CPU百分比 | 进程占用内存百分比 | 进程占用虚拟内存大小(KB) | 进程占用物理内存大小 | 终端机号 | 进程运行状态 | 进程开始执行时间 | 占用CPU的时间 | 进程所用的命令和参数 |
注:进程的状态包含S-睡眠,s-表示该进程是会话的先导进程,N-表示进程拥有比普通优先级更低的优先级,R-表示正在运行,D-表示短期等待,Z-表示僵死进程,T-表示被跟踪或被停止。
其中的僵死进程是程序已经结束进程,但是还在占用内存
父子进程
父进程可以创建多个子进程,如果将一个父进程杀死,则其子进程全部会被杀掉。
#查看进程及其父进程
ps -ef
注
:ps -aux
和ps -ef
查询的最终结果是相同的,ps -ef能够查看到子进程和其父进程
终止进程
#通过进程号杀死进程
kill 进程号
此时是用root用户和cxf用户同时进程远程登录情景。
通过下图我们可知,1289的父进程号为1,3935的父进程号为1289,3940的父进程号为3935。
我们就可以通过 sshd 所对应的cxf用户对应的进程id结束其登录
kill 3940
终止sshd远程登录服务
#查询sshd的PID
ps -ef | grep sshd
kill 5008
#再次查询还有没有sshd服务
ps -ef | grep sshd
杀死sshd后台进程后,我们就不能够使用远程登录了。
此时我们需要进入虚拟机中输入systemctl start sshd
开启sshd后台进程才能重新继续使用远程登录。
#通过进程名称杀死进程(支撑通配符)
killall 进程名称
假设在虚拟机中打开两个文本文档,此时使用的是gedit文本工具,要想直接结束此进程,则可以直接输入killall geid
结束进程,之后该文本工具就会被终止。
强制终止bash终端
注:
下图是在不同的时刻打开的bash,此时强制终止23:10运行的bash,输入kill -9 bash 5310
加上对应的-9选项和PID,即可关闭23:10打开的bash
查看进程树
pstree
#以树状的形式显示进程PID
pstree -p
#以树状的形式显示用户的进程
pstree -u
服务管理
服务本质是进程,服务管理一般都是后台进程,它们会监听某一端口来等待其他程序的请求,而像这样的进程也称为 守护进程,如 mysqld,firewalld,其中的d表示damon。(外部客户端想要连接其实就是找到对应的进程端口,然后再使用)
service
service的使用
service 服务名 [start|stop|restart|reload|status]
关闭network服务(关闭后所有的网络都不连通,包括外部的sshd)
service network stop
注:
在CentOS中,很多服务不再使用service,而是使用systemctl
可以在/etc/init.d查看service指令,下图绿色的部分是还在使用的service命令
如果我们仍使用service命令对一些已经修改为systemctl的命令,则会有重定向的提示。
下图是关闭防火墙的命令,会重定向到systemctl
我们可以通过查看Xshell中root属性中的端口号进一步理解守护进程。此处端口号为22说明Xshell的root用户连接的就是主机192.168.168.168的sshd后台进程的22号端口
查看服务
使用下面的命令就可以进入到系统服务页面查看服务
setup
其中服务前面带 * 号的说明是开机自启,如果想要添加或删除* 号,可按下 空格 键进行修改。(退出此界面需用要 tab 键切换到 取消 按钮)
运行级别(runlevel)
开机的流程如下
设置服务在不同运行级别的状态
查看服务
chkconfig --list | grep xxx
在不同运行级别设置服务(check)
chkconfig --level 运行级别号 on/off
将network服务在3运行级别关闭自启动
chkconfig --level 3 network off
注:用chkconfig查询的服务不包含原生systemd服务
systemctl
注:此时默认是在3和5运行级别操作服务
systemctl [start|stop|restart|status] 服务名
注:systemctl指令在 /usr/lib/systemdsystem中查看
查看服务开机自启状态
systemctl list-unit-files
设置服务自启动状态
#开启
systemctl enable 服务名
#关闭
systemctl disable 服务名
注:start stop 和 enable disable的去背
start stop对于服务的影响只是临时的,重新启动系统后还会恢复到默认状态
enable disable对于服务的影响是永久的,重新启动系统后不会恢复到原来的状态
查看服务是否自启动
systemctl is-enabled 服务名
以防火墙为例
查看防火墙的状况
systemctl status firewalld
systemctl is-enabled firewalld
开启防火墙守护进程
#两种写法均可
systemctl start firewalld
systemctl start firewalld.service
注:如果我们关闭了防火墙,外部程序会很容易进入到我们系统中某一程序
下面用telnet协议演示
假设此时Linux系统的防火墙是关闭的,此时我们在windows主机的命令行中使用telnet测试远程进入Linux主机192.168.168.168的mysql服务(其默认端口号为3306)
此时在Linux系统防火墙关闭的情况下很容易进入mysql服务。
如果开启防火墙,且在防火墙中关闭了其3306端口,则会连接不上
防火墙中包含关闭的端口和开启的端口,当我们打开防火墙且开启某些端口时,外部程序就可以访问到该端口对应的程序。
打开或关闭指定端口
#打开端口
firewall-cmd --permanent --add-port=端口号/协议
#关闭端口
firewall-cmd --permanent --remove-port=端口号/协议
重新载入
firewall-cmd --reload
查询端口是否开放
firewall-cmd --query-port=端口/协议
注:
每次打开或关闭特定端口后,需要重载一下才会生效
我们可以使用netstat -anp查询指定守护进程使用的协议