Linux基础命令-进程与系统性能

进程与系统性能

一、进程相关概念

1.进程概念

(1)内核功用:进程管理、文件系统、网络功能、内存管理、驱动程序、安全功能等
(2)Process: 运行中的程序的一个副本,是被载入内存的一个指令集合
	进程ID(Process ID,PID)号码被用来标记各个进程
	UID、GID、和SELinux语境决定对文件系统的存取和访问权限
	通常从执行进程的用户来继承
	存在生命周期
(3)task struct:Linux内核存储进程信息的数据结构格式
(3)task list:多个任务的的task struct组成的链表
(4)进程创建:
	init:第一个进程(centos6)
	systemd:第一个进程(centos7)
	进程:都由其父进程创建,父子关系,CoW
		fork(), clone()
(5)Page Frame: 页框,用存储页面数据,存储Page 4k
(6)物理地址空间和线性地址空间
(7)MMU:Memory Management Unit 负责转换线性和物理地址
(8)TLB:Translation Lookaside Buffer 翻译后备缓冲器,用于保存虚拟地址和物理地址映射关系的缓存
(9)LRU:Least Recently Used 近期最少使用算法,释放内存

LRU算法
在这里插入图片描述
进程,线程和协程
在这里插入图片描述
用户和内核空间
在这里插入图片描述

2.进程的基本状态和转换

进程的基本状态和转换
在这里插入图片描述

进程的基本状态
(1)创建状态:进程在创建时需要申请一个空白PCB(process control block进程控制块),向其中填写控制和管理进程的信息,
完成资源分配。如果创建工作无法完成,比如资源无法满足,就无法被调度运行,把此时进程所处状态称为创建状态
(2)就绪状态:进程已准备好,已分配到所需资源,只要分配到CPU就能够立即运行
(3)执行状态:进程处于就绪状态被调度后,进程进入执行状态
(4)阻塞状态:正在执行的进程由于某些事件(I/O请求,申请缓存区失败)而暂时无法运行,进程受到阻塞。
在满足请求时进入就绪状态等待系统调用
(5)终止状态:进程结束,或出现错误,或被系统终止,进入终止状态。无法再执行


状态之间转换六种情况
(1)运行——>就绪:1,主要是进程占用CPU的时间过长,而系统分配给该进程占用CPU的时间是有限的;
2,在采用抢先式优先级调度算法的系统中,当有更高优先级的进程要运行时,该进程就被迫让出CPU,该进程便由执行状态转变为就绪状态
(2)就绪——>运行:运行的进程的时间片用完,调度就转到就绪队列中选择合适的进程分配CPU
(3)运行——>阻塞:正在执行的进程因发生某等待事件而无法执行,则进程由执行状态变为阻塞状态,如发生了I/O请求
(4)阻塞——>就绪:进程所等待的事件已经发生,就进入就绪队列
(5)以下两种状态是不可能发生的:
	(5.1)阻塞——>运行:即使给阻塞进程分配CPU,也无法执行,操作系统在进行调度时不会从阻塞队列进行挑选,而是从就绪队列中选取
	(5.2)就绪——>阻塞:就绪态根本就没有执行,谈不上进入阻塞态

3.IPC进程间通信

IPC: Inter Process Communication
	同一主机:pipe 管道
		 socket 套接字文件
		 signal 信号
		 shm shared memory
		 semaphore 信号量,一种计数器
	不同主机:socket IP和端口号
		 RPC remote procedure call
		 MQ 消息队列,如:Kafka,RabbitMQ,ActiveMQ

4.进程优先级

进程优先级:
	系统优先级:数字越小,优先级越高
		0-139:各有140个运行队列和过期队列
	实时优先级: 99-0 值最大优先级最高
	nice值:-2019,对应系统优先级100-139
Big O:时间复杂度,用时和规模的关系
	O(1), O(logn), O(n)线性, O(n^2)抛物线, O(2^n)

在这里插入图片描述
在这里插入图片描述

5.进程状态

Linux内核:抢占式多任务
进程类型:
	守护进程: daemon,在系统引导过程中启动的进程,和终端无关进程
	前台进程:跟终端相关,通过终端启动的进程
	注意:两者可相互转化
进程状态:
	运行态:running
	就绪态:ready
	睡眠态:
		可中断:interruptable
		不可中断:uninterruptable
	停止态:stopped,暂停于内存,但不会被调度,除非手动启动
	僵死态:zombie,结束进程,父进程结束前,子进程不关闭

二、进程与系统性能

1.系统管理工具

进程的分类:
	CPU-Bound:CPU密集型,非交互
	IO-Bound:IO密集型,交互
Linux系统状态的查看及管理工具:pstree, ps, pidof, pgrep, top, htop,glance,
	 pmap, vmstat, dstat, kill, pkill, job, bg, fg, nohup

2.进程管理

1.pstree命令

pstree命令
pstree [选项] [PID或用户名]
pstree 命令是以树形结构显示程序和进程之间的关系
	-a	显示启动每个进程对应的完整指令,包括启动进程的路径、参数等。
	-c	不使用精简法显示进程信息,即显示的进程中包含子进程和父进程。
	-n	根据进程 PID 号来排序输出,默认是以程序名排序输出的。
	-p	显示进程的 PID-u	显示进程对应的用户名称。

2.ps命令

ps命令-->process state
ps report a snapshot of the current processes
Linux系统各进程的相关信息均保存在/proc/PID目录下的各文件中
ps [OPTION]...
	支持三种选项:
		UNIX选项 如-A -e
		BSD选项 如a
		GNU选项 如--help
UNIX选项:
	-C cmdlist 指定命令,多个命令用,分隔
	-L 显示线程
	-e: 显示所有进程,相当于-A
	-f: 显示完整格式程序信息
	-F: 显示更完整格式的进程信息
	-H: 以进程层级格式显示进程相关信息
	-u userlist 指定有效的用户ID或名称
	-U userlist 指定真正的用户ID或名称
	-g gid或groupname 指定有效的gid或组名称
	-G gid或groupname 指定真正的gid或组名称
	-p pid 显示指pid的进程
	--ppid pid 显示属于pid的子进程
	-M 显示SELinux信息,相当于Z
BSD选项:
	默认显示当前终端中的进程
	a 选项包括所有终端中的进程
	x 选项包括不链接终端的进程
	u 选项显示进程所有者的信息
	f 选项显示进程树,相当于 --forest
	k|--sort 属性 对属性排序,属性前加- 表示倒序
	o 属性… 选项显示定制的信息 pid、cmd、%cpu、%mem
	L 显示支持的属性列表

ps输出属性
VSZ: Virtual memory SiZe,虚拟内存集,线性内存
RSS: ReSident Size, 常驻内存集
STAT:进程状态
	R:running
	S: interruptable sleeping
	D: uninterruptable sleeping
	T: stopped
	Z: zombie
	+: 前台进程
	l: 多线程进程
	L:内存分页并带锁
	N:低优先级进程
	<: 高优先级进程
	s: session leader,会话(子进程)发起者
