Linux系统进程管理

什么是进程

进程是已启动的可执行程序的运行实例,进程有以下组成部分:

分配内存, 已分配内存的地址空间 
安全属性, 进程的运行身份和权限 
进程代码, 运行一个或多个的线程 
进程状态, 进程运行后的多种状态

静态程序, 二进制文件, 静态/usr/bin/ls, /usr/sbin/sshd 
动态进程, 程序运行的过程, 有生命周期及运行状态

进程的运行环境,包括以下几个部分:

局部和全局变量 
当前的调度上下文 
分配给进程使用的系统资源,例如文件描述符、网络端口等 
给进程分配对应的PID,PPID

进程生命周期

程序运行时进程的状态关系:

父进程复制自己的地址空间创建新的子进程, 子进程可以继承父进程(PPID)的环境变量 
每个进程都有自己的唯一ID(PID) 
进程是由systemd这个父进程派生出来的子进程 
子进程在运行自己的程序代码的时候, 父进程往往会进入到睡眠状态。 
子进程完成程序代码发出退出信号请求, 
子进程已经关闭或丢弃了其资源环境, 剩余的部分称之为僵停(僵尸Zombie) 
父进程在子进程退出时收到信号会被唤醒, 清理剩余的结构,然后继续执行其自己的程序代码。

监控和管理进程

在多任务处理操作系统中,每个CPU(或核心)在一个时间点上只能处理一个进程。 
在进程运行时,它对 CPU 时间和资源分配的要求会不断变化,从而为进程分配一个状态,它随着环境要求而改变。

静态监控进程

静态查看进程通常使用ps命令

了解进程如下选项: 
PID,PPID 
当前的进程状态 
内存的分配情况 
CPU 和已花费的时间 
用户UID决定进程的特权

[root@local ~]# ps aux|less
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.3 46276 5836 ? Ss Feb27 0:46 /usr/lib/systemd/systemd --system --deserialize 21
 
USER: //运行进程的用户
PID: //进程 ID
%CPU: //CPU 占用率
%MEM: //内存占用率
VSZ: //占用虚拟内存
RSS: //占用实际内存 驻留内存
TTY: //进程运行的终端
STAT: //进程状态 man ps (/STATE)
R //进程运行
S //可中断睡眠
D //不可中断睡眠
Z //僵尸进程
X //进程已经退出
T //进程被暂停
Ss s //进程的领导者,父进程
S< < //优先级较高的进程
SN N //优先级较低的进程
R+ + //表示是前台的进程组
Sl //以线程的方式运行
START: //进程的启动时间
TIME: //进程占用 CPU 的总时间
COMMAND: //进程文件,进程名

ps命令使用方法

//对进程的CPU进行排序展示
[root@local ~]# ps aux --sort %cpu |less
[root@local ~]# ps aux --sort -%cpu |less
 
//显示进程的子进程
[root@local ~]# yum install httpd -y
[root@local ~]# systemctl start httpd
[root@local ~]# ps auxf |grep httpd
root 2225 0.0 0.0 112720 984 pts/0 S+ 07:20 0:00 \_ grep --color=auto httpd
root 2160 0.1 0.2 230376 5188 ? Ss 07:19 0:00 /usr/sbin/httpd -DFOREGROUND
apache 2166 0.0 0.1 230376 3012 ? S 07:19 0:00 \_ /usr/sbin/httpd -DFOREGROUND
apache 2167 0.0 0.1 230376 3012 ? S 07:19 0:00 \_ /usr/sbin/httpd -DFOREGROUND
apache 2168 0.0 0.1 230376 3012 ? S 07:19 0:00 \_ /usr/sbin/httpd -DFOREGROUND
apache 2169 0.0 0.1 230376 3012 ? S 07:19 0:00 \_ /usr/sbin/httpd -DFOREGROUND
apache 2170 0.0 0.1 230376 3012 ? S 07:19 0:00 \_ /usr/sbin/httpd -DFOREGROUND
 
