Linux的进程和服务

本文深入讲解Linux进程的各个方面,包括内存占用、系统环境、进程切换、父进程与子进程的关系、进程状态及查看方法。介绍了作业job的管理,如查看、后台运行、暂停与恢复,以及nohup命令。探讨了信号的定义、来源、分类和使用,以及如何通过kill命令发送信号。详细阐述了实时监控进程的top工具。最后,重点讨论了守护进程systemd,包括其作为顶级守护进程的角色,以及如何通过systemctl管理服务和单元。

目录

一、进程占用的内存资源

二、进程的系统环境

三、进程一直在切换

四、父进程和子进程

五、进程状态

六、查看进程

1.ps -ef 列出所有进程

2.ps -lax 列出所有进程

3.ps aux列出所有进程

4.树形列出所有进程

七、作业job(又叫任务task)(用来查看管理进程)

1.查看作业、作业的进程

2.后台(守护进程方式)运行作业

3.暂停、恢复作业

4.nohup设置作业无法中断

八、信号(用来控制操作进程)

1.定义

2.来源

3.分类

4.常见的信号

5.如何使用信号,来操作进程?

九、实时监控进程

十、守护进程

(1)顶级守护进程systemd

(2)systemd管理服务

1.systemd管理的资源对象以“单元unit”为单位,“单元”分为3类

2.systemd通过systemctl命令管理“单元”

3.systemctl管理服务

查看服务

查看服务依赖

验证服务

操作服务

系统服务文件存放位置

4.服务与进程


一、进程占用的内存资源

1.分配的内存、地址、空间;

2.安全属性,如进程的权限信息;

3.进程的状态、子线程和子线程的状态;

二、进程的系统环境

本地局部变量;

调度上下文;

分配系统资源,如网络端口

三、进程一直在切换

1.进程之间一直在切换(以时间片为单位),切换速度很快;

2.调度上下文:这个进程,最近一次切换前记录的状态

四、父进程和子进程

1.最顶级的父进程是systemd,类似于文件系统的"根目录/";

2.父进程通过fork方式复制自己的地址空间来创建子进程;

3.子进程有2个属性,pid是自己的唯一标识,ppid是父进程的pid;

4.父进程创建、回收子进程的过程

fork方式创建子进程后,父进程进入等待状态;

子进程执行;

子进程结束,释放相关的环境、资源,并向父进程发送回收信号。父进程调用wait()、waitpid()回收子进程环境、资源;

僵尸进程:是子进程结束这一步出现问题造成的。子进程其他的环境、资源都释放了除了pid,发送信号后pid就没被父进程回收。结果我们ps查看进程时,显示有这个进程号但没实际进程,就像僵尸一样;


孤儿进程:程序执行一般是子进程先结束然后父进程才结束。孤儿进程是指父进程先结束了,子进程还没结束,然后子进程自动移交给systemd统一管理了,此时的子进程就叫孤儿进程

五、进程状态

runnable:等待状态,即处于等待cpu调用的状态(电脑卡、负载高,就是因为CPU一直不调用,一直处于runnable状态,所以就表现为卡起了)

running:分2种状态,内核级别(要和硬件打交道:进程先调用内核接口,然后内核控制硬件)、用户级别

supend、resume:暂停、恢复

sleeping:等待用户输入、或等待数据返回的状态

exit:退出状态

zombie:僵尸状态

六、查看进程

1.ps -ef 列出所有进程

uid:用户名

pid:进程pid(1是systemd)

ppid:父进程(0是系统内核进程)

stime:进程从什么时候开始运行的

tty:哪个控制台创建的进程。?表示开机时就创建的进程

cmd:[]中括号引起来的是 系统内核进程

2.ps -lax 列出所有进程

pri:优先级

NI:nice值。值越大,优先级越高

VSZ:进程运行时申请的内存大小

RSS:实际运行的内存大小

STAT:进程当前状态(S—睡眠、Ss—进程为父进程且处于睡眠状态、SN—进程优先级很低且处于睡眠状态)/*第一个字符代表状态,后面为状态补充说明,N表示进程优先级很低,s表示进程为父进程,+表示为前台进程而非守护进程、还有很多状态,不知道含义,可以man ps,然后筛选出STAT去看*/

3.ps aux列出所有进程

TIME:进程总共占用cpu执行了多长时间(单位秒,0表示不足1秒,或者从创建后一直在等待没被调用过)

4.树形列出所有进程

ps -ef 、ps -wxf (树形显示父子进程,和他们的进程信息)、pstree (树形结构显示所有族谱进程)