ni: nice值
pri: priority 优先级
psr: processor CPU编号
rtprio: 实时优先级
示例:
	ps axo pid,cmd,psr,ni,pri,rtprio
常用组合:
	aux
	-ef
	-eFH
	-eo pid,tid,class,rtprio,ni,pri,psr,pcpu,stat,comm
	axo stat,euid,ruid,tty,tpgid,sess,pgrp,ppid,pid,pcpu,comm

例子:
1)查询你拥有的所有进程
	ps -x
2)显示指定用户名(RUID)或用户ID的进程
	ps -fU apache
	ps -fU 48
3)显示指定用户名(EUID)或用户ID的进程
	ps -fu wang
	ps -fu 1000
4)查看以root用户权限(实际和有效ID)运行的每个进程
	ps -U root -u root
5)列出某个组拥有的所有进程(实际组IDRGID或名称)
	ps -fG nginx
6)列出有效组名称(或会话)所拥有的所有进程
	ps -fg mysql
	ps -fg 27
7)显示指定的进程ID对应的进程
	ps -fp 1234
8)以父进程ID来显示其下所有的进程,如显示父进程为1234的所有进程
	ps -f --ppid 1234
9)显示指定PID的多个进程
	ps -fp 1204,1239,1263
10)要按tty显示所属进程
	ps -ft pts/0
11)以进程树显示系统中的进程如何相互链接
	ps -e --forest
12)以进程树显示指定的进程
	ps -f --forest -C sshd
	ps -ef --forest | grep -v grep | grep sshd
13)要显示一个进程的所有线程,将显示LWP(轻量级进程)以及NLWP(轻量级进程数)列
	ps -fL -C nginx
14)要列出所有格式说明符
	ps L
15)查看进程的PIDPPID,用户名和命令
	ps -eo pid,ppid,user,cmd
16)自定义格式显示文件系统组,ni值开始时间和进程的时间
	ps -p 1234 -o pid,ppid,fgroup,ni,lstart,etime
17)使用其PID查找进程名称:
	ps -p 1244 -o comm=
18)要以其名称选择特定进程,显示其所有子进程
	ps -C sshd,bash
19)查找指定进程名所有的所属PID,在编写需要从std输出或文件读取PID的脚本时这个参数很有用
	ps -C httpd,sshd -o pid=
20)检查一个进程的执行时间
	ps -eo comm,etime,user | grep nginx
21)查找占用最多内存和CPU的进程
	ps -eo pid,ppid,cmd,%mem,%cpu --sort=-%mem | head
	ps -eo pid,ppid,cmd,%mem,%cpu --sort=-%cpu | head
22)显示安全信息
	ps -eM
	ps --context
23)使用以下命令以用户定义的格式显示安全信息
	ps -eo euser,ruser,suser,fuser,f,comm,label
24)使用watch实用程序执行重复的输出以实现对就程进行实时的监视,如下面的命令显示每秒钟的监视
	watch -n 1 'ps -eo pid,ppid,cmd,%mem,%cpu --sort=-%mem | head'

搜索进程:
最灵活:ps 选项 | 其它命令

进程优先级调整:
	静态优先级:100-139
	进程默认启动时的nice值为0,优先级为120
	只有根用户才能降低nice值(提高优先性)
查看:
	ps axo pid,comm,ni

3.nice命令

nice命令
Linux nice命令以更改过的优先序来执行程序,如果未指定程序,则会印出目前的排程优先序,内定的 adjustment 为 10,范围为 -20(最高优先序)到 19(最低优先序)。
nice [OPTION] [COMMAND [ARG]...]
例子:
(1)实例
	1)后台运行vi
		vi &
	2)设置默认优先级
		nice vi &
	3)设置优先级为19
		nice -n 19 vi &
	4)设置优先级为 -20
		nice -n -20 vi &
	5)显示进程	
		ps -l
(2)将 ls 的优先序加 1 并执行
	nice -n 1 ls
(3)将 ls 的优先序加 10 并执行
	nice ls
	

4.renice命令

renice命令
Linux renice命令用于重新指定一个或多个行程(Process)的优先序(一个或多个将根据参数而定)。
注意:每一个行程(Process)都有一个唯一的(unique)id。
使用权限:所有使用者。
renice [-n] priority pid...
	-p pid 重新指定行程的 id 为 pid 的行程的优先序
	-g pgrp 重新指定行程群组(process group)的 id 为 pgrp 的行程 (一个或多个) 的优先序
	-u user 重新指定行程拥有者为 user 的行程的优先序
例子:
1)将行程 id 为 98732 的行程与行程拥有者为 daemon 及 root 的优先序号码加 1
	renice +1 987 -u daemon root -p 32

5.pgrep命令

pgrep命令
经常要查看进程的信息,包括进程的是否已经消亡,通过pgrep来获得正在被调度的进程的相关信息。
pgrep通过匹配其程序名,找到匹配的进程。
pgrep [options] pattern
	-u uid: effective user,生效者
	-U uid: real user,真正发起运行命令者
	-t terminal: 与指定终端相关的进程
	-l: 显示进程名
	-a: 显示完整格式的进程名
	-P pid: 显示指定进程的子进程

6.pidof命令

pidof命令
pidof命令 用于查找指定名称的进程的进程号id号。
pidof [选项] [参数]
	-s:仅返回一个进程号;
	-c:仅显示具有相同“root”目录的进程;
	-x:显示由脚本开启的进程;
	-o:指定不显示的进程ID

3.系统资源管理

1.uptime和w命令

(1)显示当前时间,系统已启动的时间、当前上线人数,系统平均负载(1、5、10分钟的平均负载,一般不会超过1)
(2)系统平均负载:指在特定时间间隔内运行队列中的平均进程数
(3)通常每个CPU内核的当前活动进程数不大于3,那么系统的性能良好。如果每个CPU内核的任务数大于5,那么此主机的性能有严重问题
(4)如果linux主机是1个双核CPU,当Load Average 为6的时候说明机器已经被充分使用

[root@centos7 ~]#uptime
 15:23:49 up 19 min,  2 users,  load average: 0.00, 0.01, 0.05

[root@centos7 ~]#w
 15:26:20 up 21 min,  2 users,  load average: 0.00, 0.01, 0.05
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
root     pts/0    10.0.7.1         15:09    4.00s  0.09s  0.00s w
root     pts/1    10.0.7.1         15:09    4:52   0.36s  0.02s bash

补充:
/proc/uptime 包括两个值,单位 s 系统启动时长,空闲进程的总时长(按总的CPU核数计算)

2.top命令

top:有许多内置命令
 排序:
	 P:以占据的CPU百分比,%CPU
	 M:占据内存百分比,%MEM
	 T:累积占据CPU时长,TIME+
 首部信息显示:
 	 uptime信息:l命令
	 tasks及cpu信息:t命令
	 cpu分别显示:1 (数字)
	 memory信息:m命令
 退出命令:q
 修改刷新时间间隔:s
 终止指定进程:k
 保存文件:W
 