//自定义显示字段
[root@local ~]# ps axo user,pid,ppid,%mem,command |grep httpd
root 45151 1 0.5 /usr/sbin/httpd -DFOREGROUND
apache 45152 45151 0.2 /usr/sbin/httpd -DFOREGROUND
apache 45153 45151 0.2 /usr/sbin/httpd -DFOREGROUND
apache 45154 45151 0.2 /usr/sbin/httpd -DFOREGROUND
apache 45155 45151 0.2 /usr/sbin/httpd -DFOREGROUND
apache 45156 45151 0.2 /usr/sbin/httpd -DFOREGROUND
root 45158 44906 0.0 grep --color=auto httpd
 
//查看指定进程PID
[root@local ~]# ps aux|grep sshd
root 983 0.0 0.2 112796 4284 ? Ss 07:01 0:00 /usr/sbin/sshd -D
root 1519 0.0 0.2 158800 5552 ? Ss 07:10 0:00 sshd: root@pts/0
root 2253 0.0 0.0 112720 984 pts/0 S+ 07:21 0:00 grep --color=auto sshd
[root@local ~]# cat /run/sshd.pid
983
 
//pgrep常用参数, -l -a
[root@local ~]# pgrep sshd
983
1519
[root@local ~]# pidof sshd
1519 983
 
//查看进程树
[root@local ~]# pstree

动态监控进程/htop

[root@local ~]# top
[root@local ~]# top -d 1
[root@local ~]# top -d 1 -p 10126 查看指定进程的动态信息
[root@local ~]# top -d 1 -p 10126,1
[root@local ~]# top -d 1 -u apache 查看指定用户的进程
[root@local ~]# top -d 1 -b -n 2 > top.txt 将 2 次 top 信息写入到文件
 
top 常见指令
h 查看帮出
z 以彩色信息展示
1 显示所有CPU的负载
s 设置刷新时间
b 高亮现实处于R状态的进程
M 按内存使用百分比排序输出
P 按CPU使用百分比排序输出
R 对排序进行反转
f 自定义显示字段
k kill掉指定PID进程
W 保存top环境设置 ~/.toprc
q 退出
 
Web压力测试
ab -c 100 -n 100 http://www.baidu.com/index.html
-c 100表示并发用户数为100
-n 1000表示请求总数为100
http://www.baidu.com/index.html表示请求的目标URL
请求100次,100个并发

系统负载的计算和意义

进程以及子进程和线程产生的计算指令都会让cpu执行,产生请求的这些进程组成”运行队列”,等待cpu执行,这个队列就是系统负载, 系统负载是所有cpu的运行队列的总和.

[root@local~]# w
20:25:48 up 95 days, 9:06, 1 user, load average: 2.92, 0.00, 0.00
 
//假设当前计算机有4个核心的cpu,当前的负载是2.92
cpu1 cpu2 cpu3 cpu4
2.94/4(个cpu核心) = 73%的cpu资源被使用,剩下27%的cpu计算资源是空想的
 
 
//假设当前的计算有2个核心的cpu,当前的负载是2.92
2.92/2 = 146% 已经验证超过了cpu的处理能力

信号管理进程

使用kill命令发送信号与进程通信 
定义守护进程的角色 
结束用户会话和进程 
kill,killall,pgrep,pkill

[root@local ~]# kill -l //列出所有支持的信号
 
//常见信号列表:
数字信号 信号别名 作用
1 HUP 挂起信号,往往可以让进程重新配置
2 INT 中断信号,起到结束进程的作用,和ctrl + c 的作用一样
3 QUIT 让进程退出,结果是进程退出
9 KILL 直接结束进程,不能被进程捕获
15 TERM 进程终止,这是默认信号
18 CONT 被暂停的进程将继续恢复运行
19 STOP 暂停进程
20 TSTP 用户停止请求,作用类似于ctrl + z 把进程放到后台并暂停

kill命令发送信号

