linux进程管理
进程管理
进程基础(当程序被加载到内存当中去被执行就称为进程)
在linux中每一个执行的程序都被称为进程,然后每一个进程都会被分配一个ID号。
每个进程会分为前台进程和后台进程,前台进程是用户在屏幕上看到的可以操作的,后台进程是实际操作的,但在屏幕上无法看到。
之前就曾经尝试过使用ps指令:ps aux来观察现在所有用户进程,其中的PID就是process ID。

PS指令
ps指令用于查看目前系统中正在执行的进程;
ps -a :显示当前终端所有进程信息;
ps -u :以用户的格式显示进程信息;
ps -x :显示后台进程运行的参数;
通常还会配合管道指令筛选我们想要查找的运行进程;
ps -ef :e代表全部进程,f代表全格式显示;

这样可以看出,sshd的PID是1155,它的父进程PID是1,也就是systemd系统后台进程。

可以看到1号进程它的PPID是0也就是说这个进程没有父进程。
父子进程:ps -ef
父进程与子进程之间的关联:

其实我们通过管道指令查询到sshd不难发现,进程1155的父进程是1也就是系统进程;
父进程:系统进程(1号进程)
|
子进程:sshd(1155号进程)
|
子进程:menglao[priv](3022号进程)
|
子进程:menglao@pts/0(3213号进程):xshell进程
终止进程:kill
当某个进程执行到一半需要停止,或者消耗太多资源需要手动停止,使用kill指令来完成(杀后台);
kill 参数 进程号 ;
killall 进程名称;
kill -9 进程号 :代表强制关闭此进程,因为像Windows一样哪怕在任务管理器中依然有部分进程无法关闭,那就要使用强制关闭了。
实例:
1、当我使用orange和menglao两个用户同时登陆时,我通过ps -ef | grep orange可以筛选到因为orange登陆而产生的所有进程,而我想强制让orange退出登陆,我就可以把orange下的所有进程清掉,或者清掉orange的父进程;

我通过使用root超级用户,把关于orange的两个进程都kill掉,这时原本已经登录了的orange前台会显示,已被杀死;

2、杀死多个进程,可以看到我在VMware虚拟机开启了多个文档编辑器(gedit),相对应的我去ps -ef查找,找到了对应的PID,

在执行了killall gedit之后可以看到在VMware虚拟机界面瞬间文档编辑器全部消失了;
3、杀掉终端
在VMware中开启两个终端,然后需要杀掉其中一个,正常来说只需要kill PID(终端bash),但是因为系统的保护机制,两个终端都在打开都在使用,系统出于保护不会执行杀掉其中一个终端的指令,这时就需要用到kill -9 PID。

单纯杀6500是不会有反应的,所以需要使用kill -9 强制杀死;

查看进程树:pstree
pstree可以更加直观的查看用户进程;

pstree -p : 显示进程的PID

pstree -u : 显示进程的所属用户

当然也可以同时使用,使用pstree -up 然后通过管道指令筛选出用户menglao的相关进程;;

服务管理
服务(service)本质其实就是进程,但是运行在后台的通常都会监听某个端口,等待其他程序请求,比如mysqld(数据库)、sshd(远程登录)、防火墙等,所以也把这些叫守护进程。
D-daemon 守护进程
这里就会涉及一个问题我们常常说的像ssh这种,但其实在linux终端中输入的却是sshd,这个多出来的d是什么,其实这个d是daemon的缩写,它是基于linux中服务类程序命名规则而来,像常见的ssh和sshd的区别就是,ssh是客户端我们在linux前台使用ssh指令远程登录其他linux主机;而sshd就是ssh-daemon,是ssh的守护进程,负责监听ssh,只要一旦受到ssh指令马上处理需求。
拿ssh和sshd来详细说明:
ssh:是我们主动远程登录访问其他linux主机的程序,那么能有远程登录别人的时候,那肯定也有别人需要远程登录访问我们linux系统的时候;
sshd :sshd就是负责被动监听,什么时候人家需要远程登录访问我们linux系统了,然后去验证对方身份和权限,所以是守护进程。
ssh 是主动访问别人的客户端,sshd 是被动接收别人访问的服务端守护进程,两者分工明确、程序独立。这是 Linux 远程登录的核心工作模式,也是网络服务中 “客户端 – 服务端” 架构的典型案例。
所以关于linux中或者说网络中,客户端和服务端的概念一定要弄清楚,其实两者最大的区别是在于主动和被动的区别。