栏位信息简介
	us:用户空间
	sy:内核空间
	ni:调整nice时间
	id:空闲
	wa:等待IO时间
	hi:硬中断
	si:软中断(模式切换)
	st:虚拟机偷走的时间

选项:
	 -d # 指定刷新时间间隔,默认为3-b 全部显示所有进程
	 -n # 刷新多少次后退出
	 -H 线程模式,示例:top -H -p `pidof mysqld`

3.htop命令

htop命令:EPEL源
选项:
	-d #: 指定延迟时间;
	-u UserName: 仅显示指定用户的进程
	-s COLUME: 以指定字段进行排序
子命令:
	s:跟踪选定进程的系统调用
	l:显示选定进程打开的文件列表
	a:将选定的进程绑定至某指定CPU核心
	t:显示进程树

4.glances命令

glances命令:EPEL1.linux系统自带了很多系统性能监控工具,如top,vmstat,iftop等等,还有一款监视工具glances,它能把其他几个监控的指标都集于一身。
2.Glances是一个相对比较新的系统监控工具,用 Python 编写的,使用 psutil 库从系统获取信息。
3.可以用它来监控 CPU、平均负载、内存、网络接口、磁盘 I/O,文件系统空间利用率、挂载的设备、所有活动进程以及消耗资源最多的进程。
4.Glances 有很多有趣的选项。它的主要特性之一是可以在配置文件中设置阀值(careful小心、warning警告、critical致命),然后它会用不同颜色显示信息以表明系统的瓶颈。

glances [-bdehmnrsvyz1] [-B bind] [-c server] [-C conffile] [-p port] [-P password] [--password] [-t refresh] [-f file] [-o output]
常用选项:
	-b: 以Byte为单位显示网卡数据速率
	-d: 关闭磁盘I/O模块
	-f /path/to/somefile: 设定输入文件位置
	-o {HTML|CSV}:输出格式
	-m: 禁用mount模块
	-n: 禁用网络模块
	-t #: 延迟时间间隔
	-1:每个CPU的相关数据单独显示

常用的快捷键	
	m : 按内存占用排序进程
	p : 按进程名称排序进程
	c :CPU 占用率排序进程
	i :I/O 频率排序进程
	a : 自动排序进程
	d : 显示/隐藏磁盘 I/O 统计信息
	f : 显示/隐藏文件系统统计信息
	s : 显示/隐藏传感器统计信息
	y : 显示/隐藏硬盘温度统计信息
	l : 显示/隐藏日志
	n : 显示/隐藏网络统计信息
	x : 删除警告和严重日志
	h : 显示/隐藏帮助界面
	q : 退出
	w : 删除警告记录

C/S模式下运行glances命令
服务器模式:
	glances -s -B IPADDR
	IPADDR: 指明监听的本机哪个地址
客户端模式:
	glances -c IPADDR
	IPADDR:要连入的服务器端地址


Connected to centos7.6                                  Uptime: 1:34:21
CPU  [  2.3%]   CPU       2.3% MEM     18.2% SWAP      0.0% LOAD    
MEM  [ 18.2%]   user:     0.0% total:  1.78G total:   8.00G 1 min:  
SWAP [  0.0%]   system:   0.8% used:    333M used:        0 5 min:  
                idle:    97.8% free:   1.46G free:    8.00G 15 min: 

NETWORK     Rx/s   Tx/s   TASKS 400 (445 thr), 1 run, 399 slp, 0 oth 
eth0          0b     0b
eth1        576b    1Kb     CPU%  MEM%   PID USER        NI S Command 
lo          30Kb   30Kb      6.1   0.9 11238 root         1 R /usr/bin/
virbr0        0b     0b      1.8   1.2 11242 root         1 S /usr/bin/
_rbr0-nic     0b     0b      0.3   0.3   866 root         1 S /usr/bin/
                             0.3   0.0   137 root         1 S rcu_sched
DISK I/O     R/s    W/s      0.0   0.3 11203 root         1 S sshd: roo
sda1           0      0
2020-01-17 16:39:10       No warning or critical alert detected

5.dstat命令

dstat命令
(1)dstat 是一个可以取代vmstat,iostat,netstat和ifstat这些命令的多功能产品。dstat扬长避短,即克服了这些命令的局限又增加了一些额外的功能,不但拥有更多的监控项,也更灵活。dstat在性能测试、基准测试和排除故障过程中可以很方便监控系统运行状况。 
(2)dstat可以查看所有的实时系统资源,如:通过统计IDE控制器当前状态来比较磁盘利用率,或者直接通过网络带宽数值来比较磁盘的吞吐率(在相同的时间间隔内)。 
(3)dstat以列表的形式提供选项信息,并清晰地告知以何种幅度和单位显示输出。输出信息整洁,降低发生错误的概率。最重要的是,整洁的数据更容易编写插件用来收集分析关注的数据信息。 
(4)dstat默认输出是专门为实时查看而设计的,然而也可以将详细信息通过cvs输出到一个文件,然后将cvs文件导入到Gnumeric或者Excel中生成图表。

特性
	结合了vmstat,iostat,ifstat,netstat以及更多的信息
	实时显示统计情况,输出报告
	在分析和排障时可以通过启用监控项并排序
	模块化设计
	使用python编写的,方便扩展现有的工作任务
	容易扩展和添加你的计数器
	包含的许多扩展插件——增加新的监控项目很方便
	可以分组统计块设备/网络设备,并给出总数
	可以显示每台设备的当前状态
	极准确的时间精度,即便是系统负荷较高也不会延迟显示
	显示准确地单位和和限制转换误差范围
	不同的计量单位用不同的颜色显示
	显示中间结果延时小于1秒
	支持输出CSV格式报表,并能导入到Gnumeric和Excel以生成图形
	
针对默认输出字段解释如下:
分组			分组含义及子项字段含义
CPU状态		CPU的使用率。显示了用户占比,系统占比、空闲占比、等待占比、硬中断和软中断情况。
磁盘统计		磁盘的读写,分别显示磁盘的读、写总数。
网络统计		网络设备发送和接受的数据,分别显示的网络收、发数据总数。
分页统计		系统的分页活动。分别显示换入(in)和换出(out)。
系统统计		统计中断(int)和上下文切换(csw)。