pstree 【选项】【pid/user】


-c :线程也打印出来

  • pid:只显示此pid的进程
  • user:只显示此user的进程

七、作业job(又叫任务task)(用来查看管理进程)

1.查看作业、作业的进程

jobs    -- 列出当前shell终端运行的作业(即程序或命令)

+代表最近一个运行的命令

-代表最近一个的运行的命令的上一个命令

显示当前终端所有作业的进程信息:ps j

2.后台(守护进程方式)运行作业

以后台(守护进程)方式运行作业:

sleep 5000 &      --- 执行休眠5000秒这个作业,并且以守护进程的方式后台运行(命令最后加&符号代表以守护进程方式运行)

后台作业改成前台方式:

fg %【作业编号,最左边哪个括号括起来的数字】    ---比如:fg %3      #编号为3的作业

3.暂停、恢复作业

暂停作业并改为后台(守护进程)方式:ctrl+z

暂停状态改为运行状态:bg %3

4.nohup设置作业无法中断

设置作业进程无法中断:nohup sleep 5000 & --比如我关了当前终端,后台运行的sleep 5000 &属于当前终端的子进程,也应该会中断,但加了nohup就不会中断。如果sleep 5000 &命令有日志打印输出,会保存到当前路径的nohup.out文件里,cat nohup.out就能看到

八、信号(用来控制操作进程)

1.定义

信号指的是传递至进程的软件中断,信号向执行中的程序报告事件

2.来源

错误、或外部事件(如I/O请求、定时器过期),发送信号命令;

键盘输入

3.分类

终止(Term) :意外退出。导致程序立即终止(退出)

核心转储(Core) :正常退出并保存。程序保存内存映像(核心转储),然后终止

停止(Stop) :暂停。导致程序停止执行(暂停),再等待继续(恢复)

4.常见的信号

5.如何使用信号,来操作进程?

键盘输入方式:

Ctrl-z (暂停) ---stop  停止或等待恢复

Ctrl-c (中止) ---term 立即终止并退出

Ctrl-\ (核心转储) ---core  程序保存内存映像,然后终止

发送信号命令:

kill、killall命令可以向进程发送任何信号

(1)过滤筛选,查看进程

pgrep -l -u 【用户名】 #筛选出用户的所有进程

(1)操作单个进程kill

kill-l        ---查看可以发送的信号

kill -【信号编码】 【进程PID】

(3)批量操作进程killall、pkill

killall -u 【用户名】    ----杀死用户的所有进程(进程的uid属性与用户一一对应)

pkill -u 【用户名】

pkill -U 【uid】 #杀死指定uid用户的所有进程

pkill -G 【gid】 #杀死指定gid组包含用户的所有进程

九、实时监控进程

top

1.前面部分打印结果:进程总体情况

16:47:08:当前系统时间

7:40:从开机到现在,系统运行的时长

1 users:当前登录系统的用户数量

load average:1.46,0.74,0.29:系统负载。第一个1.46是1分钟前到现在这段时间的负载平均值、第二个0.74是5分钟前的负载平均值、第三个0.29是15分钟前的负载平均值(“负载平均值/CPU物理核心数>1”表示系统繁忙负载高)

tasks:当前系统一共有多少进程

%CPU0:0.3us,0.3sy,0.0ni,99.3id,0.0wa,:第一个CPU物理核心使用情况。us用户进程占用0.3%、sy系统进程占0.3、ni?????、id表示计算CPU空闲进程的计算结果(数字是空闲百分比,数字越大CPU越空闲,负载越低)、wa是IO-wait的简称表示CPU等待磁盘的时间(数字越大磁盘越繁忙)、

%CPU1:第二个CPU物理核心情况

Mib Mem:内存

Mib Swap:内存交换

2.后面部分打印结果:每个进程详细情况

按cpu占用从大到小排序:按P     ----存在CPU超过100%的情况,是因为可能有多个CPU(比如2个CPU都用完了就是200%)

按内存占用从大到小排序:按M

交互式操作进程:

  • 先按k;
  • 会提示输入进程pid号PID to signaL/kill [default pid = 1357];    ---默认pid是1357
  • 输入要操作进程的pid,回车(按esc取消);
  • 会提示输入指令信号编号Send pid 【pid号】 signal [15/sigterm]; ---默认是15,杀死进程
  • 输入信号编号。比如输入15或者不输入,然后回车,就杀死该进程了(按esc取消)

退出top:按q

十、守护进程

守护进程又叫后台进程,终端关了仍在后台运行不影响。

(1)顶级守护进程systemd