service管理指令(ubuntu 18后更加推荐使用systemctl)
(其实这里不用涉及太深,因为课程是以centOS7来做示范的,但其实后面很多更新的系统都是已经使用systemctl来执行守护进程的了)
service 服务名 [start|stop|restart|reload|status]
service指令管理在/etc/init.d中查看,可以看到下图截图,ssh只是众多服务里面的一个。

*重点:systemctl管理指令(Ubuntu20.04可用)
在Ubuntu20.04及往后的版本中,更加建议使用systemctl这个指令,而且教程中更多是以centOS7作为教学蓝本,像centOS7中网络服务network在Ubuntu20.04中却称为NetworkManger,所以其实同样是linux系统在很多指令层面不同的版本还是有很多的不同的。
systemctl [start|stop|restart|status] 服务名 :设置对应服务名的开启/停止/重启/检查状态等的指令,如下图,但其实这里的start和stop只是临时的手动设置,如果需要要永久的自启动开启或者关闭还是需要用enabled和disabled指令;

通常systemctl所管理的服务放置在/usr/lib/systemd/system中,如下图;

systemctl可以设置各个服务的自启动状态(像Windows中的开机自启项):
systemctl list-unit-flies | grep 服务名 :用于查看该服务的自启动状态;

enabled:自启动开启; disabled:自启动关闭; Static:自启动固定不可配置值;
systemctl enabled 服务名 :设置该服务开机自启动开启;
systemctl disabled 服务名 : 设置该服务开机自启动关闭;
systemctl is-enabled 服务名 :查询该服务开机自启动是否开启;
服务运行级别
之前提过,linux系统有相对应的运行级别(但是常用的只有3和5):


setup:查看系统服务(仅在centOS中能用)
可以通过setup来查看系统服务,但是在Ubuntu系统中没有直接等效的指令,更多是被systemctl和netplan、ufw这些分开指令所替代。
chkconfig管理指令(是使用在centOS中,Ubuntu中无法使用。)
通过chkconfig指令设置各个系统运行级别时,服务自启动的开启和关闭;
chkconfig管理的服务也是放在/etc/init.d
其实chkconfig是对应centOS系统(linux系统偏服务器系统使用yum软件管理包的)的,在Ubuntu(linux系统偏开发者桌面级使用apt软件管理包的)有同样的管理命令就是上面提到过的,systemctl 指令。
其中chkconfig –list等效于systemctl list-unit-files。
*重点:ufw指令(是Ubuntu中对应centOS的firewall指令)
ufw指令就是Uncomplicated Firewall缩写,我们日常可以通过:
sudo ufw status :查看当前防火墙的状态;
sudo ufw enabled :打开防火墙;
sudo ufw disabled :关闭防火墙;
sudo ufw allow 22/tcp : 打开防火墙同时允许访问端口22(tcp是常用的网络协议);
sudo ufw deny 22/tcp : 打开防火墙同时拒绝端口22访问(tcp是常用的网络协议);
sudo ufw reset :重置防火墙规则;
动态进程管理
top指令
top指令和ps指令一样都是观察系统中后台进程管理,两者最大的区别是:
ps:静态,它是进程管理的静态快照,只抓取指令被执行一刻的进程列表与属性;
top:动态,它是对进程动态实时监控,会持续刷新进程状态和系统 资源的占用情况,默认每三秒更新一次。
top 参数 :组成最基础的top指令;
-d 秒数,默认三秒更新一次;
-i 忽略所有待机或者僵死的进程;
-p 指定监控某个PID进程;


可以看到上面两个截图,哪怕没有任何指令操作,也能定时刷新。

之前进程状态,这里可以很清晰看得到,
total总计;
running运行中;
sleeping休眠中;
stopped停止;
zombie僵死进程。
当然top还可以按照P(cpu使用率排序)、M(内存使用率排序)、N(PID名称排序)来查看进程。
网络状态监控
通常我们可以使用netstat来查看系统网络情况。
netstat
netstat -an : 按照一定顺序排列输出;
netstat -p :显示那个进程在调用;

ping
ping指令属于网络检测工具,用于检测远程主机访问是否正常
ping 对方ip地址 : 常用的ping指令;