dstat [-afv] [options..] [delay [count]]
	-c, --cpu		开启cpu统计
	-C				该选项跟cpu的编号(0~cpu核数-1,多个用都好隔开)如:0,3,total表示分别包含cpu0、cpu3和total
	-d, --disk		开启disk统计
	-D				改选跟具体的设备名(多个用逗号隔开)如:total,hda,hdb表示分别统计total、hda、hdb设备块
	-g, --page		开启分页统计
	-i, --int		开启中断统计
	-I 5,10			没弄懂呢~巴拉巴拉
	-l, --load		开启负载均衡统计,分别是1m,5m,15m
	-m, --mem		开启内存统计,包括used,buffers,cache,free
	-n, --net		开启net统计,包括接受和发送
	-N				该选项可以跟网络设备名多个用逗号隔开,如eth1,total
	-p, --proc		开启进程统计,包括runnable, uninterruptible, new
	-r, --io		io开启请求统计,包括read requests, write requests
	-s, --swap		开启swap统计,包括used, free
	-S				该选项可以跟具体的交换区,多个用逗号隔开如swap1,total
	-t, --time		启用时间和日期输出
	-T, --epoch		启用时间计数,从epoch到现在的秒数
	-y, --sys		开启系统统计,包括中断和上下文切换
	--aio			开启同步IO统计 (asynchronous I/O)
	--fs			开启文件系统统计,包括 (open files, inodes)
	--ipc			开启ipc统计,包括 (message queue, semaphores, shared memory)
	--lock			开启文件所统计,包括 (posix, flock, read, write)
	--raw			开启raw统计 (raw sockets)
	--socket		开启sockets统计,包括 (total, tcp, udp, raw, ip-fragments)
	--tcp			开启tcp统计,包括(listen, established, syn, time_wait, close)
	--udp			开启udp统计 (listen, active)
	--unix			开启unix统计(datagram, stream, listen, active)
	--vm			开启vm统计 (hard pagefaults, soft pagefaults, allocated, free)
	--stat			通过插件名称开启插件扩展,详见命令插件 :可能的内置插件为aio, cpu, cpu24, disk, disk24, disk24old, epoch, fs, int, int24, io, ipc, load, lock, mem, net, page, page24, proc, raw, socket, swap, swapold, sys, tcp, time,udp, unix, vm
	--list			列举内置插件扩展的名称
	-a, --all		是默认值相当于 -cdngy (default)
	-f, --full		相当于 -C, -D, -I, -N and -S
	-v, --vmstat	相当于 -pmgdsc -D total
	--bw, --blackonwhite	在白色背景终端上改变显示颜色
	--float			在屏幕上的输出强制显示为浮点值(即带小数)(相反的选项设置为 - -integer)
	--integer		在屏幕上的输出强制显示为整数值,此为默认值(相反的选项设置为- -float)
	--nocolor		禁用颜色(意味着选项 - -noupdate)
	--noheaders		禁止重复输出header,默认会打印一屏幕输出一次header
	--noupdate		当delay>1时禁止在过程中更新(即在时间间隔内不允许更新)
	--output file	输出结果到cvs文件中

命令参数:
参数名称		参数描述
delay		两次输出之间的时间间隔,默认是1s
count		报告输出的次数,默认是没有限制,一直输出知道ctrl+c

命令插件
虽然anyone可以自由的为dstat编写插件,但dstat附带大量的插件已经大大扩展其功能,下面是dstat附带插件的一个概述:
	--battery			电池电池百分比(需要ACPI)
	--battery-remain	电池剩余小时、分钟(需要ACPI)
	--cpufreq			CPU频率百分比(需要ACPI)
	--dbus				dbus连接的数量(需要python-dbus)
	--disk-util			显示某一时间磁盘的忙碌状况
	--fan				风扇转速(需要ACPI)
	--freespace			每个文件系统的磁盘使用情况
	--gpfs	gpfs		读/I / O(需要mmpmon)
	--gpfs-ops			GPFS文件系统操作(需要mmpmon)
	--helloworld		dstat插件Hello world示例
	--innodb-buffer		显示innodb缓冲区统计
	--innodb-io			显示innodb I / O统计数据
	--innodb-ops		显示innodb操作计数器
	--lustre			显示lustreI / O吞吐量
	--memcache-hits		显示memcache 的命中和未命中的数量
	--mysql5-cmds		显示MySQL5命令统计
	--mysql5-conn		显示MySQL5连接统计
	--mysql5-io			MySQL5 I / O统计数据
	--mysql5-keys		显示MySQL5关键字统计
	--mysql-io			显示MySQL I / O统计数据
	--mysql-keys		显示MySQL关键字统计
	--net-packets		显示接收和发送的数据包的数量
	--nfs3				显示NFS v3客户端操作
	--nfs3-ops			显示扩展NFS v3客户端操作
	--nfsd3				显示NFS v3服务器操作
	--nfsd3-ops			显示扩展NFS v3服务器操作
	--ntp				显示NTP服务器的ntp时间
	--postfix			显示后缀队列大小(需要后缀)
	--power				显示电源使用量
	--proc-count		显示处理器的总数
	--rpc				显示rpc客户端调用统计
	--rpcd				显示RPC服务器调用统计
	--sendmail			显示sendmail队列大小(需要sendmail)
	--snooze			显示每秒运算次数
	--test				显示插件输出
	--thermal			热系统的温度传感器
	--top-bio			显示消耗块I/O最大的进程
	--top-cpu			显示消耗CPU最大的进程
	--top-cputime		显示使用CPU时间最大的进程(单位ms)
	--top-cputime-avg	显示使用CPU时间平均最大的进程(单位ms)
	--top-io			显示消耗I/O最大进程
	--top-latency		显示总延迟最大的进程(单位ms)
	--top-latency-avg	显示平均延时最大的进程(单位ms)
	--top-mem			显示使用内存最大的进程
	--top-oom			显示第一个被OOM结束的进程
	--utmp				显示utmp连接的数量(需要python-utmp)
	--vmk-hba			显示VMware ESX内核vmhba统计数
	--vmk-int			显示VMware ESX内核中断数据
	--vmk-nic			显示VMware ESX内核端口统计
	--vz-io				显示每个OpenVZ请求CPU使用率
	--vz-ubc			显示OpenVZ用户统计
	--wifi				无线连接质量和信号噪声比

常用插件
	--disk-util			显示某一时间磁盘的忙碌状况
	--freespace			显示当前磁盘空间使用率
	--proc-count		显示正在运行的程序数量
	--top-bio			显示块I/O最大的进程
	--top-cpu			显示CPU占用最大的进程
	--top-io			显示正常I/O最大的进程
	--top-mem			显示占用最多内存的进程

例子:
1)内存资源使用情况:
	dstat -glms --top-mem
2CPU资源使用情况:
	dstat -cyl --proc-count --top-cpu
3)输出一个csv文件:
	dstat --output ~/test.csv
	