新版本linux,都是systemd进程。是管理开机、关机、服务的一个进程    ##旧版本linux,是init进程(/sbin/init)

(2)systemd管理服务

1.systemd管理的资源对象以“单元unit”为单位,“单元”分为3类

  • .servce服务单元
  • .socket套接字单元     ###socket分为:主机间socket、文件socket(主机和文件间)
  • .path路径单元

2.systemd通过systemctl命令管理“单元”

systemctl -t help        ###查看帮助:有哪些单元类型是systemd可以管理的

systemctl                   ###查看后面可以跟哪些子命令

systemctl list-units-files    ###查看所有已加载单元的状态

systemctl --failed --type=service   ###查看失败的单元

systemctl status 【单元名+单元类型,如:newIO.socket】        ###查看单元状态


验证单元是否处于活动状态
systemctl is-active 【单元名+单元类型】
验证单元是否开机自启
systemctl is-enabled 【单元名+单元类型】
验证单元是否启动会失败,启动不了
systemctl is-failed sshd 【单元名+单元类型】

3.systemctl管理服务

服务是单元的一种类型

  • 查看服务

systemctl  --type=service   ###查看所有已加载的服务

systemctl list-units-files --type=service  ###查看所有已加载服务的状态

systemctl --failed --type=service   ###查看失败的服务

systemctl status 【服务名】     ###查看服务状态

【打印结果】


【服务状态】

loaded:服务的配置文件已经加载完成
active(running):服务已启动,正由一个或多个进程运行
active(exited):已成功完成,进程已退出
active(waiting):服务已启动,进程睡眠中,等待某一事件触发
Inactive:未运行
enabled:开机自启
disabled:开机不自启(未设置引导启动)
static:不能单独启动该服务,必须由其他服务启动

  • 查看服务依赖

systemctl list-dependencies 【服务名】   ###查看服务启动前,必须要先启动的其他依赖子服务有哪些
 

  • 验证服务

验证单元是否处于活动状态
systemctl is-active 【服务名】
验证单元是否开机自启
systemctl is-enabled 【服务名】
验证单元是否启动会失败,启动不了
systemctl is-failed 【服务名】

  • 操作服务

启动、停止、重启服务

systemctl start【服务名】  

systemctl stop【服务名】

systemctl restart【服务名】


重新加载服务配置文件

systemctl restart 【服务名】     ###比如修改了tomcat的配置文件,立即生效,无需重启服务


设置服务开机不自启

systemctl disable 【服务名】--now    ###加了--now会马上停止服务


设置服务开机自启

方式一:把“服务名.service”放到/etc/systemd/system/multi-user. target .wants/下   ###因为/etc/systemd/system/multi-user. target .wants/*.service系统开机都会自启

方式二:systemctl enable【服务名】 --now    ###加了--now会马上启动服务

/*原理:执行该命令会在/etc/systemd/system/multi-user. target .wants/下创建一个叫“服务名.service”的软连接,指向真实“服务名.service”所在路径*/


屏蔽服务

systemctl mask【服务名】   ###屏蔽了之后服务就启动不了了

/*原理:在/usr/lib/systemd/system/或/etc/systemd/system/下创建一个“服务名.service”软连接,指向/dev/null   */


解除服务屏蔽

systemctl unmask【服务名】   ###原理删除指向/dev/null 的软连接向/dev/null 

  • 系统服务文件存放位置

/usr/lib/systemd/system/存放内置的系统服务文件

/usr/lib/systemd/system/*.service、/usr/lib/systemd/system/xxxxx.want/*.service   ###是“服务名.service”的软连接,指向真实“服务名.service”所在路径


/etc/systemd/system/存放我们自己创建编写的系统服务文件

/etc/systemd/system/*.service、/etc/systemd/system/xxxxx.want/*.service   ###可以存放软连接指向真实“服务名.service”所在路径,也可以存放真实“服务名.service”


优先级:

/etc/systemd/system/下的服务软连接,优先级比/usr/lib/systemd/system/高;

/*如果都有指向同一“服务名.service”的软连接,/etc/systemd/system/下的软连接优先。比如:两个目录下都有mysqld.service,如果/etc/systemd/system/mysqld.service被屏蔽了,尝试重启服务,/usr/lib/systemd/system/mysqld.service仍然得不到执行。此时mysqld这个服务会启动不了*/

4.服务与进程

  • 一个服务可以由一个或多个进程(程序)运行
  • 以d结尾的系统进程都是守护进程

查看进程对应的服务

systemctl status 【进程pid】

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值