// 给 vsftpd 进程发送信号 1,15
[root@local ~]# yum -y install vsftpd
[root@local~]# systemctl start vsftpd
//发送重启信号,例如 vsftpd 的配置文件发生改变,希望重新加载
[root@local~]# kill -1 9160
//发送停止信号,vsftpd 服务有停止的脚本 systemctl stop vsftpd
[root@local ~]# kill 9160
 
 
// 给vim进程发送信号 9,15
[root@local ~]# touch file1 file2
//使用远程终端1打开file1
[root@local ~]# tty
/dev/pts/1
[root@local ~]# vim file1
//使用远程终端2打开file2
[root@calo ~]# tty
/dev/pts/2
[root@local ~]# vim file2
//查看当前进程pid
[root@local ~]# ps aux |grep vim
root 4362 0.0 0.2 11104 2888 pts/1 S+ 23:02 0:00 vim file1
root 4363 0.1 0.2 11068 2948 pts/2 S+ 23:02 0:00 vim file2
//发送15信号
[root@local ~]# kill 4362
//发送9信号
[root@local ~]# kill -9 4363
//还可以同时给所有vim进程发送信号, 模糊匹配,同时给多个进程发送信号
[root@local ~]# killall vim
 
 
//使用pkill踢出从远程登录到本机的用户, pkill 类似killall
[root@local ~]# w
20:50:17 up 95 days, 9:30, 1 user, load average: 0.00, 0.00, 0.00
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
xuliangw pts/0 115.175.115.39 20:22 0.00s 0.01s 0.00s sshd: oldboy [priv]
 
//终止 pts/0上所有进程, 除了bash本身
[root@oldboy ~]# pkill -t pts/0
//终止pts/0上所有进程, 并且bash也结束(用户被强制退出)
[root@oldboy ~]# pkill -9 -t pts/0
 
//列出oldboy用户的所有进程,-l输出pid
[root@linux-oldboy ~]# pgrep -l -u oldboy
32206 sshd
32207 bash

后台进程管理

作业控制是一个命令行功能,允许一个 shell 实例来运行和管理多个命令。 
如果没有作业控制,父进程 fork()一个子进程后,将 sleeping,直到子进程退出。 
使用作业控制,可以选择性暂停,恢复,以及异步运行命令,让 shell 可以在子进程运行期间返回接受其 他命令。

前台进程,后台进程jobs,bg,fg 
ctrl + Z , ctrl +c , ctrl + B

[root@oldboy ~]# sleep 3000 & //运行程序(时),让其在后台执行
[root@oldboy ~]# sleep 4000 //^Z,将前台的程序挂起(暂停)到后台
[2]+ Stopped sleep 4000
[root@oldboy ~]# ps aux |grep sleep
[root@oldboy ~]# jobs //查看后台作业
[1]- Running sleep 3000 &
[2]+ Stopped sleep 4000
 
[root@oldboy ~]# bg %2 //让作业 2 在后台运行
[root@oldboy ~]# fg %1 //将作业 1 调回到前台
[root@oldboy ~]# kill %1 //kill 1,终止 PID 为 1 的进程
 
[root@oldboy ~]# (while :; do date; sleep 2; done) & //进程在后台运行,但输出依然在当前终端
[root@oldboy ~]# (while :; do date; sleep 2; done) &>/dev/null &