常见问题
1、cpu分组中”wait”,如果一直处于高使用率,那说明系统存在一些其它问题。当CPU的状态处在”waits”时,那是因为它正在等待I/O设备(例如内存,磁盘或者网络)的响应而且还没有收到。 
2CPU的使用情况是否正常:用户态和内核态的使用是否合理;总体占比是否合理;若不合理可以用dstat对应的插件(- -top-cpu)排查最耗CPU的进程,配合mpstat、top再去下钻一下分析线程,进一步到程序(比如java可以jstack)。 
3、磁盘IO读写是否正常:读写是否偏大;若不正常可以配合插件- -disk-util、- -freespace、- -top-bio、- -top-io等进行排查,也可以配合iostat排查 
3、内存是否正常:一般要配合交换区内存一起判断,若不正常可以配合插件- -top-mem,可能是开启的进程太多,或者第三方程序捣乱。 
4、应用程序内存是否正常:配合业务表现比如请求响应慢、没反应等,在结合第三方程序监控(如java可以用jvm监控工具(jprofiler、jconsole、jvisualvm……)监控内存)此种情况和3还不太一样,一个jvm内存一个sys内存 
5、分页指的是一种内存管理技术用于查找系统场景,一个较大的分页表明系统正在使用大量的交换空间,或者说内存非常分散,大多数情况下你都希望看到page in(换入)和page out(换出)的值都是06、系统统计仅在有比较基线时才有意义。中断和上下文切换较高的统计值通常表示大量的进程造成拥塞,需要对CPU进行关注。服务器一般情况下都会运行运行一些程序,所以这项总是显示一些数值。 
7、使用不同的插件可以快速排查有问题的进程然后配合其他工具下钻具体问题,当然这个需要建立在你对所有的插件都比较熟悉的基础之上,知道什么情况下使用什么插件。技巧:可以将常用的命令写成脚本,执行分析,这样就不用每次都敲了
————————————————
版权声明:本文为CSDN博主「约会远行」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/yue530tomtom/article/details/75443305

6.lsof命令

lsof:list open files查看当前系统文件的工具。在linux环境下,一切皆文件,用户通过文件不仅可以访问常规数据,
还可以访问网络连接和硬件如传输控制协议 (TCP) 和用户数据报协议 (UDP)套接字等,系统在后台都为该应用程序分配了一个文件描述符
命令参数
	-a:列出打开文件存在的进程
	-c<进程名>:列出指定进程所打开的文件
	-g:列出GID号进程详情
	-d<文件号>:列出占用该文件号的进程
	+d<目录>:列出目录下被打开的文件
	+D<目录>:递归列出目录下被打开的文件
	-n<目录>:列出使用NFS的文件
	-i<条件>:列出符合条件的进程(46、协议、:端口、 @ip )
	-p<进程号>:列出指定进程号所打开的文件
	-u:列出UID号进程详情
	-h:显示帮助信息
	-v:显示版本信息。
	-n: 不反向解析网络名字

例子:
(1)进程管理
	1)查看由登陆用户启动而非系统启动的进程
		lsof /dev/pts/1
	2)指定进程号,可以查看该进程打开的文件
		lsof -p 9527 
(2)文件管理
	1)查看指定程序打开的文件
		lsof -c httpd
	2)查看指定用户打开的文件
		lsof -u root | more
	3)查看指定目录下被打开的文件
		lsof +D /var/log/
		lsof +d /var/log/
		参数+D为递归列出目录下被打开的文件,参数+d为列出目录下被打开的文件
(3)查看所有网络连接
	lsof -i –n
	lsof -i@127.0.0.1
	通过参数-i查看网络连接的情况,包括连接的ip、端口等以及一些服务的连接情况,例如:sshd等。也可以通过指定ip查看该ip的网络连接情况
(4)查看端口连接情况
	lsof -i :80 -n
	通过参数-i:端口可以查看端口的占用情况,-i参数还有查看协议,ip的连接情况等
(5)查看指定进程打开的网络连接
	lsof -i –n -a -p 9527
	参数-i、-a、-p等,-i查看网络连接情况,-a查看存在的进程,-p指定进程
(6)查看指定状态的网络连接
	lsof -n -P -i TCP -s TCP:ESTABLISHED
	-n:no host names, -P:no port names,-i TCP指定协议,-s指定协议状态通过多个参数可以清晰的查看网络连接情况、协议连接情况等
(7)恢复删除文件
	lsof |grep /var/log/messages
	rm -f /var/log/messages
	lsof |grep /var/log/messages
	cat /proc/653/fd/6
	cat /proc/653/fd/6 > /var/log/messages

7.kill命令

kill命令:向进程发送控制信号,以实现对进程管理,每个信号对应一个数字,信号名称以SIG开头(可省略),不区分大小写
显示当前系统可用信号: kill –l 或者 trap -l
常用信号:man 7 signal
	1) SIGHUP 无须关闭进程而让其重读配置文件
	2) SIGINT 中止正在运行的进程;相当于Ctrl+c
	3) SIGQUIT 相当于ctrl+\
	9) SIGKILL 强制杀死正在运行的进程
	15) SIGTERM 终止正在运行的进程
	18) SIGCONT 继续运行
	19) SIGSTOP 后台休眠
	指定信号的方法 :
		(1) 信号的数字标识:1, 2, 9
		(2) 信号完整名称:SIGHUP
		(3) 信号的简写名称:HUP
(1)PID:kill [-SIGNAL] pid …
	kill –n SIGNAL pid
	kill –s SIGNAL pid
(2)按名称:killall [-SIGNAL] comm…
(3)按模式:pkill [options] pattern
	-SIGNAL
	-u uid: effective user,生效者
	-U uid: real user,真正发起运行命令者
	-t terminal: 与指定终端相关的进程
	-l: 显示进程名(pgrep可用)
	-a: 显示完整格式的进程名(pgrep可用)
	-P pid: 显示指定进程的子进程

8.内存管理

1.free 命令
free 命令
内存空间使用状态
free [OPTION]
	-b 以字节为单位
	-m 以MB为单位
	-g 以GB为单位
	-h 易读格式
	-o 不显示-/+buffers/cache行
	-t 显示RAM + swap的总和
	-s n 刷新间隔为n秒
	-c n 刷新n次后即退出

[root@centos7 ~]#free -h
              total        used        free      shared  buff/cache   available
Mem:           1.8G        202M        1.2G        8.9M        439M        1.4G
Swap:          8.0G          0B        8.0G

在这里插入图片描述

2.pmap命令
pmap命令
查看进程的内存映像信息
pmap [ -x | -d ] [ -q ] pids...
pmap -V
	-x  extended    Show the extended format. 显示扩展格式
    -d  device     Show the device format.  显示设备格式
    -q  quiet     Do not display some header/footer lines. 不显示头尾行
    -V  show version  Displays version of program. 显示版本

另外一种实现
	cat /proc/PID/maps

扩展格式和设备格式域:
	Address: start address of map 映像起始地址
    Kbytes: size of map in kilobytes 映像大小
    RSS: resident set size in kilobytes 驻留集大小
    Dirty: dirty pages (both shared and private) in kilobytes 脏页大小
    Mode: permissions on map 映像权限: r=read, w=write, x=execute, s=shared, p=private (copy on write)
    Mapping: file backing the map , or '[ anon ]' for allocated memory, or '[ stack ]' for the program 	stack. 映像支持文件,[anon]为已分配内存 [stack]为程序堆栈
    Offset: offset into the file 文件偏移
    Device: device name (major:minor) 设备名

