服务器的意义就在于这些运行中的进程,这也是工做围绕的重点之一。前端
在 Linux 和 Unix 中(Windows Server 基本没接触过)进程一般被定义为程序执行时的一个实例,每一个进程都有一个自身的进程描述符,里面详细记录了关于进程的一切。linux
Liunx 中查看进程状态的命令也大都围绕着这个进程描述符的,和 TCP 协议同样,每一个域都有自身的含义,前辈们的设计理念仍是很统一而高效的! docker
PS:关于进程描述符和比较偏底层的就不在这里详细介绍了,本人理解有限,传送门:《深刻理解 Linux 内核》shell
ps:Process Status,从字面意思就能够看出来,这个命令是用来查看进程状态的。安全
ps 命令列出了当前进程的快照,也就是说它不是动态的显示这些进程的,仅仅是执行命令那个时刻的进程信息,而在 Linux 中,/proc 目录就是存放进程相关的文件及目录,ps 命令也是经过读取这些文件来显示的(starce 命令能够追踪命令的系统调用 starce ps)。服务器
进程状态:STATsession
D 不可中断(一般为 IO)数据结构
R 正在运行中的进程多线程
S 已经中断的进程,处于休眠状态,系统中大部分进程都是这个状态框架
T 中止或被暂停的进程
W 没有作够的内存页分配
X 已经死掉的进程
Z 僵尸进程,进程已终止,但进程描述符还在,直到父进程调用 wait4() 系统调用后释放
BSD 风格
< 高优先级进程
N 低优先级进程
L 在内存中被锁了内存分页
s 包含子进程
l 多线程进程
+ 前台运行的进程
VSZ:占用虚拟内存大小;(Mac 中压缩后的内存跟这个很像)
RSS:占用内存大小;
TTY:终端的次要装置号码;
经常使用选项: a 显示现行终端机下全部程序,不区分用户;
-A -e x 显示全部程序;
-H 树装显示(实在很鸡肋,仅用空格肉眼实在很差分辨)
以树状结构显示进程,ps -H 的加强版。
相似于 stack 命令,用于进程的栈跟踪,显示系统调用,偏底层,对于内功修炼颇有帮助。
终止指定进程,kill 命令经过向进程发送指定的信号来结束相应进程的,默认采用 15 SIGTERM 的信号,-l 参数能够列出所有信号编号参数(含义可自行查找),经常使用的 HUP 1 终端断线、INT 2 中断、QUIT 3 退出、TERM 15 终止、KILL 9 强制终止、CONT 18 继续(与 STOP 相反)、STOP 19 暂停(同 Ctrl + z)
又一个 Linux 经常使用的进程管理工具,在性能分析时能实时显示各个进程的资源占用情况,相似于任务管理器。
第一行:任务队列信息,同 uptime,load average 分别列出一、五、15分钟的负载数,大于 5 表示超负荷了。
第二行:Tasks,处于某个状态的进程数;
第三行:cpu 状态信息,us -- 用户空间cpu占用、sy —— 内核空间占用、ni——改变过优先级的进程占用、id——空闲cpu、wa——IO等待cpu占用、hi si 硬软中断占用;
第4、五行:内存状态、swap 交换分区状态;
PS:简单计算可用内存数:第四行 free + 第四行 buff + 第五行 cache
top 还支持交互命令的方式,h 可显示帮助信息,q 为退出,r 可调整进程的优先级。
htop 相似于 top,默认是没有安装的,展现效果更好,由于命令大都是 F1~F10,mac 上按键不方便,用的较少。
nice [OPTION] [command [arguments...]]
调整进程运行的优先级,提升进程的优先级,内核会分配更多 CPU 时间片给这个进程,默认状况下进程是以 0 的优先级启动的,top 中 NI(nice value)列展现了进程的优先级状况,范围为 -20 ~ 19,值越低,优先级越高。
renice 相似于 nice,-u -g 选项可指定用户和组来改变进程优先级。
ulimit shell 内建命令,调用系统 getrlimit 和 setrlimit API,来改变 resouce limit,从而改变 shell 启动的进程的 resource limit(子进程继承)。
在 Linux 中,Resouce limit 指的是在一个进程执行的时候,所得到的资源限制:
内核结构体定义了 rlimit 数据结构:
ulimit 的 -S -H 参数分别对应内核的 soft limit 和 hard limit,hard limit 做为 soft limit 的上限,当设置了 hard limit 后,soft limit 就不能超过它,不指定这两个参数的时候,默认同时设置soft 和 hard。
-a 参数可显示当前的限制设定,-c core 文件的最大值、-f shell 能创建的最大文件、-m 可以使用的内存上限、-n 同时开启的文件、-t 指定 CPU 使用时间、-u 用户最多开启的程序数目。
ulimit 限制程序所能建立的 socket 数量,对于 C/S 模型中的 server 来讲,它会为多个 client 请求建立多个 socket 端口响应,linux建立一个新的socket,实际上也是建立了一个新的文件描述符,经过 ulimit -n来限制程序所能打开的最大文件描述符,可限制socket建立的数量。
ulimit 限制的当前 shell 进程以及其派生的子进程,要想针对具体用户的资源加以限制,则需经过修改 /etc/security/limit.conf 配置文件来限定:
<domain> <type> <item> <value>
domain表示用户或组,type 为soft 和 hard,item表示须要限定的资源(cpu、stack、nofile等)
若是想对整个系统作限制,则须要修改 /proc 的配置文件,/proc/sys/kernel/pid_max、/proc/sys/net/ipv4/ip_local_port_range 等等,经过修改内核的配置文件,来控制系统的资源限制。
cgroups(Control Groups)最初叫Process Container,由Google工程师(Paul Menage和Rohit Seth)于2006年提出,后来由于Container有多重含义容易引发误解,就在2007年改名为Control Groups,并被整合进Linux内核。顾名思义就是把进程放到一个组里面统一加以控制。ps:偷懒摘下维基百科
最近很火的 docker 就是使用 cgroups 来管理 container 的资源的,linux 下重量级的资源管理框架,配上好的前端简直能够把配置系统资源这么抽象而微观的事情,变成一件可视化精细度很高的一件事,因为小的项目不多关注资源限制,因此大都用不上,不过不可否定它的强大。
后续单独博客整理
经过进程号全局正则匹配,pgrep 扫描当前运行的进程,而后按照命令匹配出进程 PID,-u 可指定用户、-l 显示进程名称、-P 指定父进程号、-t 指定开启进程的终端。
fg 和 bg 用来调度正在运行的任务,前台运行的程序使用 Ctrl-z 能够挂起这个程序,jobs 命令能够查看任务,fg 命令能够把做业调回前台运行,bg 则能够把程序调度到后台,& 用在命令最后,也能够把这个命令放到后台执行。
不挂断地运行命令,nohup 运行由 command 参数和任何相关的 Arg 参数指定的命令,它会忽略全部挂断(SIGHUP)信号,从而使的程序接受不到挂断的信号。
输出会附加到当前目录的 nohup.out 文件中,nohup command & 便可建立一个不挂起的进程到后台,命令提示 nohup 成功后在终端任意键便可回到命令窗口,exit 退出则可安全退出,直接在成功后就关闭终端,会断掉 session,致使 nohup 的进程被一块儿 shutdown。
ipcs 显示进程间通讯设施状态,能够显示消息队列、共享内存和信号量,-m 查看系统使用的 IPC 共享内存资源、-q 系统使用 IPC 消息队列、-s 系统使用 IPC 信号量资源、-l 查询系统 IPC 参数限制。
IPC(Inter-process Communication)进程间通讯,指多个进程间相互通讯,交换信息的方法,Linux IPC 基本是从 Unix(System V风格和 BSD 风格)平台继承的,支持 POSIX (Portable Operating System Interface 可移植操做系统接口)IPC。
信号是 Linux 系统在必定条件下生产的事件,是一种异步通讯机制,进程不须要执行任何操做来等待信号的到达,信号异步通知接收信号的进程发生了某个事件,而后操做系统会中断接收到信号的进程的执行,转而去执行相应的信号处理程序。管道是用来链接不一样进程之间的数据流。
修改系统的 IPC 参数,须要修改 /etc/sysctl.conf 文件,kernel.msgmax、kernel.msgmnb、kernel.msgmni、kernel.shmmax 等参数,sysctl -p 生效。
ps:未搞懂 ipcs,解释均摘自 google 查询,先记录,后续有时间研究下。