Linux系统进程管理的更多相关文章

  1. Linux权限管理、系统进程管理

    权限管理 linux系统中分为四种角色 u=user 当前用户   g=group 同组用户   o=other 其他用户   a=all 代表所有用户 三种权限 r=read 可读 w=write ...

  2. 【CentOS】Linux日常管理

    /////////////////////////目录///////////////////////////////////////// 一.日常监控指标相关 1.监控系统状态命令 2.查看系统进程 ...

  3. Linux内存描述之内存区域zone–Linux内存管理(三)

    服务器体系与共享存储器架构 日期 内核版本 架构 作者 GitHub CSDN 2016-06-14 Linux-4.7 X86 & arm gatieme LinuxDeviceDriver ...

  4. linux用户管理-用户的基本操作

    目录 linux用户管理-用户的基本操作 用户相关的命令 linux用户管理-用户的基本操作 什么是用户 用户指能够正常登录linux或windows系统 区别 本质都是登录系统的,只不过Linux支 ...

  5. Linux用户管理 权限管理 内存管理 网络管理命令 (第四天)

    默认添加的用户会自动加入和用户名一样的组中su 切换用户查看当前登陆的用户: whoami id`查看当前用户属于哪个组:groupsgroupadd 组名 添加组groupdel 组名 删除组gre ...

  6. 笔记:Linux用户管理(补充)、权限管理、内存管理、网络管理、渗透常用命令

    一.用户管理(补充) 添加用户:useradd [选项] 用户名 useradd -u 5000 -g demogroup -G root -d /home/demo -s /bin/bash dem ...

  7. Linux—进程管理

    Linux 进程管理 1.进程管理介绍 1.1 什么是进程? 进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础. 简而言之 ...

  8. 浅谈Linux内存管理机制

    经常遇到一些刚接触Linux的新手会问内存占用怎么那么多?在Linux中经常发现空闲内存很少,似乎所有的内存都被系统占用了,表面感觉是内存不够用了,其实不然.这是Linux内存管理的一个优秀特性,在这 ...

  9. linux内存管理

    一.Linux 进程在内存中的数据结构 一个可执行程序在存储(没有调入内存)时分为代码段,数据段,未初始化数据段三部分:    1) 代码段:存放CPU执行的机器指令.通常代码区是共享的,即其它执行程 ...

随机推荐

  1. SpringMVC中controller的几种返回值

    String :跳转到对应的返回值中. return “/index”: ModelAndView: 控制页面跳转方式: 1. ModelAndView modelAndView = new Mode ...

  2. DDL-常见的约束

    一.常见的约束NOT NULL:非空,该字段的值必填UNIQUE:唯一,该字段的值不可重复DEFAULT:默认,该字段的值不用手动插入有默认值CHECK:检查,mysql不支持PRIMARY KEY: ...

  3. java int 与 Integer之间的区别

    int与integer的区别从大的方面来说就是基本数据类型与其包装类的区别: int 是基本类型,直接存数值,而integer是对象,用一个引用指向这个对象 1.Java 中的数据类型分为基本数据类型 ...

  4. ubuntu18.04 无法获得锁 /var/lib/dpkg/lock - open (11: 资源暂时不可用)解决方法

    出现问题: 最近打开系统之后没声儿,抽空解决以下,谁知道安装的时候出现了这个问题,一看就是锁被占了呗 直接重启大法.....不行,看来是锁分配出问题了,找了个解锁命令 jiang@ryzen:~$ s ...

  5. Redis数据结构总结

    Redis 字符串(String) SET runoobkey redis GET runoobkey Redis 哈希(Hash) Redis hash 是一个string类型的field和valu ...

  6. 课下实践——实现Mypwd

    实现Mypwd 学习pwd命令 想要知道当前所处的目录,可以用pwd命令,该命令显示整个路径名. L 目录连接链接时,输出连接路径 P 输出物理路径 研究pwd实现需要的系统调用(man -k; gr ...

  7. 20155217 2016-2017-2《Java程序设计》课程总结

    20155217 2016-2017-2<Java程序设计>课程总结 每周作业链接汇总 预备作业一:我所期望的师生关系 预备作业二:c与java的关系 预备作业三:安装虚拟机 第一周作业: ...

  8. 20155236 2016-2017-2《Java程序设计》课程总结

    20155236 2016-2017-2<Java程序设计>课程总结 作业链接汇总 预备作业1:对专业学习的展望,课程方面.师生关系的建议 预备作业2:在实践中学习,自己的相关经验以及C语 ...

  9. 20155318 《Java程序设计》实验一(Java开发环境的熟悉)实验报告

    20155318 <Java程序设计>实验一(Java开发环境的熟悉)实验报告 一.实验内容及步骤 (一)命令行下Java程序开发 步骤一(新建文件夹): 打开windows下的cmd → ...

  10. 20145226夏艺华 《Java程序设计》预备作业3

    安装虚拟机 上学期开学的时候就安装了Linux虚拟机,由于我的是Mac OS,所以和windows下的安装有所不同. 我使用的是VirtualBoxVM虚拟机,稳定性还不错,需要的同学可以从https ...