例子
1)查看进程1的设备格式
[root@centos7 ~]#pmap -d 1
1:   /usr/lib/systemd/systemd --switched-root --system --deserialize 21
Address           Kbytes Mode  Offset           Device    Mapping
00007f93677ff000       4 ----- 0000000000000000 000:00000   [ anon ]
00007f9367800000    8192 rw--- 0000000000000000 000:00000   [ anon ]
00007f9368000000     164 rw--- 0000000000000000 000:00000   [ anon ]
00007f9368029000   65372 ----- 0000000000000000 000:00000   [ anon ]
...
mapped: 123304K    writeable/private: 18016K    shared: 0K
最后一行的值
mapped 表示该进程映射的虚拟地址空间大小,也就是该进程预先分配的虚拟内存大小,即ps出的vsz
writeable/private  表示进程所占用的私有地址空间大小,也就是该进程实际使用的内存大小
shared 表示进程和其他进程共享的内存大小

2)查看进程1的设备格式,不显示头尾行
	pmap -d -q 1
	
3)查看进程1的扩展格式
[root@centos7 ~]#pmap -x 1
1:   /usr/lib/systemd/systemd --switched-root --system --deserialize 21
Address           Kbytes     RSS   Dirty Mode  Mapping
00007f93677ff000       4       0       0 -----   [ anon ]
00007f9367800000    8192    2048    2048 rw---   [ anon ]
...
ffffffffff600000       4       0       0 r-x--   [ anon ]
---------------- ------- ------- ------- 
total kB          123304    5980    3592

4)循环显示进程3066的设备格式的最后1行,间隔2秒,
	while true; do pmap -d 3066 | tail -1; sleep 2; done

9.磁盘管理

1.vmstat命令
vmstat命令
虚拟内存信息
vmstat [options] [delay [count]]
	-V:显示vmstat版本信息
	-n:只在开始时显示一次各字段名称
	-a:显示活跃和非活跃内存
	-d:显示各个磁盘相关统计信息
	-D:显示磁盘总体信息
	-p:显示指定磁盘分区统计信息
	-s:显示内存相关统计信息及多种系统活动数量
	-m:显示slabinfo
	-t:在输出信息的时候也将时间一并输出出来
	-S:使用指定单位显示。参数有k、K、m、M,分别代表1000102410000001048576字节(byte)。默认单位为K1024bytes)
	delay:刷新时间间隔。如果不指定,只显示一条结果	
	count:刷新次数。如果不指定刷新次数,但指定了刷新时间间隔,这时刷新次数为无穷

(1)procs:
	r:可运行(正运行或等待运行)进程的个数,和核心数有关
	b:处于不可中断睡眠态的进程个数(被阻塞的队列的长度)
(2)memory:
	swpd: 交换内存的使用总量
	free:空闲物理内存总量
	buffer:用于buffer的内存总量
	cache:用于cache的内存总量
(3)swap:
	si:从磁盘交换进内存的数据速率(kb/s)
	so:从内存交换至磁盘的数据速率(kb/s)
(4)io:
	bi:从块设备读入数据到系统的速率(kb/s)
	bo: 保存数据至块设备的速率
(5)system:
	in: interrupts 中断速率,包括时钟
	cs: context switch 进程切换速率
(6)cpu:
	us:Time spent running non-kernel code
	sy: Time spent running kernel code
	id: Time spent idle. Linux 2.5.41,包括IO-wait time.
	wa: Time spent waiting for IO. 2.5.41前,包括in idle.
	st: Time stolen from a virtual machine. 2.6.11, unknown.

[root@centos7 ~]#vmstat 
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 1  0      0 1211740   2720 447016    0    0    31     3   55   92  0  0 99  0  0
2.iostat命令
iostat命令
iostat命令能监视系统的I/O活动,检查物理磁盘就平均传输速率而言处于活跃状态之中的时间长度。
该命令生成的报告可用于修改系统配置以便更好地平衡物理磁盘之间的I/O负荷。
常见用法:iostat 2 3         每隔2秒刷新显示,且显示3[root@centos7 ~]#iostat
Linux 3.10.0-327.el7.x86_64 (centos7.6)         01/17/2020      _x86_64_        (4 CPU)

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.10    0.03    0.31    0.30    0.00   99.26

Device:            tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn
sdd               0.04         0.30         0.00       1044          0
sdc               0.04         0.30         0.00       1044          0
sdb               0.20         1.58         0.59       5478       2048
sda               4.77       106.63        10.87     368866      37617
scd0              0.01         0.02         0.00         62          0

	第一行:指示系统版本,主机名和当前日期
	avg-cpu:总体CPU使用情况统计,对于多核CPU,这里是所有CPU的平均值
	Device:各磁盘设备的IO统计信息
	%user:CPU在用户态执行进程的时间百分比
	%nice:CPU在用户态模式下,用于nice操作,所占CPU总时间的百分比
	%system:CPU处在内核执行进程的时间百分比
	%iowait:CPU用于等待IO操作所占CPU总时间的百分比
	%steal:管理程序(hypervisor)为另一个虚拟进程提供服务而等待虚拟CPU的百分比
	%idle:CPU空闲时间百分比
	tps:每秒向磁盘设备请求数据次数,包括读,写请求,为rtps与wtps的和
	kB_read/s:每秒从设备读取的数据量
	kB_wrtn/s:每秒向设备写入的数据量
	kB_read:读取的总数据量
	kB_wrtn:写入的总数据量

3.iotop命令
iotop命令
iotop命令是一个用来监视磁盘I/O使用状况的top类工具iotop具有与top相似的UI,其中包括
PID、用户、I/O、进程等相关信息,可查看每个进程是如何使用IO

常用参数:
	-o, --only只显示正在产生I/O的进程或线程,除了传参,可以在运行过程中按o生效
	-b, --batch非交互模式,一般用来记录日志
	-n NUM, --iter=NUM设置监测的次数,默认无限。在非交互模式下很有用
	-d SEC, --delay=SEC设置每次监测的间隔,默认1秒,接受非整形数据例如1.1
	-p PID, --pid=PID指定监测的进程/线程
	-u USER, --user=USER指定监测某个用户产生的I/O
	-P, --processes仅显示进程,默认iotop显示所有线程
	-a, --accumulated显示累积的I/O,而不是带宽
	-k, --kilobytes使用kB单位,而不是对人友好的单位。在非交互模式下,脚本编程有用
	-t, --time 加上时间戳,非交互非模式
	-q, --quiet 禁止头几行,非交互模式,有三种指定方式
		-q 只在第一次监测时显示列名
		-qq 永远不显示列名
		-qqq 永远不显示I/O汇总
	交互按键
		left和right方向键:改变排序
		r:反向排序
		o:切换至选项--only
		p:切换至--processes选项
		a:切换至--accumulated选项
		q:退出
		i:改变线程的优先级

[root@centos7 ~]#iotop
Total DISK READ :       0.00 B/s | Total DISK WRITE :       0.00 B/s
Actual DISK READ:       0.00 B/s | Actual DISK WRITE:       0.00 B/s
   TID  PRIO  USER     DISK READ  DISK WRITE  SWAPIN     IO>    COMMAND
   362 be/4 root        0.00 B/s    0.00 B/s  0.00 %  0.03 % [kwo~/3:1]
     1 be/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % syst~ze 21
     2 be/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [kthreadd]
     3 be/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [kso~qd/0]
     5 be/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [kwo~0:0H]
     
iotop输出
	第一行:Read和Write速率总计
	第二行:实际的Read和Write速率
	第三行:参数如下:
		线程ID(按p切换为进程ID)
		优先级
		用户
		磁盘读速率
		磁盘写速率
		swap交换百分比
		IO等待所占的百分比
		线程/进程命令

10.网络管理

1.iftop命令
iftop命令
iftop是一款实时流量监控工具,监控TCP/IP连接等,缺点就是无报表功能。必须以root身份才能运行。
实例:
1)默认是监控第一块网卡的流量
	iftop
2)监控eth1
	iftop -i eth1
3)直接显示IP, 不进行DNS反解析
	iftop -n
4)直接显示连接埠编号, 不显示服务名称:
	iftop -N
5)显示某个网段进出封包流量
	iftop -F 192.168.1.0/24 or 192.168.1.0/255.255.255.0

基于实例讲解输出含义
执行iftop -N -n -i eth1后界面为
              12.5Kb        25.0Kb        37.5Kb        50.0Kb   62.5Kb
└─────────────┴─────────────┴─────────────┴─────────────┴──────────────
10.0.7.70             => 10.0.7.1                688b   1.74Kb  1.18Kb
                      <=                         184b    344b    255b


───────────────────────────────────────────────────────────────────────
TX:             cum:   12.9KB   peak:  rates:b   688b   1.74Kb  1.18Kb
RX:                    2.17KB            800b    184b    344b    255b
TOTAL:                 15.0KB           5.62Kb   872b   2.08Kb  1.43Kb

iftop界面含义如下:
	第一行:带宽显示
	中间部分:外部连接列表,即记录了哪些ip正在和本机的网络连接
	中间部分右边:实时参数分别是该访问ip连接到本机2秒,10秒和40秒的平均流量
	=>代表发送数据,<= 代表接收数据
	底部三行:表示发送,接收和全部的流量
	底部三行第二列:为你运行iftop到目前流量
	底部三行第三列:为高峰值
	底部三行第四列:为平均值
	
注意:通过iftop的界面很容易找到哪个ip在霸占网络流量,这个是ifstat做不到的。不过iftop的流量显示单位是Mb,这个b是bit,是位,不是字节,而ifstat的KB,这个B就是字节了,byte是bit的8倍。初学者容易被误导。

进入iftop的命令:
进入iftop画面后的一些操作命令(注意大小写)
	按h切换是否显示帮助;
	按n切换显示本机的IP或主机名;
	按s切换是否显示本机的host信息;
	按d切换是否显示远端目标主机的host信息;
	按t切换显示格式为2/1/只显示发送流量/只显示接收流量;N切换显示端口号或端口服务名称;S切换是否显示本机的端口信息;D切换是否显示远端目标主机的端口信息;
	按p切换是否显示端口信息;P切换暂停/继续显示;
	按b切换是否显示平均流量图形条;B切换计算2秒或10秒或40秒内的平均流量;T切换是否显示每个连接的总流量;
	按l打开屏幕过滤功能,输入要过滤的字符,比如ip,按回车后,屏幕就只显示这个IP相关的流量信息;L切换显示画面上边的刻度;刻度不同,流量图形条会有变化;
	按j或按k可以向上或向下滚动屏幕显示的连接记录;123可以根据右侧显示的三列流量数据进行排序;<根据左边的本机名或IP排序;>根据远端目标主机的主机名或IP排序;
	按o切换是否固定只显示当前的连接;
	按f可以编辑过滤代码,这是翻译过来的说法,我还没用过这个!
	按!可以使用shell命令,这个没用过!没搞明白啥命令在这好用呢!
	按q退出监控。
2.nload命令
(1)nload是一个实时监控网络流量和带宽使用情况,以数值和动态图展示进出的流量情况
(2)安装:yum -y install nload (EPEL)
(3)界面操作
	上下方向键、左右方向键、enter键或者tab键都就可以切换查看多个网卡的流量情况
	按 F2 显示选项窗口
	按 q 或者 Ctrl+C 退出 nload
(4)示例:
	nload:默认只查看第一个网络的流量进出情况
	nload eth0 eth1:在nload后面指定网卡,可以指定多个
(5)设置刷新间隔:默认刷新间隔是100毫秒,可通过 -t命令设置刷新时间(单位是毫秒)
	nload -t 500 eth0
(6)设置单位:显示两种单位一种是显示Bit/s、一种是显示Byte/s,默认是以Bit/s,也可不显示/s
 	-u h|b|k|m|g|H|B|K|M|G 表示的含义: h: auto, b: Bit/s, k: kBit/s, m: MBit/s, H:auto, B: Byte/s, K: kByte/s, M: MByte/s
 nload -u M eth0

	-a:这个好像是全部数据的刷新时间周期,单位是秒,默认是300.
	-i:进入网卡的流量图的显示比例最大值设置,默认10240 kBit/s.
	-m:不显示流量图,只显示统计数据。
	-o:出去网卡的流量图的显示比例最大值设置,默认10240 kBit/s.
	-t:显示数据的刷新时间间隔,单位是毫秒,默认500-u:设置右边Curr、Avg、Min、Max的数据单位,默认是自动变的。注意大小写单位不同!
		h|b|k|m|g h: auto, b: Bit/s, k: kBit/s, m: MBit/s etc.
		H|B|K|M|G H: auto, B: Byte/s, K: kByte/s, M: MByte/s etc.
	-U:设置右边Ttl的数据单位,默认是自动变的.注意大小写单位不同(与-u相同)!
	Devices:自定义监控的网卡,默认是全部监控的,使用左右键切换。


Device eth1 [10.0.7.70] (2/5):
=======================================================================
Incoming:

                                                 Curr: 944.00 Bit/s
                                                 Avg: 1.15 kBit/s
                                                 Min: 936.00 Bit/s
                                                 Max: 3.83 kBit/s
                                                 Ttl: 610.68 kByte
Outgoing:


                                                 Curr: 7.29 kBit/s
                                                 Avg: 7.34 kBit/s
                                                 Min: 3.49 kBit/s
                                                 Max: 8.67 kBit/s
                                                 Ttl: 4.29 MByte

第一部分汇总:
	首先是网卡名字,IP和网卡的序列,可以用方向键来切换。
第二部分Incoming:
	进入网卡的流量
第三部分Outgoing:
	从这块网卡出去的流量。
最后面的部分:
	Curr:当前的流量
	Avg:平均的流量
	Min:最小的流量
	Max:最大的流量
	Ttl:流量的总和

11.作业管理

(1)Linux的作业控制
	前台作业:通过终端启动,且启动后一直占据终端
	后台作业:可通过终端启动,但启动后即转入后台运行(释放终端)
(2)让作业运行于后台
	(1) 运行中的作业: Ctrl+z
	(2) 尚未启动的作业: COMMAND &
(3)后台作业虽然被送往后台运行,但其依然与终端相关;退出终端,将关闭后台作业。如果希望送往后台后,剥离与终端的关系
	nohup COMMAND &>/dev/null &
	screen;COMMAND
(4)查看当前终端所有作业:jobs
(5)作业控制:
	fg [[%]JOB_NUM]:把指定的后台作业调回前台
	bg [[%]JOB_NUM]:让送往后台的作业在后台继续运行
	kill [%JOB_NUM]终止指定的作业
(6)并行运行
	同时运行多个进程,提高效率
	方法1
		vi all.sh
		f1.sh&
		f2.sh&
		f3.sh&
	方法2
	 	(f1.sh&);(f2.sh&);(f3.sh&)
	方法3
		{ f1.sh& f2.sh& f3.sh& }
1.nohup命令
nohup命令
nohup Command [ Arg … ] [ & ]
(1)用途:不挂断地运行命令。
(2)描述:nohup 命令运行由 Command 参数和任何相关的 Arg 参数指定的命令,忽略所有挂断(SIGHUP)信号。
	在注销后使用 nohup 命令运行后台中的程序。要运行后台中的 nohup 命令,添加 & ( 表示”and”的符号)到命令的尾部。
	无论是否将 nohup 命令的输出重定向到终端,输出都将附加到当前目录的 nohup.out 文件中。
	如果当前目录的 nohup.out 文件不可写,输出重定向到 $HOME/nohup.out 文件中。如果没有文件能创建或打开以用于追加,那么 		
	Command 参数指定的命令不可调用。如果标准错误是一个终端,那么把指定的命令写给标准错误的所有输出作为标准输出重定向到相同的文件描述符。
(3)退出状态:该命令返回下列出口值:
	126 可以查找但不能调用 Command 参数指定的命令。
	127 nohup 命令发生错误或不能查找由 Command 参数指定的命令。
		否则,nohup 命令的退出状态是 Command 参数指定命令的退出状态。
(4)nohup命令:如果你正在运行一个进程,而且你觉得在退出帐户时该进程还不会结束,那么可以使用nohup命令。
	该命令可以在你退出帐户/关闭终端之后继续运行相应的进程。nohup就是不挂起的意思( n ohang up)。

操作系统中有三个常用的流:
  0:标准输入流 stdin
  1:标准输出流 stdout
  2:标准错误流 stderr
  一般当我们用 > console.txt,实际是 1>console.txt的省略用法;< console.txt ,实际是 0 < console.txt的省略用法。

例子:
	nohup ./start-dishi.sh >output 2>&1 &
解释:
 1.&的命令行,即使terminal(终端)关闭,或者电脑死机程序依然运行(前提是你把程序递交到服务器上)2. 2>&1的意思 
  这个意思是把标准错误(2)重定向到标准输出中(1),而标准输出又导入文件output里面,所以结果是标准错误和标准输出
  都导入文件output里面了。 至于为什么需要将标准错误重定向到标准输出的原因,那就归结为标准错误没有缓冲区,而stdout有。
  这就会导致 >output 2>output 文件output被两次打开,而stdout和stderr将会竞争覆盖,这肯定不是我门想要的. 
  这就是为什么有人会写成: nohup ./command.sh >output 2>output出错的原因了 
2.screen命令
简介:
(1)Screen是一款由GNU计划开发的用于命令行终端切换的自由软件。用户可以通过该软件同时连接多个本地或远程的命令行会话,
	并在其间自由切换。GNU Screen可以看作是窗口管理器的命令行界面版本。它提供了统一的管理多个会话的界面和相应的功能。
	在Screen环境下,所有的会话都独立的运行,并拥有各自的编号、输入、输出和窗口缓存。用户可以通过快捷键在不同的窗口下切换,
	并可以自由的重定向各个窗口的输入和输出。

(2)screen [-AmRvx -ls -wipe][-d <作业名称>][-h <行数>][-r <作业名称>][-s ][-S <作业名称>]
	-A  将所有的视窗都调整为目前终端机的大小。
	-d   <作业名称>  将指定的screen作业离线。
	-h   <行数>  指定视窗的缓冲区行数。
	-m  即使目前已在作业中的screen作业,仍强制建立新的screen作业。
	-r   <作业名称>  恢复离线的screen作业。
	-R  先试图恢复离线的作业。若找不到离线的作业,即建立新的screen作业。
	-s  指定建立新视窗时,所要执行的shell。
	-S   <作业名称>  指定screen作业的名称。
	-v  显示版本信息。
	-x  恢复之前离线的screen作业。
	-ls或--list  显示目前所有的screen作业。
	-wipe  检查目前所有的screen作业,并删除已经无法使用的screen作业。

(3)常用参数:
	screen -S yourname -> 新建一个叫yourname的session
	screen -ls         -> 列出当前所有的session
	screen -r yourname -> 回到yourname这个session
	screen -d yourname -> 远程detach某个session
	screen -d -r yourname -> 结束当前session并回到yourname这个session

(4)在Session下,使用ctrl+a(C-a) 
	C-a ? -> 显示所有键绑定信息
	C-a c -> 创建一个新的运行shell的窗口并切换到该窗口
	C-a n -> Next,切换到下一个 window 
	C-a p -> Previous,切换到前一个 window 
	C-a 0..9 -> 切换到第 0..9 个 window
	Ctrl+a [Space] -> 由视窗0循序切换到视窗9
	C-a C-a -> 在两个最近使用的 window 间切换 
	C-a x -> 锁住当前的 window,需用用户密码解锁
	C-a d -> detach,暂时离开当前session,将目前的 screen session (可能含有多个 windows) 丢到后台执行,并会回到还没进 screen 时的状态,此时在 screen session 里,每个 window 内运行的 process (无论是前台/后台)都在继续执行,即使 logout 也不影响。 
	C-a z -> 把当前session放到后台执行,用 shell 的 fg 命令则可回去。
	C-a w -> 显示所有窗口列表
	C-a t -> time,显示当前时间,和系统的 load 
	C-a k -> kill window,强行关闭当前的 window
	C-a [ -> 进入 copy mode,在 copy mode 下可以回滚、搜索、复制就像用使用 vi 一样
	    C-b Backward,PageUp 
	    C-f Forward,PageDown 
	    H(大写) High,将光标移至左上角 
	    L Low,将光标移至左下角 
	    0 移到行首 
	    $ 行末 
	    w forward one word,以字为单位往前移 
	    b backward one word,以字为单位往后移 
	    Space 第一次按为标记区起点,第二次按为终点 
	    Esc 结束 copy mode 
	C-a ] -> paste,把刚刚在 copy mode 选定的内容贴上

(5)常用操作
1)创建会话(-m 强制):
	screen -dmS session_name
	session_name session名称
2)关闭会话:
	screen -X -S [session # you want to kill] quit
3)查看所有会话:
	screen -ls
4)进入会话:
	screen -r session_name
发布了12 篇原创文章 · 获赞 4 · 访问量 939

猜你喜欢

转载自blog.csdn.net/qq_41596208/article/details/104011790