当前位置 : 首页 » 文章分类 :  开发  »  Linux-常用命令

Linux-常用命令

常用 Linux 命令笔记

鳥哥的 Linux 私房菜
http://linux.vbird.org/
http://cn.linux.vbird.org/

Linux命令大全
http://man.linuxde.net/

jaywcjlove/linux-command
https://github.com/jaywcjlove/linux-command

Linux 命令大全
http://www.runoob.com/linux/linux-command-manual.html


硬件|监测|内核|Shell

性能监测与优化

top

top命令可以实时动态地查看系统的整体运行情况,是一个综合了多方信息监测系统性能和运行信息的实用工具。

在top命令执行过程中可以使用的一些交互命令:
h:显示帮助画面,给出一些简短的命令总结说明;
k:终止一个进程;
i:忽略闲置和僵死进程,这是一个开关式命令;
q:退出程序;
r:重新安排一个进程的优先级别;
S:切换到累计模式;
s:改变两次刷新之间的延迟时间(单位为s),如果有小数,就换算成ms。输入0值则系统将不断刷新,默认值是5s;
f或者F:从当前显示中添加或者删除项目;
o或者O:改变显示项目的顺序;
l:切换显示平均负载和启动时间信息;
m:切换显示内存信息;
t:切换显示进程和CPU状态信息;
c:切换显示命令名称和完整命令行;
T:根据时间/累计时间进行排序;
w:将当前设置写入~/.toprc文件中。
M:大写M,根据驻留内存大小进行排序;
P:大写P,根据CPU使用百分比大小进行排序;

mac中的top命令
mac中与linux不同,top运行时,输入 ? 显示帮助
排序:
先按 o 会显示

primary key [-pid]:

其中方括号中的 -pid 表示当前是按pid排序的,之后输入cpu就是按cpu排序,输入mem就是按内存占用大小排序

实例解析

top - 18:05:51 up 35 days,  5:50,  1 user,  load average: 0.00, 0.00, 0.00
Tasks:  93 total,   2 running,  67 sleeping,   0 stopped,   0 zombie
Cpu(s):  0.0%us,  0.0%sy,  0.0%ni, 99.7%id,  0.0%wa,  0.0%hi,  0.0%si,  0.3%st
Mem:    493420k total,   390564k used,   102856k free,    30892k buffers
Swap:  1048572k total,   611440k used,   437132k free,   101452k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
13920 root      20   0 2164m 163m 7632 S  0.3 33.9 101:01.82 java
 2836 mysql     20   0 1161m  16m 2404 S  0.0  3.4  12:49.36 mysqld
 2261 root      20   0  223m  10m 7832 S  0.0  2.1   0:36.15 amazon-ssm-agen
25137 ec2-user  20   0  856m 9004 5864 S  0.0  1.8   0:00.36 node
 4034 root      20   0  117m 7192 6116 S  0.0  1.5   0:00.01 sshd
 2300 root      20   0  242m 4560 1160 S  0.0  0.9   0:51.93 rsyslogd
 4036 ec2-user  20   0  117m 4028 2952 S  0.0  0.8   0:00.00 sshd
 4030 ec2-user  20   0 14940 3744 3396 S  0.0  0.8   0:00.00 imap
 4029 ec2-user  20   0 14912 3612 3296 S  0.0  0.7   0:00.00 imap
 4025 dovecot   20   0 32040 3596 3128 S  0.0  0.7   0:00.00 auth
 4037 ec2-user  20   0  112m 3508 3064 S  0.0  0.7   0:00.00 bash
 4024 root      20   0 12344 3172 2248 S  0.0  0.6   0:00.00 config
 2911 root      20   0 89616 2256 1812 S  0.0  0.5   2:58.89 sendmail

前五行是当前系统情况整体的统计信息区。

  • 第一行,任务队列信息,同 uptime 命令的执行结果,具体参数说明情况如下:
    14:06:23 — 当前系统时间
    up 70 days, 16:44 — 系统已经运行了70天16小时44分钟
    2 users — 当前有2个用户登录系统
    load average: 1.15, 1.42, 1.44 — load average后面的三个数分别是1分钟、5分钟、15分钟的负载情况。
    load average数据是每隔5秒钟检查一次活跃的进程数,然后按特定算法计算出的数值。如果这个数除以逻辑CPU的数量,结果高于5的时候就表明系统在超负荷运转了。Tasks:

  • 第二行,Tasks — 任务(进程),具体信息说明如下:
    145 total[总进程数],
    2 running[正在运行的进程数],
    143 sleeping[睡眠的进程数],
    0 stopped[停止的进程数],
    0 zombie[冻结进程数],
    系统现在共有206个进程,其中处于运行中的有1个,205个在休眠(sleep),stoped状态的有0个,zombie状态(僵尸)的有0个。

  • 第三行,cpu状态信息,具体属性说明如下:
    Cpu(s)

5.9%us — 用户空间占用CPU的百分比。
3.4% sy — 内核空间占用CPU的百分比。
0.0% ni — 改变过优先级的进程占用CPU的百分比
90.4% id — 空闲CPU百分比
0.0% wa — IO等待占用CPU的百分比
0.0% hi — 硬中断(Hardware IRQ)占用CPU的百分比
0.2% si — 软中断(Software Interrupts)占用CPU的百分比

  • 第四行,内存状态,具体信息如下:
    Mem:
    32949016k total — 物理内存总量(32GB)
    14411180k used — 使用中的内存总量(14GB)
    18537836k free — 空闲内存总量(18GB)
    169884k buffers — 用作内核缓存的内存量 (169M)

  • 第五行,swap交换分区信息,具体信息说明如下:
    Swap:
    32764556k total — 交换区总量(32GB)
    0k used — 使用的交换区总量(0K)
    32764556k free — 空闲交换区总量(32GB)
    3612636k cached — 缓冲的交换区总量(3.6GB)

  • 第七行以下:各进程(任务)的状态监控,项目列信息说明如下:
    PID — 进程id
    USER — 进程所有者
    PR — 进程优先级
    NI — nice值。负值表示高优先级,正值表示低优先级
    VIRT — 进程使用的虚拟内存总量,单位kb。VIRT=SWAP+RES
    RES — 进程使用的、未被换出的物理内存大小,单位kb。RES=CODE+DATA
    SHR — 共享内存大小,单位kb
    S — 进程状态。D=不可中断的睡眠状态 R=运行 S=睡眠 T=跟踪/停止 Z=僵尸进程
    %CPU — 上次更新到现在的CPU时间占用百分比
    %MEM — 进程使用的物理内存百分比
    TIME+ — 进程使用的CPU时间总计,单位1/100秒
    COMMAND — 进程名称(命令名/命令行)


free

free 命令可以显示Linux系统中空闲的、已用的物理内存及swap内存,及被内核使用的buffer。

-b:以Byte为单位显示内存使用情况;
-k:以KB为单位显示内存使用情况;
-m:以MB为单位显示内存使用情况;
-o:不显示缓冲区调节列;
-s<间隔秒数>:持续观察内存使用状况;
-t:显示内存总和列;
-V:显示版本信息。

$ free -m
              total        used        free      shared  buff/cache   available
Mem:           3711        2019         166         480        1525         836
Swap:           819         222         597

Mem 行(第二行)是内存的使用情况。
Swap 行(第三行)是交换空间的使用情况。

total 列显示系统总的可用物理内存和交换空间大小。
used 列显示已经被使用的物理内存和交换空间。
free 列显示还有多少物理内存和交换空间可用使用。
shared 列显示被共享使用的物理内存大小。
buff/cache 列显示被 buffer 和 cache 使用的物理内存大小。
available 列显示还可以被应用程序使用的物理内存大小。

free列 是真正尚未被使用的物理内存数量。
available列 是从应用程序的角度看到的可用内存数量。available = free + buffer + cache,这只是个大约的计算公式,可能有较大误差。

cat /proc/meminfo,cat /proc/meminfo

其实 free 命令中的信息都来自于 /proc/meminfo 文件。/proc/meminfo 文件包含了更多更原始的信息,只是看起来不太直观:


lsof

lsof(list open files)是一个列出当前系统打开文件的工具。在linux环境下,任何事物都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件。所以如传输控制协议 (TCP) 和用户数据报协议 (UDP) 套接字等,系统在后台都为该应用程序分配了一个文件描述符,无论这个文件的本质如何,该文件描述符为应用程序与基础操作系统之间的交互提供了通用接口。因为应用程序打开文件的描述符列表提供了大量关于这个应用程序本身的信息,因此通过lsof工具能够查看这个列表对系统监测以及排错将是很有帮助的。

lsof [options] filename

安装lsof
yum install lsof

选项
-a:列出打开文件存在的进程;
-c<进程名>:列出指定进程所打开的文件;
-g:列出GID号进程详情;
-d<文件号>:列出占用该文件号的进程;
+d<目录>:列出目录下被打开的文件;
+D<目录>:递归列出目录下被打开的文件;
-n<目录>:列出使用NFS的文件;
-p<进程号>:列出指定进程号所打开的文件;
-u:列出UID号进程详情;
-h:显示帮助信息;
-v:显示版本信息。
-i<条件> 列出符合条件的进程。(4、6、协议、:端口、 @ip )lsof -i[46] [protocol][@hostname|hostaddr][:service|port]
-i参数说明:
46 –> IPv4 or IPv6
protocol –> TCP or UDP
hostname –> Internet host name
hostaddr –> IPv4地址
service –> /etc/service中的 service name (可以不只一个)
port –> 端口号 (可以不只一个)
例如:
lsof -i :22,查看22端口现在运行的情况:
lsof -a -u root -d txt,查看所属root用户进程所打开的文件类型为txt的文件
lsof server.log,查看哪些进程在使用server.log文件,或 lsof|grep server.log

查看所有进程的文件打开数
lsof |wc -l

查看某个进程打开的文件数
lsof -p pid |wc -l

列出所有的网络连接
lsof -i

列出所有tcp 网络连接信息
lsof -i tcp

列出谁在使用某个端口
lsof -i :3306

列出谁在使用某个特定的udp端口
lsof -i udp:55

查看tcp80端口的占用情况
lsof -i :80lsof -i tcp:80
-i参数表示网络链接,:80指明端口号,该命令会同时列出PID,方便kill

查看所有进程监听的端口
sudo lsof -i -P | grep -i “listen”

实例解析

[prouser@vm-vmw96707-app bin]$ lsof -c run.sh
COMMAND   PID    USER   FD   TYPE DEVICE SIZE/OFF   NODE NAME
run.sh  33234 prouser  cwd    DIR  253,7     4096 599439 /opt/app/jboss-eap-5.2/jboss-as/server/aisServer3/bin
run.sh  33234 prouser  rtd    DIR  253,1     4096      2 /
run.sh  33234 prouser  txt    REG  253,1   939344 122884 /bin/bash
run.sh  33234 prouser  mem    REG  253,1   157072  41353 /lib64/ld-2.12.so
run.sh  33234 prouser    0r   CHR    1,3      0t0   4405 /dev/null
run.sh  33234 prouser    1w   REG  253,7 20671770 598689 /opt/app/jboss-eap-5.2/jboss-as/server/aisServer3/bin/startServer.log
run.sh  33234 prouser    2w   REG  253,7 20671770 598689 /opt/app/jboss-eap-5.2/jboss-as/server/aisServer3/bin/startServer.log
run.sh  33234 prouser  255r   REG  253,7    10675 557207 /opt/app/jboss-eap-5.2/jboss-as/bin/run.sh

COMMAND:进程的名称
PID:进程标识符
USER:进程所有者
FD:文件描述符,应用程序通过文件描述符识别该文件。如cwd、txt等。txt类型的文件是程序代码。数值表示应用程序的文件描述符,这是打开该文件时返回的一个整数,数值后跟打开模式,u表示该文件被打开并处于读取/写入模式,而不是只读(r)或只写(w)模式。同时还有大写的W 表示该应用程序具有对整个文件的写锁。初始打开每个应用程序时,都具有三个文件描述符,从 0 到 2,分别表示标准输入、输出和错误流。所以大多数应用程序所打开的文件的 FD 都是从 3 开始。
TYPE:文件类型,如DIR、REG等。文件和目录分别称为 REG 和 DIR。而CHR 和 BLK,分别表示字符和块设备;或者 UNIX、FIFO 和 IPv4,分别表示 UNIX 域套接字、先进先出 (FIFO) 队列和网际协议 (IP) 套接字。
DEVICE:指定磁盘的名称
SIZE:文件的大小
NODE:索引节点(文件在磁盘上的标识)
NAME:打开文件的确切名称

每天一个linux命令(51):lsof命令
http://www.cnblogs.com/peida/archive/2013/02/26/2932972.html


vmstat

vmstat命令的含义为显示虚拟内存状态(“Virtual Memory Statistics”),但是它可以报告关于进程、内存、I/O等系统整体运行状态。
-a:显示活动内页;
-f:显示启动后创建的进程总数;
-m:显示slab信息;
-n:头信息仅显示一次;
-s:以表格方式显示事件计数器和内存状态;
-d:报告磁盘状态;
-p:显示指定的硬盘分区状态;
-S:输出信息的单位。

$ vmstat
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 2  0 227676 287872      0 1419488   0    0    50    46    1    1  2  1 97  0  0

Procs(进程)
r: 运行队列中进程数量,这个值也可以判断是否需要增加CPU。(长期大于1)
b: 等待IO的进程数量。

Memory(内存)
swpd: 使用虚拟内存大小,如果swpd的值不为0,但是SI,SO的值长期为0,这种情况不会影响系统性能。
free: 空闲物理内存大小。
buff: 用作缓冲的内存大小。
cache: 用作缓存的内存大小,如果cache的值大的时候,说明cache处的文件数多,如果频繁访问到的文件都能被cache处,那么磁盘的读IO bi会非常小。

Swap
si: 每秒从交换区写到内存的大小,由磁盘调入内存。
so: 每秒写入交换区的内存大小,由内存调入磁盘。
注意:内存够用的时候,这2个值都是0,如果这2个值长期大于0时,系统性能会受到影响,磁盘IO和CPU资源都会被消耗。有些朋友看到空闲内存(free)很少的或接近于0时,就认为内存不够用了,不能光看这一点,还要结合si和so,如果free很少,但是si和so也很少(大多时候是0),那么不用担心,系统性能这时不会受到影响的。

IO(现在的Linux版本块的大小为1kb)
bi: 每秒读取的块数
bo: 每秒写入的块数
注意:随机磁盘读写的时候,这2个值越大(如超出1024k),能看到CPU在IO等待的值也会越大。

system(系统)
in: 每秒中断数,包括时钟中断。
cs: 每秒上下文切换数。
注意:上面2个值越大,会看到由内核消耗的CPU时间会越大。

CPU(以百分比表示)
us: 用户进程执行时间百分比(user time)
us的值比较高时,说明用户进程消耗的CPU时间多,但是如果长期超50%的使用,那么我们就该考虑优化程序算法或者进行加速。

sy: 内核系统进程执行时间百分比(system time)
sy的值高时,说明系统内核消耗的CPU资源多,这并不是良性表现,我们应该检查原因。

wa: IO等待时间百分比
wa的值高时,说明IO等待比较严重,这可能由于磁盘大量作随机访问造成,也有可能磁盘出现瓶颈(块操作)。

id: 空闲时间百分比


lscpu

lscpu,查看cpu统计信息

[jboss5@vm-vmw1891-jbs]~>lscpu
Architecture:          x86_64
CPU op-mode(s):        32-bit, 64-bit
Byte Order:            Little Endian
CPU(s):                4
On-line CPU(s) list:   0-3
Thread(s) per core:    1
Core(s) per socket:    1
CPU socket(s):         4
NUMA node(s):          1
Vendor ID:             GenuineIntel
CPU family:            6
Model:                 47
Stepping:              2
CPU MHz:               1995.000
BogoMIPS:              3990.00
L1d cache:             32K
L1i cache:             32K
L2 cache:              256K
L3 cache:              24576K
NUMA node0 CPU(s):     0-3

cat /proc/cpuinfo,可以知道每个cpu信息,如每个CPU的型号,主频等。


time

time命令用于统计给定命令所花费的总时间。
当测试一个程序或比较不同算法时,执行时间是非常重要的,一个好的算法应该是用时最短的。所有类UNIX系统都包含time命令,使用这个命令可以统计时间消耗。例如:

$ time date
2019年 09月 05日 星期四 23:34:33 CST
real    0m0.003s
user    0m0.001s
sys    0m0.000s

输出的信息分别显示了该命令所花费的real时间、user时间和sys时间。
real 时间是指挂钟时间,也就是命令开始执行到结束的时间。这个短时间包括其他进程所占用的时间片,和进程被阻塞时所花费的时间。
user 时间是指进程花费在用户模式中的CPU时间,这是唯一真正用于执行进程所花费的时间,其他进程和花费阻塞状态中的时间没有计算在内。
sys 时间是指花费在内核模式中的CPU时间,代表在内核中执系统调用所花费的时间,这也是真正由进程使用的CPU时间。

例如统计一个sql脚本的执行时间

time mysql -h localhost -uroot -ppwd database_name < prod.sql
mysql: [Warning] Using a password on the command line interface can be insecure.
real    6m13.689s
user    0m30.067s
sys    0m11.806s

strace

strace 命令是一个集诊断、调试、统计与一体的工具,我们可以使用strace对应用的系统调用和信号传递的跟踪结果来对应用进行分析,以达到解决问题或者是了解应用工作过程的目的。
strace 常用来跟踪进程执行时的系统调用和所接收的信号。 在Linux世界,进程不能直接访问硬件设备,当进程需要访问硬件设备(比如读取磁盘文件,接收网络数据等等)时,必须由用户态模式切换至内核态模式,通过系统调用访问硬件设备。strace可以跟踪到一个进程产生的系统调用,包括参数,返回值,执行消耗的时间。

yum 安装 strace
yum -y install strace

-tt 在输出中的每一行前加上时间信息,微秒级.
-T 显示每一调用所耗的时间.
-e expr
指定一个表达式,用来控制如何跟踪.格式如下:
[qualifier=][!]value1[,value2]…
qualifier 只能是 trace,abbrev,verbose,raw,signal,read,write 其中之一
value 是用来限定的符号或数字.默认的 qualifier是 trace.感叹号是否定符号.例如:
-eopen 等价于 -e trace=open,表示只跟踪open调用.而-etrace!=open表示跟踪除了open以外的其他调用.有两个特殊的符号 all 和 none.
注意有些shell使用!来执行历史记录里的命令,所以要使用\.
-o filename
将strace的输出写入文件filename

指定 pid 跟踪
trace -T -tt -e trace=all -p 28979

输出
strace 输出的每一行都是一条系统调用,等号左边是系统调用的函数名及其参数,右边是该调用的返回值。 strace 显示这些调用的参数并返回符号形式的值。strace 从内核接收信息,而且不需要以任何特殊的方式来构建内核。


Shell内建命令

env

set: 显示或设置shell变量, 包括用户环境变量和shell局部变量
env: 显示或设置环境变量, 只涉及当前用户的环境变量, 所以 env看到的变量是set看到的变量的子集, 或者说env看到的变量个数小于等于set看到的变量个数
shell变量(set) = shell局部变量 + env环境变量


set

set: 显示或设置shell变量, 包括用户环境变量和shell局部变量
env: 显示或设置环境变量, 只涉及当前用户的环境变量, 所以 env看到的变量是set看到的变量的子集, 或者说env看到的变量个数小于等于set看到的变量个数
shell变量(set) = shell局部变量 + env环境变量

使用set更改shell特性时,符号 +- 的作用分别是打开和关闭指定的模式。
set命令不能够定义新的shell变量。如果要定义新的变量,可以使用declare命令以变量名=值的格式进行定义即可。

-b:使被中止的后台程序立刻回报执行状态。
-C:转向所产生的文件无法覆盖已存在的文件。
-d:Shell预设会用杂凑表记忆使用过的指令,以加速指令的执行。使用-d参数可取消。
-f:取消使用通配符。
-h:自动记录函数的所在位置。
-H Shell:可利用”!”加<指令编号>的方式来执行history中记录的指令。
-k:指令所给的参数都会被视为此指令的环境变量。
-l:记录for循环的变量名称。
-m:使用监视模式。
-n:只读取指令,而不实际执行。
-p:启动优先顺序模式。
-P:启动-P参数后,执行指令时,会以实际的文件或目录来取代符号连接。
-t:执行完随后的指令,即退出shell。
-v:显示shell所读取的输入值。

set -e 失败立即结束

-e: 若指令返回值不等于0(即命令执行错误),则立即退出shell。(默认情况下有命令执行失败也会继续往下执行, 即默认是关闭此选项的)
set +e 表示关闭-e选项
set -e 表示打开-e选项, 即有命令执行失败立即退出shell

一、脚本中有命令执行失败时立即结束
例如有脚本 tesh.sh

#! /bin/sh
set -ex
foo
pwd
ls -al

执行结果如下:

$ sh test.sh
+ foo
test.sh: line 4: foo: command not found

foo 命令找不到,执行失败,立即结束,不往后执行。

二、脚本中有命令执行失败时忽略继续往下执行
test.sh 在 foo 前 set +e 来关闭 -e 选项,之后再打开,表示期间的命令即使错误也继续执行

#! /bin/sh
set -x

set +e
foo
set -e

pwd
ls -al| head -n 2

执行结果如下:

$ sh test.sh
+ set +e
+ foo
test.sh: line 5: foo: command not found
+ set -e
+ pwd
/Users/si.ma
+ ls -al
+ head -n 2
total 86332176
drwxr-xr-x+ 84 si.ma  FAREAST\Domain Users         2688  9 25 13:10 .

还有一种方法是使用 command || true ,使得该命令即使执行失败,脚本也不会终止执行。

set -x 打印出命令本身

-x: 执行指令后, 会先输出该指令及其参数, 目的是为了解决bash脚本中有多条命令时分不清楚哪个输出是哪个命令产生的。

例如有如下脚本 test.sh

#! /bin/sh
set -x

foo
pwd
ls -al| head -n 2

执行结果如下:

$ sh test.sh
+ foo
test.sh: line 4: foo: command not found
+ pwd
/Users/si.ma
+ ls -al
+ head -n 2
total 85839768
drwxr-xr-x+ 84 si.ma  FAREAST\Domain Users         2688  9 25 13:05 .

输出每个命令的执行结果前会先打印出命令及参数。
管道连接的会被列为两个命令

set -u 遇到未定义变量时报错

-u: 当执行时使用到未定义过的变量,则显示错误信息。
默认情况下,执行脚本的时候,如果遇到不存在的变量,Bash 默认忽略它。


unset

unset 命令用于删除已定义的shell变量(包括环境变量)和shell函数。
注意set env export设置的变量,都可以用unset来清除的
unset命令不能够删除具有只读属性的shell变量和环境变量

-f:仅删除函数;
-v:仅删除变量。

清除环境变量的值用unset命令。如果未指定值,则该变量值将被 设为NULL。示
例如下:
$ export TEST="Test..." #增加一个环境变量TEST
$ env|grep TEST #此命令有输入,证明环境变量TEST已经存在了
TEST=Test...
$ unset $TEST #删除环境变量TEST
$ env|grep TEST #此命令没有输出,证明环境变量TEST已经不存在了

declare

declare 命令用于声明和显示已存在的shell变量。
declare命令若不带任何参数选项,则会显示所有shell变量及其值。
declare的功能与typeset命令的功能是相同的。

+/-:”-“可用来指定变量的属性,”+”则是取消变量所设的属性;
-f:仅显示函数;
r:将变量设置为只读;
-x:指定的变量会成为环境变量,可供shell以外的程序来使用;
+x:删除指定的变量。变量实际上并未删除,只是不会输出到后续指令的执行环境中。
i:[设置值]可以是数值,字符串或运算式。

declare命令用于声明 shell 变量。
declare name="masikkk"
也可以省略declare
name="masikkk"


export

export 命令显示当前导出成环境变量的shell变量,或将shell变量导出为环境变量

一个shell中的 系统环境变量(用export定义的变量) 才会被复制到子 shell中

在子 shell中定义的变量只在该子shell内有效。如果在一个shell脚本程序中定义了一个变量,当该脚本程序运行时,这个定义的变量只是该脚本程序内 的一个局部变量,其他的shell不能引用它,要使某个变量的值可以在其他shell中被改变,可以使用export命令对已定义的变量进行输出。 export命令将使系统在创建每一个新的shell时定义这个变量的一个拷贝。这个过程称之为变量输出。

-f:代表[变量名称]中为函数名称;
-n:删除指定的变量。变量实际上并未删除,只是不会输出到后续指令的执行环境中;
-p:列出所有的shell赋予程序的环境变量。

export 命令的功能跟 declare 命令部分重合;
export name="masikkk" 相当于 declare -x name="masikkk"
export -n name 相当于 declare +x name


readonly

readonly 命令用于定义只读shell变量和shell函数。
readonly命令的选项-p可以输出显示系统中所有定义的只读变量。

-f:定义只读函数;
-a:定义只读数组变量;
-p:显示系统中全部只读变量列表。

使用了readonly命令的话,变量就不可以被修改或清除了。示例如下:

$ export TEST="Test..." #增加一个环境变量TEST
$ readonly TEST #将环境变量TEST设为只读
$ unset TEST #会发现此变量不能被删除
-bash: unset: TEST: cannot unset: readonly variable
$ TEST="New" #会发现此也变量不能被修改
-bash: TEST: readonly variable

echo

echo命令用于在shell中打印shell变量的值,或者直接输出指定的字符串。linux的echo命令,在shell编程中极为常用。
-e:激活转义字符

文字色
echo -e "\e[1;31mThis is red text\e[0m"
\e[1;31m 将颜色设置为红色
\e[0m 将颜色重新置回
颜色码:重置=0,黑色=30,红色=31,绿色=32,黄色=33,蓝色=34,洋红=35,青色=36,白色=37

背景色
echo -e "\e[1;42mGreed Background\e[0m"
颜色码:重置=0,黑色=40,红色=41,绿色=42,黄色=43,蓝色=44,洋红=45,青色=46,白色=47

文字闪动
echo -e "\033[37;31;5mMySQL Server Stop...\033[39;49;0m"
红色数字处还有其他数字参数:0 关闭所有属性、1 设置高亮度(加粗)、4 下划线、5 闪烁、7 反显、8 消隐


source

通常用法:source filepath 或 . filepath
功能:使当前shell读入路径为filepath的shell文件并依次执行文件中的所有语句,通常用于重新执行刚修改的初始化文件,使之立即生效,而不必注销并重新登录。例如,当我们修改了/etc/profile文件,并想让它立刻生效,而不用重新登录,就可以使用source命令,如source /etc/profile

source命令(从 C Shell 而来)是bash shell的内置命令;点命令(.),就是个点符号(从Bourne Shell而来)是source的另一名称。这从用法中也能看出来。

source filepath 与 sh filepath, ./filepath的区别:

  • 当shell脚本具有可执行权限时,用sh filepath与./filepath是没有区别的。./filepath是因为当前目录没有在PATH中,所有”.”是用来表示当前目录的。
  • sh filepath 会重新建立一个子shell,在子shell中执行脚本里面的语句,该子shell继承父shell的环境变量,但子shell是新建的,其改变的变量不会被带回父shell,除非使用export。
  • source filename其实只是简单地读取脚本里面的语句依次在当前shell里面执行,没有建立新的子shell。那么脚本里面所有新建、改变变量的语句都会保存在当前shell里面。

举例说明:
新建一个test.sh脚本,内容为:A=1;
修改其可执行权限:chmod +x test.sh;
运行sh test.sh后,echo $A,显示为空,因为A=1并未传回给当前shell;
运行./test.sh后,也是一样的效果;
运行source test.sh 或者 . test.sh,然后echo $A,则会显示1,说明A=1的变量在当前shell中;


alias

alias命令用来设置指令的别名。我们可以使用该命令可以将一些较长的命令进行简化。使用alias时,用户必须使用单引号’’将原来的命令引起来,防止特殊字符导致错误。
alias命令的作用只局限于该次登入的操作。若要每次登入都能够使用这些命令别名,则可将相应的alias命令存放到bash的初始化文件/etc/bashrc中。

alias命令格式:
alias 新的命令='原命令 -选项/参数'
要删除一个别名,可以使用 unalias 命令,如 unalias l

alias不加任何参数,列出已经设置的别名。


history

history命令用于显示历史命令,读取历史命令文件中的目录到历史命令缓冲区和将历史命令缓冲区中的目录写入命令文件。

-c:清空当前历史命令;
-a:将历史命令缓冲区中命令写入历史命令文件中;
-r:将历史命令文件中的命令读入当前历史命令缓冲区;
-w:将当前历史命令缓冲区命令写入历史命令文件中。
历史命令是被保存在内存中的,当退出或者登录shell时,会自动保存或读取。在内存中,历史命令仅能够存储1000条历史命令,该数量是由环境变量HISTSIZE进行控制。

该命令单独使用时,仅显示历史命令
history 10,显示最近使用的10条历史命令

在命令行中,可以使用符号!执行指定序号的历史命令。
!2,执行第2个历史命令。
!!,执行上一条命令。
!-1,执行上一条命令。

http://blog.sina.com.cn/s/blog_5caa94a00100gyls.html


kill

kill命令用来删除执行中的程序或工作。kill可将指定的信息送至程序。预设的信息为SIGTERM(15),可将指定程序终止。若仍无法终止该程序,可使用SIGKILL(9)信息尝试强制删除程序。程序或工作的编号可利用ps指令或job指令查看。

kill [参数] [进程号]
默认(缺省)情况下,kill发送的是SIGTERM,即15(SIGTERM)信号,kill PIDkill -15 PID是一样的。
这个信号通常会要求程序自己正常退出,是一种比较安全的用法。但它是可以被阻塞,处理和忽略的,所以对于有的进程,会中止失败。

kill -9 pid,立即结束
另一个常用的信号是9(SIGKILL),这个命令表示立即结束程序,是不能被阻塞,处理和忽略的。在TERM信号失效的情况下,可以尝试使用”kill -9 PID”
虽然”kill -9”命令已经很强大,但也有可能还是不能达到目的。这时候,还有一个办法,就是使用”ps -ef”找出待中止的进程的父进程(PPID),然后使用kill或killall命令杀掉它。

常用信号名称:
SIGINT 2 中断(同 Ctrl + C)
SIGQUIT 3 退出(同 Ctrl + \)
SIGTERM 15 终止
SIGKILL 9 强制终止
SIGSTOP 19 暂停(同 Ctrl + Z)

killall pname,killall 正在运行的程式名
例如:
killall nginx


ulimit

ulimit 命令用来限制系统用户对shell资源的访问。

ulimit 用于限制 shell 启动进程所占用的资源,支持以下各种类型的限制:所创建的内核文件的大小、进程数据块的大小、Shell 进程创建文件的大小、内存锁住的大小、常驻内存集的大小、打开文件描述符的数量、分配堆栈的最大大小、CPU 时间、单个用户的最大线程数、Shell 进程所能使用的最大虚拟内存。同时,它支持硬资源和软资源的限制。

作为临时限制,ulimit 可以作用于通过使用其命令登录的 shell 会话,在会话终止时便结束限制,并不影响于其他 shell 会话。
而对于长期的固定限制,ulimit 命令语句又可以被添加到由登录 shell 读取的文件中,作用于特定的 shell 用户。

1)暂时生效,使用ulimit命令设置,适用于通过 ulimit 命令登录 shell 会话期间
2)永久生效,通过将一个相应的 ulimit 语句添加到由登录 shell 读取的文件之一(例如 ~/.profile),即特定于 shell 的用户资源文件;或者通过编辑 /etc/security/limits.conf

-a:显示目前资源限制的设定;
-c :设定core文件的最大值,单位为区块;
-d <数据节区大小>:程序数据节区的最大值,单位为KB;
-f <文件大小>:shell所能建立的最大文件,单位为区块;
-H:设定资源的硬性限制,也就是管理员所设下的限制;
-m <内存大小>:指定可使用内存的上限,单位为KB;
-n <文件数目>:指定同一时间最多可开启的文件数; 对于需要做许多套接字连接并使它们处于打开状态的应用程序而言,最好通过使用ulimit -n,或者通过设置nofile参数,为用户把文件描述符的数量设置得比默认值高一些。
-p <缓冲区大小>:指定管道缓冲区的大小,单位512字节;
-s <堆叠大小>:指定堆叠的上限,单位为KB;
-S:设定资源的弹性限制;
-t :指定CPU使用时间的上限,单位为秒;
-u <程序数目>:用户最多可开启的程序数目;
-v <虚拟内存大小>:指定可使用的虚拟内存上限,单位为KB。

ulimit -c unlimited,将core文件的大小设为无限

ulimit -n 4096
也就是限制用户的最大文件打开数为4096个


内核与模块管理

sysctl

sysctl命令被用于在内核运行时动态地修改内核的运行参数
可用的内核参数在目录 /proc/sys 中。它包含一些TCP/ip堆栈和虚拟内存系统的高级选项, 这可以让有经验的管理员提高引人注目的系统性能。用sysctl可以读取设置超过五百个系统变量。

sysctl -a 查看所有可读变量
sysctl key 查看指定变量
例如查看 tcp keepalive 的内核参数

$ sysctl net.ipv4.tcp_keepalive_time net.ipv4.tcp_keepalive_probes net.ipv4.tcp_keepalive_intvl
net.ipv4.tcp_keepalive_time = 7200
net.ipv4.tcp_keepalive_probes = 9
net.ipv4.tcp_keepalive_intvl = 75

net.ipv4.tcp_keepalive_time 是连接时长,当超过这个时间后,每隔 net.ipv4.tcp_keepalive_intvl 的时间间隔会发送keepalive数据包,net.ipv4.tcp_keepalive_probe 是发送keepalived数据包的频率。

sysctl key=value 设置变量值
例如 sysctl kern.maxfiles=5000


uname

uname是unix name的缩写
uname -a:显示操作系统相关所有参数

查看Linux系统版本

一般在 /etc/ 目录下都有个 -version-release 结尾的文件,里面写有操作系统的版本信息

查看CentOS系统版本
CentOS 5.x 是 /etc/redhat-release 文件,cat查看:CentOS release 5.11 (Final)
CentOS 6.x 及以上是 /etc/centos-release 文件,redhat-release文件也还在,两个文件内容一样,都是centos版本
CentOS 7.x 可直接查看 /etc/redhat-release 文件,当然也保留了 /etc/redhat-release/etc/centos-release

$ cat /etc/os-release
NAME="CentOS Linux"
VERSION="7 (Core)"
ID="centos"
ID_LIKE="rhel fedora"
VERSION_ID="7"
PRETTY_NAME="CentOS Linux 7 (Core)"
ANSI_COLOR="0;31"
CPE_NAME="cpe:/o:centos:centos:7"
HOME_URL="https://www.centos.org/"
BUG_REPORT_URL="https://bugs.centos.org/"

CENTOS_MANTISBT_PROJECT="CentOS-7"
CENTOS_MANTISBT_PROJECT_VERSION="7"
REDHAT_SUPPORT_PRODUCT="centos"
REDHAT_SUPPORT_PRODUCT_VERSION="7"

其他三个 -release 文件中都是简化版本信息

$ cat /etc/redhat-release
CentOS Linux release 7.6.1810 (Core)
$ cat /etc/centos-release
CentOS Linux release 7.6.1810 (Core)
$ cat /etc/system-release
CentOS Linux release 7.6.1810 (Core)

查看RedHat系统版本
查看 /etc/redhat-release 文件
Red Hat Enterprise Linux Server release 6.3 (Santiago)

查看Alpine系统版本
查看 /etc/os-release 文件

# cat /etc/os-release
NAME="Alpine Linux"
ID=alpine
VERSION_ID=3.10.4
PRETTY_NAME="Alpine Linux v3.10"
HOME_URL="https://alpinelinux.org/"
BUG_REPORT_URL="https://bugs.alpinelinux.org/"

还有个 /etc/alpine-release 里面是简化版本信息

# cat /etc/alpine-release
3.10.4

查看Debian系统版本
查看 /etc/os-release 文件

# cat /etc/os-release
PRETTY_NAME="Debian GNU/Linux 10 (buster)"
NAME="Debian GNU/Linux"
VERSION_ID="10"
VERSION="10 (buster)"
VERSION_CODENAME=buster
ID=debian
HOME_URL="https://www.debian.org/"
SUPPORT_URL="https://www.debian.org/support"
BUG_REPORT_URL="https://bugs.debian.org/"
root@centos:/# cat /etc/timezone
Etc/UTC
root@centos:/# env|grep TZ
TZ=Asia/Shanghai
root@centos:/# date
Thu Dec 26 12:06:33 CST 2019

文件系统管理

swapon

swapon 命令用于激活Linux系统中交换空间,Linux系统的内存管理必须使用交换区来建立虚拟内存。

-a:将/etc/fstab文件中所有设置为swap的设备,启动为交换区;
-h:显示帮助;
-p<优先顺序>:指定交换区的优先顺序;
-s:显示交换区的使用状况;
-V:显示版本信息。

swapon -s 查看系统交换空间使用状况:

$ swapon -s
文件名             类型      大小    已用   权限
/dev/nvme0n1p2  partition    839676    227688    -1

其实 swapon -s 命令查看的是 /proc/swaps 文件的内容,等价于:
cat /proc/swaps

$ cat /proc/swaps
Filename                Type        Size    Used    Priority
/swapfile1                              file        1048572    142592    -2

如果配置有多个swap分区或者文件的话,这里将会有多行,每行代表一个正在被系统使用的swap分区或文件,下面是每个字段的意思:
Filename:如果swap类型是分区,这里将是分区的路径,如果swap类型是文件,这里将是文件的路径
Type:swap的类型,partition代表这是一个swap分区,file代表这是一个swap文件
Size:swap的大小,单位是k
Used:已经被使用的大小
Priority:优先级,优先级高的swap将会被优先使用,同等优先级的swap将会被均匀的使用(round-robin算法),优先级可以通过“swapon -p”命令来设置

swapoff

swapoff命令用于关闭指定的交换空间(包括交换文件和交换分区)。swapoff实际上为swapon的符号连接,可用来关闭系统的交换区。
swapoff [-a] 交换空间或交换分区
-a:关闭配置文件“/etc/fstab”中所有的交换空间。

关闭 /dev/sda2 交换分区
swapoff /dev/sda2

关闭配置文件“/etc/fstab”中所有的交换空间
swapoff -a


磁盘管理

mkswap

mkswap命令用于在一个文件或者设备上建立交换分区。在建立完之后要使用sawpon命令开始使用这个交换区。

添加交换分区

添加一个交换分区,步骤如下:
使用fdisk来创建交换分区(假设 /dev/sdb2 是创建的交换分区)
使用 mkswap 命令来设置交换分区:
mkswap /dev/sdb2
注意:指定分区上的所有数据会丢失。

启用交换分区:
swapon /dev/sdb2

写入/etc/fstab,以便在系统启动时自动加载交换分区:
/dev/sdb2 none swap defaults 0 0

添加交换文件

添加一个交换文件,步骤如下:
创建大小为512MB的交换文件:
dd if=/dev/zero of=/swapfile1 bs=1M count=512

修改文件的权限,避免其他用户对这个文件进行误操作:
chmod 600 /swapfile1

使用mkswap命令来设置交换文件:
mkswap /swapfile1

启用交换文件:
swapon /swapfile1

写入/etc/fstab,以便在系统启动时自动加载交换文件:
/swapfile1 none swap defaults 0 0

新添了交换分区并启用它之后,请查看 cat /proc/swapsfreeswapon -s 命令的输出来确保交换分区已被启用了。

删除交换文件

如果要删除一个交换文件,必须先停用它。
作为root运行:
swapoff -a
-a 即关闭配置文件“/etc/fstab”中所有的交换空间。

然后即可删除它:
rm -rf /swapfile

当然我们还需要修改 /etc/fstab,否则下次重启后,系统又会重新挂载相应的swap分区和文件
最后从 /etc/fstab 中删除相关条目


fdisk

fdisk命令用于观察硬盘实体使用情况,也可对硬盘分区。它采用传统的问答式界面,而非类似DOS fdisk的cfdisk互动式操作界面

参数:
-b<分区大小>:指定每个分区的大小;
-l:列出指定的外围设备的分区表状况;
-s<分区编号>:将指定的分区大小输出到标准输出上,单位为区块;
-u:搭配”-l”参数列表,会用分区数目取代柱面数目,来表示每个分区的起始地址;
-v:显示版本信息。

例如查看磁盘分区情况:
fdisk -l /dev/mapper/data_vg-data_lv

sudo fdisk -l /dev/mapper/data_vg-data_lv
磁盘 /dev/mapper/data_vg-data_lv:52.4 GB, 52428800000 字节,102400000 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节

du

显示目录或者文件所占空间
-h--human-readable 以K,M,G为单位,提高信息的可读性。

常用格式:
du -h --max-depth=1:输出当前目录下各个子目录所使用的空间

df

检查文件系统的磁盘空间占用情况,默认情况下,磁盘空间将以 1KB 为单位进行显示
-h:以更易读的方式呈现


lsblk

lsblk命令用于列出所有可用块设备的信息,而且还能显示他们之间的依赖关系,但是它不会列出RAM盘的信息。块设备有硬盘,闪存盘,cd-ROM等等。

NAME:这是块设备名。
MAJ:MIN:本栏显示主要和次要设备号。
RM:本栏显示设备是否可移动设备。值为1说明他们是可移动设备。
SIZE:本栏列出设备的容量大小信息。
RO:该项表明设备是否为只读。RO值为0表明他们不是只读的。
TYPE:本栏显示块设备是否是磁盘或磁盘上的一个分区。在本例中,sda和sdb是磁盘,而sr0是只读存储(rom)。
MOUNTPOINT:本栏指出设备挂载的挂载点。

[prouser@vm-vmw96707-app ~]$ lsblk
NAME                               MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
sr0                                 11:0    1  1024M  0 rom
sda                                  8:0    0    23G  0 disk
├─sda1                             8:1    0   512M  0 part /boot
└─sda2                             8:2    0  22.5G  0 part
  ├─vg_root-lv_swap (dm-0)       253:0    0     4G  0 lvm  [SWAP]
  ├─vg_root-lv_root (dm-1)       253:1    0     2G  0 lvm  /
  ├─vg_root-lv_usr (dm-2)        253:2    0     5G  0 lvm  /usr
  ├─vg_root-lv_var (dm-3)        253:3    0     5G  0 lvm  /var
  ├─vg_root-lv_tmp (dm-4)        253:4    0     2G  0 lvm  /tmp
  ├─vg_root-lv_opt (dm-5)        253:5    0     2G  0 lvm  /opt
  └─vg_root-lv_home (dm-6)       253:6    0   2.5G  0 lvm  /home
sdb                                  8:16   0    95G  0 disk
├─vg_app-lv_app (dm-7)           253:7    0    40G  0 lvm  /opt/app
├─vg_app-lv_applog (dm-8)        253:8    0    40G  0 lvm  /opt/applog
├─vg_app-lv_adm (dm-9)           253:9    0    10G  0 lvm  /opt/adm
└─vg_app-lv_data_collect (dm-10) 253:10   0     5G  0 lvm  /opt/data_collect

系统管理

用户和工作组管理

su

switch user

su 选项 目标用户

su命令用于切换当前用户身份到其他用户身份,变更时须输入所要变更的用户帐号与密码。
root向普通或虚拟用户切换不需要密码
普通用户切换到其它任何用户都需要密码验证

-, -l, --login,切换用户时,使环境变量和欲切换的用户相同
环境变量包括(home目录,shell,user,logname,path等)

例如
su,不加任何参数,默认为切换到root用户,但没有转到root用户家目录下,也就是说这时虽然是切换为root用户了,但并没有改变root登录环境
su -,su 加参数 - ,表示默认切换到root用户,并且改变到root用户的环境
su - masi,切换到masi用户,并且改变到masi用户的环境

su命令和su -命令最大的本质区别就是:前者只是切换了root身份,但Shell环境仍然是普通用户的Shell;而后者连用户和Shell环境一起切换成root身份了。su切换成root用户以后,pwd一下,发现工作目录仍然是普通用户的工作目录;而用su -命令切换以后,工作目录变成root的工作目录了。用echo $PATH命令看一下su和su -以后的环境变量,发现会有不同。


id

id 命令可以显示真实有效的用户 ID(UID) 和组 ID(GID)。UID 是对一个用户的单一身份标识。组 ID(GID)则对应多个UID。
uid=4034(jboss5) gid=214(jboss) groups=214(jboss)

如何读取输出:
用户jboss5的uid号码为4034,gid号码是214,用户jboss是下面组的成员:组groups(gid为214)


useradd

只有root账号才可以使用此命令。
useradd命令用于Linux中创建的新的系统用户。useradd可用来建立用户帐号。帐号建好之后,再用passwd设定帐号的密码.而可用userdel删除帐号。使用useradd指令所建立的帐号,实际上是保存在/etc/passwd文本文件中。
在Red Hat Linux中,adduser命令则是useradd命令的符号连接,两者实际上是同一个指令。

示例
useradd testuser,创建用户testuser
passwd testuser 给已创建的用户testuser设置密码
说明:新创建的用户会在/home下创建一个用户目录testuser

选项
-c<备注>:加上备注文字。备注文字会保存在passwd的备注栏位中;
-d<登入目录>:指定用户登入时的启始目录;
-D:变更预设值;
-e<有效期限>:指定帐号的有效期限;
-f<缓冲天数>:指定在密码过期后多少天即关闭该帐号;
-g<群组>:指定用户所属的群组;
-G<群组>:指定用户所属的附加群组;
-m:自动建立用户的登入目录;
-M:不要自动建立用户的登入目录;
-n:取消建立以用户名称为名的群组;
-r:建立系统帐号;
-s:指定用户登入后所使用的shell;
-u:指定用户id。


userdel

userdel命令用于删除给定的用户,以及与用户相关的文件。若不加选项,则仅删除用户帐号,而不删除相关文件。

-f:强制删除用户,即使用户当前已登录;
-r:删除用户的同时,删除与用户相关的所有文件。
请不要轻易用-r选项;他会删除用户的同时删除用户所有的文件和目录,切记如果用户目录下有重要的文件,在删除前请备份。

userdel testuser 删除用户testuser


passwd 修改口令

passwd 作为普通用户和超级权限用户都可以运行,但作为普通用户只能更改自己的用户密码,但前提是没有被root用户锁定;如果root用户运行passwd ,可以设置或修改任何用户的密码。
passwd 命令后面不接任何参数或用户名,则表示修改当前用户的密码;

用户账号刚创建时没有口令,但是被系统锁定,无法使用,必须为其指定口令后才可以使用,即使是指定空口令。

passwd username:修改用户username的密码,仅root用户可修改其他用户的密码。

-l 锁定口令,即禁用账号。
-u 口令解锁。
-d 使账号无口令。
-f 强迫用户下次登录时修改口令。


usermod

修改用户账号就是根据实际情况更改用户的有关属性,如用户号、主目录、用户组、登录Shell等。
usermod 选项 用户名
常用的选项包括-c, -d, -m, -g, -G, -s, -u以及-o等,这些选项的意义与useradd命令中的选项一样,可以为用户指定新的资源值。

例如
usermod -s /bin/ksh -d /home/z –g developer sam
此命令将用户sam的登录Shell修改为ksh,主目录改为/home/z,用户组改为developer。

This account is currently not available

修改完 elasticsearch 用户的密码,su 切换时提示 This account is currently not available
cat /etc/passwd | grep elasticsearch 查看 elasticsearch 账号信息
elasticsearch:x:991:986:elasticsearch user:/nonexistent:/sbin/nologin
发现它的 shell 是 /sbin/nologin,需要将起改成 /bin/bash
sudo usermod -s /bin/bash elasticsearch


last

last 命令用于显示用户最近登录信息。
单独执行last命令,它会读取 /var/log/wtmp 文件,并把该给文件的内容记录的登入系统的用户名单全部显示出来。

last 命令的数据源是 /var/log/wtmp(默认 记录每个用户的登录次数和持续时间等信息)和 /var/log/btmp (详细,包括登录失败请求)

用户名 终端位置 登录IP或内核 开始时间 - 结束时间(still login in 还未退出 down 直到正常关机 crash 直到强制关机) 持续时间

# last
centos   pts/0        111.198.225.229  Sun Apr 19 18:09   still logged in
centos   pts/0        111.198.225.229  Sat Apr 18 21:49 - 01:06  (03:17)
centos   pts/0        220.194.45.154   Thu Apr  2 19:05 - 21:36  (02:30)
centos   pts/0        220.194.45.154   Thu Apr  2 12:54 - 16:16  (03:22)
centos   pts/0        220.194.45.154   Wed Apr  1 11:49 - 11:58  (00:08)
centos   pts/0        220.194.45.154   Tue Mar 24 13:01 - 13:54  (00:53)
centos   pts/0        220.194.45.154   Tue Mar 17 17:05 - 21:50  (04:44)
centos   pts/0        220.194.45.154   Tue Mar 17 10:51 - 15:07  (04:16)
centos   pts/0        111.198.226.65   Mon Mar 16 12:07 - 12:52  (00:45)
centos   pts/0        111.198.226.65   Sat Mar 14 22:03 - 00:19  (02:16)

chsh

chsh命令用来更换登录系统时使用的shell。若不指定任何参数与用户名称,则chsh会以应答的方式进行设置。

查看系统安装了哪些shell:
cat /etc/shells

# List of acceptable shells for chpass(1).
# Ftpd will not allow users to connect who are not using
# one of these shells.

/bin/bash
/bin/csh
/bin/ksh
/bin/sh
/bin/tcsh
/bin/zsh

查看当前正在使用的shell:

echo $SHELL
/bin/bash

注意SHELL一定要是大写。

把我的shell改成zsh:
chsh -s /bin/zsh
使用chsh加选项-s就可以修改登录的shell了!你会发现你现在执行echo $SHELL后仍然输出为/bin/bash,这是因为你需要重启你的shell才完全投入到zsh怀抱中去。chsh -s其实修改的就是/etc/passwd文件里和你的用户名相对应的那一行。


进程和作业管理

ps

ps命令用于报告当前系统的进程状态。
-e: 显示所有进程, 等于 -A
-f: 全格式

查看系统的所有进程,可以使用 ps -efps aux, 显示结果不同。

一般常用ps -ef,结果格式为:
UID PID PPID C STIME TTY TIME CMD
UID:用户ID
PID:进程ID
PPID:父进程ID
C:CPU占用率
STIME:开始时间
TTY:开始此进程的TTY
TIME:此进程运行的总时间
CMD:命令


pgrep

pgrep pattern:显示和pattern相关的当前进程,只返回进程号

例如,查看nginx的进程号
pgrep nginx


pmap

pmap命令用于报告进程的内存映射关系,是Linux调试及运维一个很好的工具。
pmap [ -x | -d ] [ -q ] pids...

-x:显示扩展格式;
-d:显示设备格式;
-q:不显示头尾行;
-V:显示指定版本。

$ sudo pmap -d 13920
13920:   java -jar blog-0.0.1-SNAPSHOT.jar --server.port=8001
Address           Kbytes Mode  Offset           Device    Mapping
0000000000400000       4 r-x-- 0000000000000000 0ca:00001 java
0000000000600000       4 rw--- 0000000000000000 0ca:00001 java
0000000001980000    2676 rw--- 0000000000000000 000:00000   [ anon ]
00000000f8200000   43008 rw--- 0000000000000000 000:00000   [ anon ]
00000000fac00000   86016 rw--- 0000000000000000 000:00000   [ anon ]
...
ffffffffff600000       4 r-x-- 0000000000000000 000:00000   [ anon ]
mapped: 2216340K    writeable/private: 380040K    shared: 2212K

最后一行的值
mapped 表示该进程映射的虚拟地址空间大小,也就是该进程预先分配的虚拟内存大小,即ps出的vsz
writeable/private 表示进程所占用的私有地址空间大小,也就是该进程实际使用的内存大小
shared 表示进程和其他进程共享的内存大小


nohup

在命令前加nohup,关闭终端后依然执行,常用于跑一些运行时间很长的程序

nohup Command [ Arg … ][ & ]

nohup 命令运行由 Command 参数和任何相关的 Arg 参数指定的命令,忽略所有挂断(SIGHUP)信号,如果当前bash关闭,则当前进程会挂载到init进程下,成为其子进程,这样即使退出当前用户程序也可继续执行。 在注销后使用 nohup 命令运行后台中的程序。要运行后台中的 nohup 命令,添加 &到命令的尾部。

nohup&

当在前台运行某个作业时,终端被该作业占据;可以在命令后面加上& 实现后台运行。例如:sh test.sh &
不过,作业在后台运行一样会将结果输出到屏幕上,干扰你的工作。如果放在后台运行的作业会产生大量的输出,最好使用下面的方法把它的输出重定向到某个文件中:
command > out.file 2>&1 &
这样,所有的标准输出和错误输出都将被重定向到一个叫做out.file 的文件中。
2>&1 是将标准出错重定向到标准输出,这里的标准输出已经重定向到了out.file文件,即将标准出错也输出到out.file文件中。试想2>1代表什么,2与>结合代表错误重定向,而1则代表错误重定向到一个文件1,而不代表标准输出;换成2>&1&与1结合就代表标准输出了,就变成错误重定向到标准输出

使用&命令后,作业被提交到后台运行,当前控制台没有被占用,但是一但把当前控制台关掉(退出帐户时),作业就会停止运行。nohup命令可以在你退出帐户之后继续运行相应的进程。nohup就是不挂起的意思( no hang up)。该命令的一般形式为:
nohup command &
使用了nohup之后,很多人就这样不管了,其实这样有可能在当前账户非正常退出或者结束的时候,命令还是自己结束了。所以在使用nohup命令后台运行命令之后,需要使用exit正常退出当前账户,这样才能保证命令一直在后台运行。

linux后台执行命令:&和nohup
https://www.cnblogs.com/zzyoucan/p/7764590.html


文件系统管理

mount

在windows操作系统中,挂载通常是指给磁盘分区(包括被虚拟出来的磁盘分区)分配一个盘符;
在linux操作系统中,挂载是指将一个设备(通常是存储设备)挂接到一个已存在的目录上。我们要访问存储设备中的文件,必须将文件所在的分区挂载到一个已存在的目录上, 然后通过访问这个目录来访问存储设备。

注意事项:挂载点必须是一个已经存在的目录,这个目录可以不为空,但挂载后这个目录下以前的内容将不可用,umount以后会恢复正常。

mount [-t vfstype] [-o options] device dir

-t vfstype,指定文件系统的类型,通常不必指定。mount 会自动选择正确的类型。常用类型有:
光盘或光盘镜像:iso9660
DOS fat16文件系统:msdos
Windows 9x fat32文件系统:vfat
Windows NT ntfs文件系统:ntfs
Mount Windows文件网络共享:smbfs
UNIX(LINUX) 文件网络共享:nfs

-o options,主要用来描述设备或档案的挂接方式。常用的参数有:
loop:用来把一个文件当成硬盘分区挂接上系统
ro:采用只读方式挂接设备
rw:采用读写方式挂接设备
iocharset:指定访问文件系统所用字符集

device,要挂接(mount)的设备。

dir,设备在系统上的挂接点(mount point)。

挂载光驱到指定目录
mount /dev/cdrom /mnt/cdrom


unmount

例如 /dev/hda5 已经挂载在/mnt/hda5上,用一下三条命令均可卸载挂载的文件系统
umount /dev/hda5
umount /mnt/hda5
umount /dev/hda5 /mnt/hda5


文件目录管理

目录基本操作

cd

cd /,返回根目录,即/
cd -,返回进入此目录之前所在的目录,即环境变量OLDPWD所表示的目录
cd,cd后什么都不加,等于cd ~,进入当前用户家目录
cd ~,回到当前用户家目录
如果是以root身份登录,执行此命令后,回到/root/目录下
如果是以其他用户(例如masi)等录的话,则是回到/home/masi目录下。

.,当前目录
..,上一级目录
cd ..,返回上一级
cd ../..,返回上两级目录

根目录和家目录
根目录即/
家目录,除root用户之外的用户的家目录在“/home/用户名”下
root用户的家目录为/root/


pwd

输出当前目录,pwd命令以绝对路径的方式显示用户当前工作目录。命令将当前目录的全路径名称(从根目录)写入标准输出。


cp

cp [options] source1 source2 source3 .... directory
cp可以将单个源文件复制成一个指定文件名的具体文件,用于拷贝并改名。
默认情况下,cp命令不能复制目录,如果要复制目录,则必须使用-R选项;
当“源文件”为多个文件时,要求“目标文件”为指定的目录。

选项
-r/R,递归处理,将指定目录下的所有文件与子目录一并处理,用于目录的复制行为。此时目标文件必须为一个目录名。
-f,删除已经存在的目标文件而不提示。
-i,和f选项相反,在覆盖目标文件之前将给出提示要求用户确认。回答y时目标文件将被覆盖,是交互式拷贝。
-v,详细显示命令执行的操作。

复制指定目录下的全部文件到另一个目录中
假设复制源目录为/home/masi/dir1,目标目录为/home/masi/dir2
如果dir2目录不存在,则使用命令:cp -r /home/masi/dir1 /home/masi/dir2,将拷贝dir1并改名为目录dir2
如果dir2目录已存在,则使用目录:cp -r /home/masi/dir1 /home/masi/dir2,拷贝后dir1成为dir2的子目录


mv

mv命令用来对文件或目录重新命名,或者将文件从一个目录移到另一个目录中。

mv [选项] 源文件或目录 目标文件或目录
如果“目标文件”是文件名则在移动文件的同时,将其改名为“目标文件”;如果“目标文件”是目录名则将源文件移动到“目标文件”下。

-f,若目标文件或目录与现有的文件或目录重复,则直接覆盖现有的文件或目录;

改文件名
例如,将当前目录中的readme.txt改名为readme.doc
mv readme.txt readme.doc


rm

对于链接文件,只是删除整个链接文件,而原有文件保持不变。

-f,强制删除,不提示
-r/R,递归删除,用于删除文件夹


mkdir

-p/--parents,若所要建立目录的上层目录目前尚未建立,则会一并建立上层目录,用于递归建立文件夹
-m <目标属性>/--mode <目标属性>,建立目录的同时设置目录的权限;

在当前目录中建立bin和bin下的os_1目录,权限设置为文件主可读、写、执行,同组用户可读和执行,其他用户无权访问
mkdir -p-m 750 bin/os_1

同时创建/home/test1/test2、/home/test3/test4 目录
mkdir -p /home/{test1/test2,test3/test4}


ls

选项
-a,显示所有文件和目录(以.开头的文件是隐藏文件,默认不显示)
-t,用文件和目录的更改时间排序(默认为文件名排序),最近修改的文件显示在最前面。
-d,仅显示目录名,而不显示目录下的内容列表。显示符号链接文件本身,而不显示其所指向的目录列表;
-l,以长格式显示目录下的内容列表,包含档案的属性与权限等等数据。
例如:
-rwxr-xr-x. 1 root root 23832 May 11 2016 env
从左到右依次为文件属性、连接数、文件拥有者、文件所属用户组、文件大小、最后修改时间、文件名

ll,预定义的命令别名,用于列出所有内容及详细信息,which ll结果为:alias ll='ls -l --color=auto'
ll -h,以更易读的方式显示文件大小


文件权限属性设置

stat

通过stat命令查看文件的状态

linux系统的文件时间
linux系统“文件时间”主要包括三个内容:

  • 修改时间(modification time, 简称mtime):当前文件“内容数据”更改时,这个属性被更新,使用ls命令显示的时间就是修改时间mtime
  • 状态时间(status time, 简称ctime):是该文件的i节点最后一次被修改的时间,通过chmod、chown命令修改一次文件属性,这个时间就会更新。
  • 访问时间(access time, 简称atime):当读取文件内容时,这个属性被更新,比如对这个文件运用 more、cat等命令。注意ls、stat命令都不会修改文件的访问时间。

Linux中如何查看文件的最初创建时间?
在Linux中,没有文件创建时间的概念。只有文件的访问时间、修改时间、状态改变时间。也就是说不能知道文件的创建时间。但如果文件创建后就没有修改过,修改时间=创建时间;如果文件创建后,状态就没有改变过,那么状态改变时间=创建时间;如果文件创建后,没有被读取过,那么访问时间=创建时间,这个基本不太可能。


chmod

linux文件属性

第一个属性,表示这个文件的类型,常见的有:文件(-)、目录(d)或连接文件(l)等。
后九个属性中,每三个位一组,”r”表示可读(read)、”w”表示可写(write)、”x”表示可执行(excute)。
第一组为“拥有者owner的权限”;
第二组为“同用户组的权限”;
第三组为“其他人的权限”;

chmod [options] mode files
-R/--recursive,对目前目录下的所有档案与子目录进行相同的权限变更(即以递归的方式逐个变更)

权限设定字符串
权限设定字符串mode格式如下 : [ugoa…][[+-=][rwxX]…][,…]
其中u 表示该档案的拥有者,g 表示与该档案的拥有者属于同一个群体(group)者,o 表示其他以外的人,a 表示这三者皆是。
+表示增加权限、-表示取消权限、=表示唯一设定权限。
r 表示可读取,w 表示可写入,x 表示可执行,X 表示只有目标文件对某些用户是可执行的或该目标文件是目录时才追加x 属性。

数字表示
此外我们多数用三位八进制数字的形式来表示权限,第一位指定属主的权限,第二位指定组权限,第三位指定其他用户的权限,每位通过4(读100)、2(写010)、1(执行001)三种数值的和来确定权限。如6(4+2)代表有读写权,7(4+2+1)有读、写和执行的权限。
例如:
若要rwx属性则4+2+1=7;
若要rw-属性则4+2=6;
若要r-x属性则4+1=5。
还可设置第四位,它位于三位权限序列的前面,第四位数字取值是4,2,1,代表意思如下:
4,执行时设置用户ID,用于授权给基于文件属主的进程,而不是给创建此进程的用户。
2,执行时设置用户组ID,用于授权给基于文件所在组的进程,而不是基于创建此进程的用户。
1,设置粘着位。

示例
将档案 file1.txt 设为所有人皆可读取 :
chmod ugo+r file1.txt
将档案 file1.txt 设为所有人皆可读取 :
chmod a+r file1.txt
将档案 file1.txt 与 file2.txt 设为该档案拥有者,与其所属同一个群体者可写入,但其他以外的人则不可写入 :
chmod ug+w,o-w file1.txt file2.txt
将 ex1.py 设定为只有该档案拥有者可以执行 :
chmod u+x ex1.py
将目前目录下的所有档案与子目录皆设为任何人可读取 :
chmod -R a+r *
范例:
chmod a=rwx file 和 chmod 777 file 效果相同
chmod ug=rwx,o=x file 和 chmod 771 file 效果相同
若用chmod 4755 filename可使此程序具有root的权限


chown

chown命令改变某个文件或目录的所有者和所属的组,该命令可以向某个用户授权,使该用户变成指定文件的所有者或者改变文件所属的组。用户可以是用户或者是用户 ID,用户组可以是组名或组 ID。文件名可以使由空格分开的文件列表,在文件名中可以包含通配符。

只有文件主和超级用户才可以便用该命令。
chown [-cfhvR] [--help] [--version] user[:group] file...

user : 新的文件拥有者的使用者 ID
group : 新的文件拥有者的使用者组(group)
-c : 显示更改的部分的信息
-f : 忽略错误信息
-h :修复符号链接
-v : 显示详细的处理信息
-R,--recursive : 处理指定目录以及其子目录下的所有文件
–help : 显示辅助说明
–version : 显示版本

将目录 /usr/meng 及其下面的所有文件、子目录的文件主改成 liu
chown -R liu /usr/meng

把 file 文件的文件主改为 user
chown user file

把 file 文件的文件主改为 user,所属group改为 group
chown user:group file

chgrp

chgrp命令用来改变文件或目录所属的用户组。该命令用来改变指定文件所属的用户组。其中,组名可以是用户组的id,也可以是用户组的组名。文件名可以 是由空格分开的要改变属组的文件列表,也可以是由通配符描述的文件集合。如果用户不是该文件的文件主或超级用户(root),则不能改变该文件的组。

在UNIX系统家族里,文件或目录权限的掌控以拥有者及所属群组来管理。您可以使用chgrp指令去变更文件与目录的所属群组,设置方式采用群组名称或群组识别码皆可。

将/usr/meng及其子目录下的所有文件的用户组改为mengxin
chgrp -R mengxin /usr/meng


文件查找和比较

find

find <指定目录> <指定条件> <指定动作>
如果什么参数也不加,find默认搜索当前目录及其子目录,并且不过滤任何结果(也就是返回所有文件),将它们全都显示在屏幕上。
可同时搜索多个指定目录,注意目录之间要用空格分开

查找目录:find /(查找范围) -name '查找关键字' -type d
查找文件:find /(查找范围) -name 查找关键字 -print

条件:
-name pattern, 指定文件名 pattern,可使用正则表达式,只匹配文件名不匹配路径
-iname pattern,此参数的效果和指定-name参数类似,但忽略字符大小写的差别
-type b/d/c/p/l/f,指定文件类型,b块设备、d目录、c字符设备、p管道、l符号链接、f普通文件
-empty 查找系统中空白的文件或目录,或目录中没有子目录的文件夹
-maxdepth n 设置最大目录层级
-size n[cwbkMG]

指定动作:
-exec find 命令对匹配的文件执行该参数所给出的Shell命令。
-ok 和 -exec的作用相同,只是更安全,在执行每个命令之前,都会给出提示,让用户来确定是否执行。
{}代表前面查找出来的文件
-delete 删除查到的文件或目录

使用示例:
查出当前目录(包含子目录)下所有空文件夹
find . -type d -empty

查出当前目录(不包含子目录)下所有空文件夹,使用-maxdepth指定查找深度
find . -maxdepth 1 -type d -empty

查出当前目录下所有空文件夹,并删除。使用管道连接rm命令,用xargs做入参处理
find . -type d -empty | xargs rm -r
find命令可以把匹配到的文件传递给 xargs 命令执行,在使用 find 命令的 -exec 选项处理匹配到的文件时,find将所有匹配到的文件一起传递给 exec 执行。由于有些系统对能够传递给 exec 的命令长度有限制,这样会引起溢出错误。这时可以使用 xargs 命令。

查出当前目录下所有空文件夹,并删除。使用-exec执行rm命令,{}代表前面查找出来的文件,后面必须加;
find . -maxdepth 1 -type d -empty -exec rm -r {} \;

查出当前目录下所有空文件夹,并删除。使用-ok执行rm命令,删除前有提示
find . -maxdepth 1 -type d -empty -ok rm -r {} \;

查出当前目录下所有空文件夹,并删除。使用-delete,无提示,文件目录都可删除
find . -maxdepth 1 -type d -empty -delete

查找并删除当前目录及其子目录下的所有.DS_Store 文件:
find . -name '*.DS_Store' -type f -delete
find . -name '.DS_Store' | xargs rm -r

查找/etc /tmp /root目录下名为passwd的文件,注意目录之间要用空格分开
find /etc /tmp /root -name passwd

搜索当前目录(含子目录,以下同)中,所有文件名以my开头的文件
find . -name my*

查/home目录下以两个小写字母和两个数字开头的txt文件
find /home -name [a-z][a-z][0–9][0–9].txt -print

查找tomcat7文件夹所在的位置
find / -name 'tomcat7' -type d

查找server.xml文件的位置
find / -name 'server.xml' -print

查找所有名字包含nginx的文件,并管道连接ll -ah命令列出详细信息
sudo find / -name 'nginx' |ll -ah

搜索当前目录下,超过800M大小的文件
find . -type f -size +800M


whereis

whereis命令用来定位指令的二进制程序、源代码文件和man手册页等相关文件的路径。

whereis命令只能用于程序名的搜索,而且只搜索二进制文件(参数-b)、man说明文件(参数-m)和源代码文件(参数-s)。如果省略参数,则返回所有信息。

和find相比,whereis查找的速度非常快,这是因为linux系统会将 系统内的所有文件都记录在一个数据库文件中,当使用whereis和下面即将介绍的locate时,会从数据库中查找数据,而不是像find命令那样,通 过遍历硬盘来查找,效率自然会很高。 但是该数据库文件并不是实时更新,默认情况下时一星期更新一次,因此,我们在用whereis和locate 查找文件时,有时会找到已经被删除的数据,或者刚刚建立文件,却无法查找到,原因就是因为数据库文件没有被更新。


which

查看可执行文件的位置。which命令的作用是,在$PATH变量指定的路径中,搜索某个系统命令的位置,并且返回第一个搜索结果。也就是说,使用which命令,就可以看到某个系统命令是否存在,以及执行的到底是哪一个位置的命令。

which 可执行文件名称

用 which 去找出 which

$ which which
alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'
    /usr/bin/which

竟然会有两个 which ,其中一个是 alias 这就是所谓的『命令别名』,意思是输入 which 会等於后面接的那串命令

找出 cd 这个命令

$ which cd
/usr/bin/which: no cd in (/opt/java/jdk1.7.0_80/bin:/opt/app/scala/scala-2.10.4/bin:/bin:/bin:/usr/lib64/qt-3.3/bin:/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/opt/app/spark/spark-1.5.2-bin-hadoop2.6/bin:/opt/app/spark/spark-1.5.2-bin-hadoop2.6/sbin:/opt/app/scala/scala-2.10.4/bin:/home/jboss5/bin)

cd 这个常用的命令竟然找不到啊!为什么呢?这是因为 cd 是bash 内建的命令! 但是 which 默认是找 PATH 内所规范的目录,所以当然一定找不到的!


diff

diff [参数] [文件1或目录1] [文件2或目录2]
例如:
$diff -u hello_old.c hello_new.c > hello.diff
-u表示统一格式输出,其中有+ - !

diff程序的输出被称为补丁 (patch),因为Linux系统中还有一个patch程序,可以根据diff的输出将a.c的文件内容更新为b.c。


文件编辑

sed

sed是一种流编辑器,它是文本处理中非常中的工具,能够完美的配合正则表达式使用,功能不同凡响。
处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有 改变,除非你使用重定向存储输出。
Sed主要用来自动编辑一个或多个文件;简化对文件的反复操作;编写转换程序等。

-n, --quiet, --silent, 使用安静(silent)模式。只有经过sed 特殊处理的那一行(或者动作)才会被列出来。
-i, 直接修改读取的文件内容,而不是输出到终端。

s命令替换

sed "s/查找串/替换串/" file

sed替换标记
g 表示行内全面替换。
p 表示打印行。
w 表示把行写入一个文件。
x 表示互换模板块中的文本和缓冲区中的文本。
y 表示把一个字符翻译为另外的字符(但是不用于正则表达式)
\1 子串匹配标记
& 已匹配字符串标记

sed -n 's/test/TEST/p' file, -n选项和p命令一起使用表示只打印那些发生替换的行。
也就是说,如果某一行开头的test被替换成mytest,就打印它。

sed -i直接编辑文件

-i 表示inplace edit,就地修改文件
sed -i 's/book/books/g' file, 直接编辑文件选项-i,会匹配file文件中每一行的第一个book替换为books

全面替换标记/g

sed 's/book/books/g' file, 使用后缀 /g 标记会替换每一行中的所有匹配
如果没有 /g 标记,则只有每行第一个匹配的 book 被替换成 books

当需要从 第N处匹配 开始替换时,可以使用 /Ng

echo sksksksksksk | sed 's/sk/SK/2g'
skSKSKSKSKSK

echo sksksksksksk | sed 's/sk/SK/3g'
skskSKSKSKSK

echo sksksksksksk | sed 's/sk/SK/4g'
skskskSKSKSK
任意定界符

字符 / 在sed中作为定界符使用,也可以使用任意的定界符:

sed 's:test:TEXT:g'
sed 's|test|TEXT|g'

定界符出现在样式内部时,需要进行转义:

sed 's/\/bin/\/usr\/local\/bin/g'

&匹配查找到的串

sed 's/^192.168.0.1/&localhost/' example
& 符号表示替换换字符串中被找到的部份。所有以192.168.0.1开头的行都会被替换成它自已加localhost,变成192.168.0.1localhost。


sed -n x,yp filename 逗号选定行范围

sed -n x,yp filename,打印文件X行到Y行的内容
例如:
sed -n 5,10p filename,查看文件的第5行到第10行。


d命令删除

sed '2d' example, 删除example文件的第二行。
sed '2,$d' example, 删除example文件的第二行到末尾所有行。
sed '2,5d' example, 删除example文件的第二行到第5行。
sed '$d' example, 删除example文件的最后一行。
sed '/test/'d example, 删除example文件所有包含test的行。


文件过滤分割与合并

grep

Global Regular Expression Print
是一个强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。

grep [-acinv] [--color=auto] '搜寻字符串' filename

选项与参数:
-a :将 binary 文件以 text 文件的方式搜寻数据
-c :计算找到 ‘搜寻字符串’ 的次数
-i 忽略大小写的不同,所以大小写视为相同
-n 顺便输出行号
-v 反向选择,亦即显示出没有 ‘搜寻字符串’ 内容的那一行!
–color=auto :可以将找到的关键词部分加上颜色的显示。有的系统默认会给grep设一个带有此参数的别名:alias grep=’grep –color=auto’

查看有关nginx的进程
ps -ef | grep nginx

在多个文件中查找

同时在文件 file1 file2 file3 中搜索
grep "match pattern" file1 file2 file3

在当前目录下的所有 .log 文件中搜索:
grep pattern *.log

从文件末尾搜索

搜索出文件中所有匹配的,然后通过tail命令只打引出最后一行,即得到反向的第一个
grep -n 'something' file.txt | tail -n 1
这种方法需要读取整个文件,当文件过大时很慢

搜索含空格的字符串

\转义空格:
grep Program\ Files file1
或者放到引号内:
grep 'Enter method createUser' /data/log/masikkk/user.log

或操作

grep -E '123|abc' filename,找出文件(filename)中包含123或者包含abc的行,-E表示用正则表达式:
egrep '123|abc' filename,用egrep同样可以实现正则表达式匹配
awk '/123|abc/' filename,awk 的实现方式

在log中搜索insertSelective,排除包含0-6 Millis的行,其实用正则写更简单:
grep insertSelective user.log |egrep -v "0 Millis|1 Millis|2 Millis|3 Millis|4 Millis|5 Millis|6 Millis"

与操作

显示既匹配 pattern1 又匹配 pattern2 的行:
grep pattern1 files | grep pattern2

查看包含run.sh但不包含jdk的进程(二次grep筛选):
ps -ef | grep run.sh | grep -v jdk

其他操作示例
grep -i pattern files //不区分大小写地搜索。默认情况区分大小写,
grep -l pattern files //只列出匹配的文件名,
grep -L pattern files //列出不匹配的文件名,
grep -w pattern files //只匹配整个单词,而不是字符串的一部分(如匹配‘magic’,而不是‘magical’),
grep -C number pattern files //匹配的上下文分别显示[number]行,

grep -A -B -C

-A -B -C 后面都跟阿拉伯数字,-A是显示匹配后和它后面的n行。-B是显示匹配行和它前面的n行。-C是匹配行和它前后各n行。

grep -A n file, after,显示匹配结果后n行
grep -B n file, before,显示匹配结果前n行
grep -C n file, context,显示匹配结果前后各n行
例如:
grep -A 4 wikipedia 文件.txt
就是搜索文件,找到匹配“wikipedia”字串的行,显示该行后后面紧跟的4行。

egrep

egrep命令用于在文件内查找指定的字符串。egrep执行效果与grep -E相似,使用的语法及参数可参照grep指令,与grep的不同点在于解读字符串的方法。egrep是用extended regular expression语法来解读的,而grep则用basic regular expression 语法解读,extended regular expression比basic regular expression的表达更规范。

在log中搜索insertSelective,只显示包含 “5位数字 Millis” 的行
grep insertSelective user.log |egrep "[0-9]{5} Millis"

在 app.log 中查找 method1 方法超过10秒的
egrep "method1 proceed cost [0-9]{5} ms" app.log

在 app.log 中查找处理时间在 10 秒到 100 秒之间的日志,即处理时间在5位数到6位数之间的
egrep "proceed cost [0-9]{5,6} ms" app.log
egrep "[0-9]{5,6} millis" app.log -n

grep、egrep、fgrep命令和正则表达式用法
http://www.178linux.com/7040


wc

利用wc指令我们可以计算文件的行数、单词数,以及该文件的字节数。
若不指定文件名称、或是所给予的文件名为”-“,则wc指令会从标准输入设备读取数据。

wc [-clw] [文件...]

-c或–bytes或–chars 只显示Bytes数。
-l或–lines 只显示行数。
-w或–words 只显示字数。

示例
1、计算testfile文件的统计信息

$ wc testfile
3 92 598 testfile

testfile文件的行数为3、单词数92、字节数598

2、统计redis匹配keys的个数
利用 wc 命令统计 keys 命令结果的行数:
redis-cli -h host -p port -a password keys "prefix-*" | wc -l


tr

translate characters
sed 命令的低配版,可实现很多字符串基本操作。

tr [-cdst][--help][--version][第一字符集][第二字符集]
-c, –complement:反选设定字符。也就是符合 SET1 的部份不做处理,不符合的剩余部份才进行转换
-d, –delete:删除指令字符
-s, –squeeze-repeats:缩减连续重复的字符成指定的单个字符
-t, –truncate-set1:削减 SET1 指定范围,使之与 SET2 设定长度相等

将文件file中出现的”abc”替换为”xyz”
cat file | tr "abc" "xyz" > new_file
注意:凡是在file中出现的”a”字母,都替换成”x”字母,”b”字母替换为”y”字母,”c”字母替换为”z”字母。而不是将字符串”abc”替换为字符串”xyz”

使用tr命令“统一”字母大小写
(小写 –> 大写)
cat file | tr [a-z] [A-Z] > new_file
(大写 –> 小写)
cat file | tr [A-Z] [a-z] > new_file
将输入字符由大写转换为小写:
echo "HELLO WORLD" | tr 'A-Z' 'a-z'

删除文件file中出现的”Snail”字符
cat file | tr -d "Snail" > new_file
凡是在file文件中出现的’S’,’n’,’a’,’i’,’l’字符都会被删除!而不是紧紧删除出现的”Snail”字符串。

删除文件file中出现的换行’\n’、制表’\t’字符
cat file | tr -d "\n\t" > new_file

删除所有数字0-9:
echo "hello 123 world 456" | tr -d '0-9'

将制表符转换为空格:
cat text | tr '\t' ' '

删除“连续着的”重复字母,只保留第一个
cat file | tr -s [a-zA-Z] > new_file

连续出现的空格(制表符)只保留一个,并用换行符替换空格
cat word_count.txt| tr -s ' \t' '\n'
比如原文本为

masikkk masikkk xx xx x x     kkk kk  kkk
english    count  ? com         masikkk
madaimeng    devgou  com

处理之后成为

masikkk
masikkk
xx
xx
x
x
kkk
kk
kkk
english
count
?
com
masikkk
madaimeng
devgou
com

sort

sort命令将文件进行排序,并将排序结果标准输出。sort命令既可以从特定的文件,也可以从stdin中获取输入。
sort将文件/文本的每一行作为一个单位,相互比较,比较原则是从首字符向后,依次按ASCII码值进行比较,最后将他们按升序输出。
如果 File 参数指定多个文件,那么 sort 命令将这些文件连接起来,并当作一个文件进行排序。

sort [-fbMnrtuk] [file or stdin]

选项与参数:
-u, --unique 在输出行中去除重复行
-r, --reverse sort默认的排序方式是升序,如果想改成降序,就加个-r就搞定了。
-o, --output=FILE:将排序后的结果存入制定的文件;

-f :忽略大小写的差异,例如 A 与 a 视为编码相同;
-b :忽略最前面的空格符部分;
-M :以月份的名字来排序,例如 JAN, DEC 等等的排序方法;
-n :使用『纯数字』进行排序(默认是以文字型态来排序的);
-t :分隔符,默认是用 [tab] 键来分隔;
-k :以那个区间 (field) 来进行排序的意思

输出到源文件
由于sort默认是把结果输出到标准输出,所以需要用重定向才能将结果写入文件,形如
sort filename > newfile
但是,如果你想把排序结果输出到原文件中,用重定向可就不行了。sort -r number.txt > number.txt 源文件会被清空
这个时候,只能用-o选项来指定原文件
sort -r number.txt -o number.txt

linux sort 命令详解
https://www.cnblogs.com/51linux/archive/2012/05/23/2515299.html


uniq

uniq命令可以统计或去除排序过的文件中的重复行,因此uniq经常和sort合用。
也就是说,为了使uniq起作用,所有的重复行必须是相邻的

-c, --count 在每列旁边显示该行重复出现的次数;
-u, --unique 仅显示出一次的行列;
-d, --repeated 仅显示重复出现的行列;

排序后去重,并统计总行数
sort file | uniq | wc

排序之后去除重复行,同时在行首位置输出该行重复的次数
sort testfile | uniq -c
1 friend
3 hello
2 world

仅显示存在重复的行,并在行首显示该行重复的次数
sort testfile | uniq -dc
3 hello
2 world

仅显示不重复的行
sort testfile | uniq -u
friend


文件内容查看

cat

cat命令连接文件并打印到标准输出设备上,cat经常用来显示文件的内容,类似于下的type命令。

注意:当文件较大时,文本在屏幕上迅速闪过(滚屏),用户往往看不清所显示的内容。因此,一般用more等命令分屏显示。为了控制滚屏,可以按Ctrl+S键,停止滚屏;按Ctrl+Q键可以恢复滚屏。按Ctrl+C(中断)键可以终止该命令的执行,并且返回Shell提示符状态。

cat m1 (在屏幕上显示文件ml的内容)
cat m1 m2 (同时显示文件ml和m2的内容)
cat m1 m2 > file (将文件ml和m2合并后放入文件file中)


cut

cut命令可以从一个文本文件或者文本流中提取文本列。

选项与参数:
-d, --delimiter=DELIM 后面接分隔字符。默认的字段分隔符为 TAB。与 -f 一起使用;
-f, --fields=LIST 依据 -d 的分隔字符将一段信息分割成为数段,用 -f 取出第几段的意思;
-c, --characters=LIST 以字符 (characters) 的单位取出固定字符区间;

特定分隔字符分隔列
cut -d'分隔字符' -f fields file

-f 字段范围记法:
N- 从第N个字节、字符、字段到结尾;
N-M 从第N个字节、字符、字段到第M个(包括M在内)字节、字符、字段;
-M 从第1个字节、字符、字段到第M个(包括M在内)字节、字符、字段。

示例文件如下,英文逗号分隔id,姓名,年龄

$ cat id_name_age.txt
2,张三,23
18,李四,18
25,王五,22
31,找六,14

提取第一列

cut -d ',' -f1 id_name_age.txt
2
18
25
31

提取第1,3列

cut -d ',' -f1,3 id_name_age.txt
2,23
18,18
25,22
31,14

path 变量如下,冒号:分隔

$ echo $PATH
/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/opt/aws/bin:/home/ec2-user/.local/bin:/home/ec2-user/bin

将 PATH 变量取出,我要找出第五个路径。

$ echo $PATH | cut -d':' -f 5
/usr/sbin

将 PATH 变量取出,我要找出第三和第五个路径。

$ echo $PATH | cut -d ':' -f3,5
/usr/bin:/usr/sbin

将 PATH 变量取出,我要找出第三到最后一个路径。

$ echo $PATH | cut -d':' -f3-
/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/opt/aws/bin:/home/ec2-user/.local/bin:/home/ec2-user/bin

将 PATH 变量取出,我要找出第一到第三,还有第五个路径。

$ echo $PATH | cut -d':' -f1-3,5
/usr/local/bin:/bin:/usr/bin:/usr/sbin

tail

tail 显示文件尾部的内容,默认显示尾部后10行

-n num:显示目标文件的后num行,而不是系统默认的后10行

-f:随着文件的增长,显示文件新追加的内容
使用tail命令的-f选项可以方便的查阅正在改变的日志文件,
例如
tail -f error.log

tailf
tailf命令打印文件最后10行内容,并且不断刷新
相当于 tail命令加参数-f,但当文件不动态增长时不输出内容

tailf与grep结合,只打印想看到的字符串,比如只关心服务器启动日志中的”Started”字符串,说明服务器起来了
tailf serverStart.log | grep Started


less

less命令的作用与more十分相似,都可以用来浏览文字档案的内容,不同的是less命令允许用户向前或向后浏览文件,而more命令只能向前浏览。
用less命令显示文件时,用PageUp键向上翻页,用PageDown键向下翻页。
要退出less程序,应按Q键。

b 向后翻页
空格 向前翻页

-N 每一行行首显示行号
-s:将连续多个空行压缩成一行显示;
-S:在单行显示较长的内容,而不换行显示;


文件处理

ln

ln命令用来为文件创件连接,连接类型分为硬连接和符号连接两种,默认的连接类型是硬连接。如果要创建符号连接必须使用”-s”选项。
连接有软连接和硬连接(hard link)之分的,软连接(symbolic link)又叫符号连接。符号连接相当于Windows下的快捷方式。

ln [-Ffhinsv] source_file [target_file]
ln [-Ffhinsv] source_file ... target_dir
link source_file target_file

-s或——symbolic:对源文件建立符号连接,即软连接,而非硬连接;
-f, –force 强行删除任何已存在的目标文件

当我们需要在不同的目录,用到相同的文件时,我们不需要在每一个需要的目录下都放一个必须相同的文件,我们只要在某个固定的目录,放上该文件,然后在 其它的目录下用ln命令链接(link)它就可以,不必重复的占用磁盘空间。
例如:ln –s /bin/less /usr/local/bin/less, -s 是代号(symbolic)的意思。
这里有两点要注意:
第一,ln命令会保持每一处链接文件的同步性,也就是说,不论你改动了哪一处,其它的文件都会发生相同的变化;
第二,ln的链接又分为软链接和硬链接两种,软链接就是ln –s source target,它只会在你选定的位置上生成一个文件的镜像,不会占用磁盘空间,硬链接ln ** **,没有参数-s, 它会在你选定的位置上生成一个和源文件大小相同的文件,无论是软链接还是硬链接,文件都保持同步变化。

I节点
:它是UNIX内部用于描述文件特性的数据结构.我们通常称I节点为文件索引结点(信息结点).i节点含有关于文件的大部分的重要信息,包括文件数据块在
磁盘上的地址.每一个I节点有它自己的标志号,我们称为文件顺序号.I节点包含的信息 1.文件类型 2.文件属主关系 3.文件的访问权限 4.文件的时间截.

关于 I节点的问题 。
硬连接不管有多少个,都指向的是同一个I节点,会把 结点连接数增加,只要结点的连接数不是0,文件就一直存在,不管你删除的是源文件还是 连接的文件 。只要有一个存在 ,文件就 存在 (其实也不分什么源文件连接文件的,因为他们指向都是同一个 I节点)。 当你修改源文件或者连接文件任何一个的时候,其他的文件都会做同步的修改。
软链接不直接使用i节点号作为文件指针,而是使用文件路径名作为指针。所以 删除连接文件对源文件无影响,但是删除源文件,连接文件就会找不到要指向的文件 。软链接有自己的inode,并在磁盘上有一小片空间存放路径名.


touch

touch命令有两个功能:一是用于把已存在文件的时间标签更新为系统当前的时间(默认方式),它们的数据将原封不动地保留下来;二是用来创建新的空文件。


dd

dd命令用于复制文件并对原文件的内容进行转换和格式化处理。
dd命令常用于磁盘备份

参数:
if=文件名:输入文件名,缺省为标准输入。即指定源文件。< if=input file >
of=文件名:输出文件名,缺省为标准输出。即指定目的文件。< of=output file >
ibs=bytes:一次读入bytes个字节,即指定一个块大小为bytes个字节。
obs=bytes:一次输出bytes个字节,即指定一个块大小为bytes个字节。
bs=bytes:同时设置读入/输出的块大小为bytes个字节。
cbs=bytes:一次转换bytes个字节,即指定转换缓冲区大小。
skip=blocks:从输入文件开头跳过blocks个块后再开始复制。
seek=blocks:从输出文件开头跳过blocks个块后再开始复制。
count=blocks:仅拷贝blocks个块,块大小等于ibs指定的字节数。
conv=conversion:用指定的参数转换文件。

块大小可以使用的计量单位表
字节(1B) c
字节(2B) w
块(512B) b
千字节(1024B) k
兆字节(1024KB) M
吉字节(1024MB) G

实例:
1、将本地的/dev/hdb整盘备份到/dev/hdd
dd if=/dev/hdb of=/dev/hdd

2、将/dev/hdb全盘数据备份到指定路径的image文件
dd if=/dev/hdb of=/root/image

3、将备份文件恢复到指定盘
dd if=/root/image of=/dev/hdb

4、备份磁盘开始的512个字节大小的MBR信息到指定文件
dd if=/dev/hda of=/root/image count=1 bs=512
count=1指仅拷贝一个块;bs=512指块大小为512个字节。

5、销毁磁盘数据
dd if=/dev/urandom of=/dev/hda1
注意:利用随机的数据填充硬盘,在某些必要的场合可以用来销毁数据。

5、增加swap分区文件大小
第一步:创建一个大小为256M的文件(块大小1024字节,拷贝262144个块):
dd if=/dev/zero of=/swapfile bs=1024 count=262144
第二步:把这个文件变成swap文件:
mkswap /swapfile
第三步:启用这个swap文件:
swapon /swapfile
第四步:编辑/etc/fstab文件,使在每次开机时自动加载swap文件:
/swapfile swap swap default 0 0

dd命令详解
https://blog.csdn.net/liumang_D/article/details/3899462


文件压缩与解压

tar

tar命令用来压缩或解压文件
http://www.cnblogs.com/li-hao/archive/2011/10/03/2198480.html
主选项:
c 创建新的档案文件。如果用户想备份一个目录或是一些文件,就要选择这个选项。相当于打包。
x 从档案文件中释放文件。相当于拆包。
辅助选项:
-z :是否同时具有 gzip 的属性?亦即是否需要用 gzip 压缩或解压? 一般格式为xx.tar.gz或xx. tgz
-j :是否同时具有 bzip2 的属性?亦即是否需要用 bzip2 压缩或解压?一般格式为xx.tar.bz2
-v :压缩的过程中显示文件!这个常用
-f :使用档名,请留意,在 f 之后要立即接档名喔!不要再加其他参数!
-p :使用原文件的原来属性(属性不会依据使用者而变)
-C 目录:这个选项用在解压缩,用-C参数指定解压到的目录

压缩tar -czvf
将当前目录下所有.txt文件打包并压缩归档到文件this.tar.gz,我们可以使用
tar -czvf this.tar.gz ./*.txt
解压tar -xzvf
将当前目录下的this.tar.gz中的文件解压到当前目录我们可以使用
tar -xzvf this.tar.gz ./
解压到指定目录-C
使用tar的-C dir参数可以做到将文件解压缩到其他指定目录,例如:
tar -xvf file2.tar -C /home/usr2
而tar不用-C dir参数时是无法做到的

不同后缀压缩文件的解压和压缩命令都不一样,总结如下:
1、.tar 用 tar –xvf 解压
2、.gz 用 gzip -d或者gunzip 解压
3、.tar.gz和.tgz 用 tar –xzf 解压
4、.bz2 用 bzip2 -d或者用bunzip2 解压
5、.tar.bz2用tar –xjf 解压
6、.Z 用 uncompress 解压
7、.tar.Z 用tar –xZf 解压
8、.rar 用 unrar e解压
9、.zip 用 unzip 解压


unzip

例如:将压缩文件text.zip在当前目录下解压缩
unzip text.zip

将压缩文件text.zip在指定目录/tmp下解压缩。
unzip text.zip -d /tmp


文件传输

sz,rz

用于windows到linux的上传下载

http://www.jb51.net/LINUXjishu/163820.html

涉及Linux到pc和pc到Linux这两个方向
先设定SecureCRT上传下载文件保存路径
options -> session -> Xmodem/Zmodem -> upload / download

rz,pc到linux
输入rz命令后会打开一个选择文件的对话框
单独用rz会有两个问题:上传中断、上传文件变化(md5不同),解决办法是上传时用rz -be,并且去掉弹出的对话框中“Upload files as ASCII”前的勾选

sz,linux到pc
会下载到预设的下载目录中
下载一个文件:sz filename
下载多个文件:sz filename1 filename2
下载目录dir下的所有文件(不包含dir下的文件夹):sz dir/*


scp

1、从服务器下载文件到本地
scp user@host/ip:/remote_path/filename ~/filename
/remote_path/filename 是远程文件名
~/filename 是本地文件名

使用密钥
scp -i ~/.ssh/id_rsa user@host/ip:/home/user/file.txt ~/local_destination

默认使用22端口,可用大写 -P 指定端口
scp -i ~/.ssh/id_rsa -P port username@host/ip:/home/user/file.txt ~

2、上传本地文件到服务器
scp ~/local_path/local_filename user@host/ip:/remote_path

使用秘钥
scp -i ~/.ssh/id_rsa filename user@host/ip:~

默认使用22端口,可用大写 -P 指定端口
scp -i ~/.ssh/id_rsa -P port filename user@host/ip:~

3、从服务器下载整个目录
scp -r username@host/ip:/remote_path/remote_dir/ ~/local_destination

4、上传目录到服务器
scp -r ~/local_dir username@host/ip:/remote_path/remote_dir


网络管理

网络测试

netstat

netstat命令的功能是显示网络连接、路由表和网络接口信息,可以让用户得知有哪些网络连接正在运作

使用时如果不带参数,netstat显示活动的 TCP 连接。
-a (all)显示所有选项,默认不显示LISTEN相关
-t (tcp)仅显示tcp相关选项
-u (udp)仅显示udp相关选项
-n 拒绝显示别名,能显示数字的全部转化成数字。
-l 仅列出有在 Listen (监听) 的服務状态

-p 显示建立相关链接的程序名
-r 显示路由信息,路由表
-e 显示扩展信息,例如uid等
-s 按各个协议进行统计
-c 每隔一个固定时间,执行该netstat命令。

常用:netstat -anp | grep xxx

从整体上看,netstat的输出结果可以分为两个部分:

  • 一个是Active Internet connections,称为有源TCP连接,
    Active Internet connections (w/o servers)
    Proto Recv-Q Send-Q Local Address Foreign Address State
    其中”Recv-Q”和”Send-Q”指%0A的是接收队列和发送队列。这些数字一般都应该是0。如果不是则表示软件包正在队列中堆积。这种情况只能在非常少的情况见到。
  • 另一个是Active UNIX domain sockets,称为有源Unix域套接口(和网络套接字一样,但是只能用于本机通信,性能可以提高一倍)。
    Active UNIX domain sockets (w/o servers)
    Proto RefCnt Flags Type State I-Node Path
    Proto显示连接使用的协议,RefCnt表示连接到本套接口上的进程号,Types显示套接口的类型,State显示套接口当前的状态,Path表示连接到套接口的其它进程使用的路径名。

查看某端口占用情况

可以用 netstat

$ sudo netstat -anp |grep :23
tcp        0      0 :::23                       :::*                        LISTEN      7328/xinetd

或者 lsof

$ sudo lsof -i:23
COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
xinetd  7328 root    5u  IPv6 524265      0t0  TCP *:telnet (LISTEN)

同时查多个端口,比如验证 邮件相关的 smtp 25端口 imap的 143 接口 和 pop3 的110 接口

$ sudo netstat -anp|egrep ':25|:110|:143'
tcp        0      0 0.0.0.0:110                 0.0.0.0:*                   LISTEN      28182/dovecot
tcp        0      0 0.0.0.0:143                 0.0.0.0:*                   LISTEN      28182/dovecot
tcp        0      0 0.0.0.0:25                  0.0.0.0:*                   LISTEN      4640/sendmail
tcp        0      0 :::110                      :::*                        LISTEN      28182/dovecot
tcp        0      0 :::143                      :::*                        LISTEN      28182/dovecot

traceroute

traceroute命令用于追踪数据包在网络上的传输时的全部路径,它默认发送的数据包大小是40字节。
traceroute通过发送小的数据包到目的设备直到其返回,来测量其需要多长时间。一条路径上的每个设备traceroute要测3次。输出结果中包括每次测试的时间(ms)和设备的名称(如有的话)及其ip地址。

traceroute IP或域名


dig

Dig是一个在类Unix命令行模式下查询DNS包括NS记录,A记录,MX记录等相关信息的工具。
dig默认的查询是查询A记录

常用:dig github.com +nocomments +noauthority +noadditional
精简:dig github.com +short

Dig HOWTO 中文手册–dig命令使用大全
http://www.cnblogs.com/daxian2012/archive/2013/01/10/2854126.html


ping

ping命令用来测试主机之间网络的连通性。
执行ping指令就是发送 ICMP ECHO_REQUEST 包给目标host,若远端主机的网络功能没有问题,就会返回 ICMP ECHO_RESPONSE 包给源主机,因而得知该主机运作正常。

1、ping 在应用层,但是直接使用网络层的ICMP协议,跳过了传输层。
2、ping 命令只能测试ip或域名通不通,不能ping端口,想测试端口通不通要用telnet
3、ping 的主机参数不能包含协议,比如 ping www.baidu.com 但不能 ping http://www.baidu.com,会显示 unknown host

tcpping

tcpping 工具工作在 TCP 层,通过发送伪造的 TCP SYN 包并侦听来自服务器或中间设备返回的 SYN/ACK 或 RST 。
代码100多行,源代码在此链接 http://www.vdberg.org/~richard/tcpping , tcpping需要调用 tcptraceroute , 打印与ping近乎相同测试结果,目前版本为V1.7
tcping的介绍参考链接 http://www.vdberg.org/~richard/tcpping.html , 这个是Richard van den Berg在2002年编写的,作者当时需要测量TCP往返时间。所以写了这个脚本。
tcpping只支持Linux。不支持Windows平台。

tcpping 安装
1、 tcpping 脚本依赖 tcptraceroute 组件,所以必须先安装 tcptraceroute
yum install tcptraceroute

2、 下载tcpping文件
wget http://www.vdberg.org/~richard/tcpping

3、将 tcpping 文件移动到 /usr/bin 下并授权。

# mv tcpping /usr/bin/
# cd /usr/bin
# chmod 755 tcpping

参数 参数描述
-d 在每个结果输出前打印时间戳
-c 将结果输出在一列
-C 输出与fping的-C选项相同的打印格式
-w Wait time in seconds (defaults to 3)
-r -r n:每n秒重复一次(默认为1)
-x 重复n次(默认为无限制)

几款 ping tcping 工具总结
https://www.cnblogs.com/jonnyan/p/9662791.html


网络配置

ifconfig

配置和显示Linux内核中网络接口的网络参数。ifconfig的配置时临时性的,在网卡重启或机器重启后配置会消失,若想配置永久生效,需修改网卡的配置文件。

ifconfig [网络设备] [参数]

  • -a,显示全部接口信息
  • up,启动指定网络设备/网卡。
  • down,关闭指定网络设备/网卡。

查询结果

eth0      Link encap:Ethernet  HWaddr 00:0C:29:92:DB:6A
          inet6 addr: fe80::20c:29ff:fe92:db6a/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:473 errors:0 dropped:0 overruns:0 frame:0
          TX packets:6 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:39260 (38.3 KiB)  TX bytes:468 (468.0 b)

lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:0 (0.0 b)  TX bytes:0 (0.0 b)

第一行:连接类型:Ethernet(以太网)HWaddr(硬件mac地址)
第二行:网卡的IP地址、子网、掩码
第三行:UP(代表网卡开启状态)RUNNING(代表网卡的网线被接上)MULTICAST(支持组播)MTU:1500(最大传输单元):1500字节
第四、五行:接收、发送数据包情况统计
第七行:接收、发送数据字节数统计信息。

eth0表示第一块网卡
lo是表示主机的回坏地址,这个一般是用来测试一个网络程序,但又不想让局域网或外网的用户能够查看,只能在此台主机上运行和查看所用的网络接口。比如把 httpd服务器的指定到回坏地址,在浏览器输入127.0.0.1就能看到你所架WEB网站了。

激活网卡eth0:ifconfig eth0 up


hostname

hostname命令用于显示和设置系统的主机名称。
环境变量 $HOSTNAME 也保存了当前的主机名。
在使用hostname命令设置主机名后,系统并不会永久保存新的主机名,重新启动机器之后还是原来的主机名。如果需要永久修改主机名,需要同时修改 /etc/hosts/etc/sysconfig/network 的相关内容。

hostname,显示当前主机名
hostname masi-dell,临时设置主机名为masi-dell


网络应用

curl

curl命令是一个利用URL规则在命令行下工作的文件传输工具。它支持文件的上传和下载,所以是综合传输工具,但按传统,习惯称curl为下载工具。作为一款强力工具,curl支持包括HTTP、HTTPS、ftp等众多协议,还支持POST、cookies、认证、从指定偏移处下载部分文件、用户代理字符串、限速、文件大小、进度条等特征。

如果系统没有curl可以使用 yum install curl 安装,也可以下载安装。

curl是利用URL语法在命令行方式下工作的开源文件传输工具

-X/--request <command> 指定什么命令
-H/--header <line> 自定义头信息传递给服务器
-d/--data <data> HTTP POST方式传送数据
-i/--include 输出时包括protocol头信息
-v/--verbose 输出更多信息
-L, --location 跟踪重定向 (H)

(1)curl请求示例:
GET 请求

curl -X GET \
  https://postman-echo.com/headers \
  -H 'Postman-Token: 498efa2b-4226-406f-aad3-4c9305e2e37b' \
  -H 'cache-control: no-cache' \
  -H 'my-sample-header: Lorem ipsum dolor sit amet'

POST请求

curl "http://test.apis.com/user/v1/users?app_id=1000&sign=33a130f9425063421cd9e7b6ed6050a5" \
-X POST \
-H 'Authorization: Bearer 2.0plV407kIBLsKUC1Ksuu9Dz6H5XO0it6SXmqqxpP4Ehw=' \
-H 'Content-Type: application/x-www-form-urlencoded' \
-H 'Postman-Token: 77f950d6-cb9e-4da8-a2b8-3aee0c1db608' \
-H 'cache-control: no-cache' \
-d 'mobile=15216719185&country_code=86&name=张三&source=register' -v

(2)多参数请求用引号包住
例如:
curl “http://192.168.25.169:8080/?hostname=CHN-YL-g-3WI&type=ccms&domain=rtmp://livertmp.wasu.cn&clientcount=50&bandwidth=30000"
curl命令将http请求的url截断了,只剩下第一个参数,即http://192.168.25.169:8080/?hostname=CHN-YL-g-3WI
解决:不同参数间的&前加转义字符\,或者将整个url用引号包住

curl 命令行工具的使用及命令参数说明
https://itbilu.com/linux/man/4yZ9qH_7X.html


wget

linux 中一个下载文件的工具。
在下载的过程中会显示进度条,包含(下载完成百分比,已经下载的字节,当前下载速度,剩余下载时间)

-O –output-document=FILE 把文档写到FILE文件中

使用wget下载单个文件
wget http://www.minjieren.com/wordpress-3.1-zh_CN.zip

使用wget -O下载并以不同的文件名保存
wget -O wordpress.zip http://www.minjieren.com/download.aspx?id=1080
wget默认会以最后一个符合”/”的后面的字符来命令,对于动态链接的下载通常文件名会不正确。

curl与wget的区别
wget是个专职的下载利器,简单,专一,极致;
而curl可以下载,但是长项不在于下载,而在于模拟提交web数据,POST/GET请求,调试网页,等等。
在下载上,也各有所长,wget可以递归,支持断点;而curl支持URL中加入变量,因此可以批量下载。
个人用途上,我经常用wget来下载文件,加 -c选项不怕断网;使用curl 来跟网站的API 交互,简便清晰。


telnet

telnet命令用于登录远程主机,对远程主机进行管理。telnet因为采用明文传送报文,安全性不好,很多Linux服务器都不开放telnet服务,而改用更安全的ssh方式了。
telnet IP 端口

使用telnet测试端口连通性
出现:
Connected to x.x.x.x.
Escape character is ‘^]’.
表示端口是通的,此时按Ctrl + ] 会呼出telnet的命令行,出来telnet命令好之后就可以执行telnet命令。
例如:
在服务器10.6.144.210上telnet数据库端口

$ telnet 10.6.143.244 5443
Trying 10.6.143.244...
Connected to 10.6.143.244.
Escape character is '^]'.
^CConnection closed by foreign host.

上面的结果是通的,不通的端口是如下返回:

$ telnet 10.6.143.244 1234
Trying 10.6.143.244...
telnet: connect to address 10.6.143.244: Connection refused

软件|工具|开发|打印

常用工具命令

man

获取帮助信息
方法一:命令 --help, 例如 rm --help
方法二:man 命令, 例如 man rm,给出详细的使用手册
方法三:info 命令, 例如 info rm

安装c函数库手册:
yum install man-pages

安装c++函数库手册:
yum insall libstdc++-docs


xargs

xargs 命令是给其他命令传递参数的一个过滤器,也是组合多个命令的一个工具。
它擅长将标准输入数据转换成命令行参数,xargs能够处理管道或者stdin并将其转换成特定命令的命令参数。
xargs也可以将单行或多行文本输入转换为其他格式,例如多行变单行,单行变多行。
xargs的默认命令是 echo ,空格是默认定界符。 这意味着通过管道传递给xargs的输入将会包含换行和空白,不过通过xargs的处理,换行和空白将被空格取代。xargs是构建单行命令的重要组件之一。

-i 参数默认的前面输出用 {} 代替
-I 指定其他替换字符串, 这个字符串在xargs扩展时会被替换掉
例如把find找到的所有文件拷贝到上层目录
find . -name "file" | xargs -I [] cp [] ..

查找当前目录及所有子目录中的java文件 拷贝到 new 子目录中
find . -type f -name "*.java" | xargs -I {} mv {} ./new

多行输入单行输出:
cat test.txt | xargs
其中test.txt是包含空格、tab、换行分割的多行文件

查出当前目录下所有空文件夹,并删除。使用管道连接rm命令,用xargs做入参处理
find . -type d -empty | xargs rm -r
find命令可以把匹配到的文件传递给 xargs 命令执行,在使用 find 命令的 -exec 选项处理匹配到的文件时,find将所有匹配到的文件一起传递给 exec 执行。由于有些系统对能够传递给 exec 的命令长度有限制,这样会引起溢出错误。这时可以使用 xargs 命令。

查找并删除当前目录及其子目录下的所有.DS_Store 文件:
find . -name '*.DS_Store' -type f -delete
find . -name '.DS_Store' | xargs rm -r

redis模糊匹配kyes并删除,在可远程连接redis的跳板机或本地机器上执行:
redis-cli -h redis-host keys "prefix-*" | xargs redis-cli -h redis-host del

强制删除所有名称包含 “feature-user” 的本地分支。
git branch |grep 'feature-user' |xargs git branch -D


md5sum

md5sum 命令采用MD5报文摘要算法(128位)计算和检查文件的校验和。一般来说,安装了Linux后,就会有md5sum这个工具,直接在命令行终端直接运行。

mac上直接 md5 命令即可

$ md5sum *.sql
de019b1e3b957cf81a404253dbc8e3f9  1.update_user.sql
36acdb26b9c2235657dcd0b0293b5a32  2.insert_user.sql

软件包管理

service

service命令是 RHEL/Centos 6.x及之前 发行版中用来控制系统服务的实用工具,它以启动、停止、重新启动和关闭系统服务,还可以显示所有系统服务的当前状态。
service 命令管理的服务都在 /etc/ini.d/ 目录下对应一个脚本,service命令中的服务名就是 /etc/ini.d/ 中的脚本名。

例如:
service httpd start 启动mysql服务
service httpd stop 停止mysql服务
service httpd restart 重启mysql服务
service httpd status 检查httpd服务状态

如何增加一个服务

1、服务脚本必须存放在 /etc/ini.d/ 目录下;
2、chkconfig --add servicename 在chkconfig工具服务列表中增加此服务,此时服务会被在/etc/rc.d/rcN.d中赋予K/S入口了;
3、chkconfig --level 35 mysqld on 修改服务的默认启动等级。


chkconfig

RHEL/Centos 6.x及之前版本中,使用 servicechkconfig 管理服务。
chkconfig 命令检查、设置系统的各种服务。它可查询操作系统在每一个执行等级中会执行哪些系统服务。

--list: 列出系统所有的服务启动情况
chkconfig --add name: 增加所指定的系统服务,让chkconfig指令得以管理它,并同时在系统启动的叙述文件内增加相关数据。 chkconfig确保每个运行级有一项启动(S)或者杀死(K)入口。如有缺少,则会从缺省的init脚本自动建立。
chkconfig --del name: 删除所指定的系统服务,不再由chkconfig指令管理,并同时在系统启动的叙述文件内删除相关数据。并把相关符号连接从 /etc/rc[0-6].d 删除
chkconfig [--level levels] name: 设置某一服务在指定的运行级是被启动,停止还是重置。指定读系统服务要在哪一个执行等级中开启或关毕。
等级代号列表:
等级0表示:表示关机
等级1表示:单用户模式
等级2表示:无网络连接的多用户命令行模式
等级3表示:有网络连接的多用户命令行模式
等级4表示:不可用
等级5表示:带图形界面的多用户模式
等级6表示:重新启动

chkconfig在没有参数运行时,显示用法。
如果加上服务名,那么就检查这个服务是否在当前运行级启动。如果是,返回true,否则返回false。
如果在服务名后面指定了on,off或者reset,那么chkconfig 会改变指定服务的启动信息。on和off分别指服务被启动和停止,reset指重置服务的启动信息,无论有问题的初始化脚本指定了什么。on和off开关,系统默认只对运行级3,4,5有效,但是reset可以对所有运行级有效。

例如:
chkconfig --list, 列出系统所有服务的开机启动情况。

$ chkconfig --list|egrep 'mysql|nginx'
mysqld             0:关闭    1:关闭    2:启用    3:启用    4:启用    5:启用    6:关闭
nginx              0:关闭    1:关闭    2:关闭    3:关闭    4:关闭    5:关闭    6:关闭

chkconfig mysqld on, 设定mysqld在各等级为开机启动
chkconfig --level 35 mysqld on, 设定mysqld在等级3和5为开机运行服务,--level 35表示操作只在等级3和5执行,on表示启动,off表示关闭。


systemctl

RHEL/Centos 7.x 开始使用 systemctl 代替 servicechkconfig 来管理服务, 区分 RHEL/CentOS 6.x和7.x就看系统里有没有 systemctl 命令即可
在 systemd 管理体系里,称呼需要管理的daemon为单元(unit)。对于单元(unit)的管理是通过命令 systemctl 来进行控制的。
systemctl 命令是系统服务管理器指令,它实际上将 service 和 chkconfig 这两个命令组合到一起。

systemctl --version 查看 systemd 版本

systemctl enable 设置开机启动

对于那些支持 Systemd 的软件,安装的时候,会自动在 /usr/lib/systemd/system 目录添加一个配置文件。
如果你想让该软件开机启动,就执行下面的命令(以httpd.service为例)。
sudo systemctl enable httpd
上面的命令相当于在 /etc/systemd/system 目录添加一个符号链接,指向 /usr/lib/systemd/system 里面的httpd.service文件。
这是因为开机时,Systemd只执行/etc/systemd/system目录里面的配置文件。这也意味着,如果把修改后的配置文件放在该目录,就可以达到覆盖原始配置的效果。

查看是否开机启动

systemctl list-unit-files, 结果中 左边是服务名称,右边是状态,enabled是开机启动,disabled是开机不启动

systemctl list-unit-files | grep enable, 查看所有开机启动的服务

systemctl list-unit-files | grep mysql, 查看mysql是否设置了开机启动

systemctl start 启动服务

设置开机启动以后,软件并不会立即启动,必须等到下一次开机。如果想现在就运行该软件,那么要执行systemctl start命令。
sudo systemctl start httpd

systemctl/service/chkconfig命令对比

daemon命令 systemctl命令 说明
service mysql start systemctl start mysql.service 启动服务
service nginx stop systemctl stop nginx.service 停止服务
service mysql restart systemctl restart mysql.service 重启服务
service httpd status systemctl status httpd.service 检查服务状态
chkconfig mysql on systemctl enable mysql.service 使某服务自动启动
chkconfig mysql off systemctl disable mysql.service 使某服务不自动启动
chkconfig –list systemctl list-units –type=service 显示所有已启动的服务

系统服务管理/usr/lib/systemd/

CentOS 7的服务systemctl脚本存放在:/usr/lib/systemd/,有系统(system)和用户(user)之分,
/usr/lib/systemd/system/
/usr/lib/systemd/user/

像需要开机不登陆就能运行的程序,存在系统服务,即:/usr/lib/systemd/system/ 目录下
每一个服务以.service结尾,一般会分为3部分:[Unit]、[Service]、[Install]

[Unit]
主要是对这个服务的说明,内容包括Description和After,Description用于描述服务,After用于描述服务类别
[Service]
是服务的关键,是服务的一些具体运行参数的设置,
Type=forking是后台运行的形式,
PIDFile为存放PID的文件路径,
ExecStart为服务的具体运行命令,
ExecReload为重启命令,
ExecStop为停止命令,
PrivateTmp=True表示给服务分配独立的临时空间
注意:[Service]部分的启动、重启、停止命令全部要求使用绝对路径,使用相对路径则会报错!

Restart字段:定义了 sshd 退出后,Systemd 的重启方式。
Restart字段可以设置的值如下:
no(默认值):退出后不会重启
on-success:只有正常退出时(退出状态码为0),才会重启
on-failure:非正常退出时(退出状态码非0),包括被信号终止和超时,才会重启
on-abnormal:只有被信号终止和超时,才会重启
on-abort:只有在收到没有捕捉到的信号终止时,才会重启
on-watchdog:超时退出,才会重启
always:不管是什么退出原因,总是重启

[Install]
是服务安装的相关设置,可设置为多用户的

服务脚本按照上面编写完成后,以754的权限保存在/usr/lib/systemd/system/目录下,这时就可以利用systemctl进行配置

例如 mysqld.service 文件内容为:

[root@ecs-t5 system]# cat mysqld.service
#
# Simple MySQL systemd service file
#
# systemd supports lots of fancy features, look here (and linked docs) for a full list:
#   http://www.freedesktop.org/software/systemd/man/systemd.exec.html
#
# Note: this file ( /usr/lib/systemd/system/mysql.service )
# will be overwritten on package upgrade, please copy the file to
#
#  /etc/systemd/system/mysql.service
#
# to make needed changes.
#
# systemd-delta can be used to check differences between the two mysql.service files.
#

[Unit]
Description=MySQL Community Server
After=network.target
After=syslog.target

[Install]
WantedBy=multi-user.target
Alias=mysql.service

[Service]
User=mysql
Group=mysql

# Execute pre and post scripts as root
PermissionsStartOnly=true

# Needed to create system tables etc.
ExecStartPre=/usr/bin/mysql-systemd-start pre

# Start main service
ExecStart=/usr/bin/mysqld_safe --basedir=/usr

# Don't signal startup success before a ping works
ExecStartPost=/usr/bin/mysql-systemd-start post

# Give up if ping don't get an answer
TimeoutSec=600

Restart=always
PrivateTmp=false

nginx.service 的内容为:

[Unit]
Description=The nginx HTTP and reverse proxy server
After=network.target remote-fs.target nss-lookup.target

[Service]
Type=forking
PIDFile=/run/nginx.pid
# Nginx will fail to start if /run/nginx.pid already exists but has the wrong
# SELinux context. This might happen when running `nginx -t` from the cmdline.
# https://bugzilla.redhat.com/show_bug.cgi?id=1268621
ExecStartPre=/usr/bin/rm -f /run/nginx.pid
ExecStartPre=/usr/sbin/nginx -t
ExecStart=/usr/sbin/nginx
ExecReload=/bin/kill -s HUP $MAINPID
KillSignal=SIGQUIT
TimeoutStopSec=5
KillMode=process
PrivateTmp=true

[Install]
WantedBy=multi-user.target

我们的一个service示例:

[Unit]
Description=user
After=network.target

[Service]
Type=forking
PIDFile=/data/app/masikkk/user.pid
EnvironmentFile=/data/app/masikkk/conf/service_env
ExecStart=/data/app/masikkk/bin/start.sh test
ExecStop=/data/app/masikkk/bin/stop.sh
PrivateTmp=false
TimeoutStartSec=500
Restart=always
RestartSec=10

[Install]
WantedBy=multi-user.target

Systemd 入门教程:实战篇
http://www.ruanyifeng.com/blog/2016/03/systemd-tutorial-part-two.html

systemctl 命令完全指南
https://linux.cn/article-5926-1.html


alternatives

系统中同一个命令有多个实现版本时, 可以使用 alternatives 命令设置默认选择。只能在root权限下执行。
alternatives常用于同一个系统中安装同一软件的多个版本。比如为了开发需要,我需要安装JDK1.4.2,同时还需要JDK1.6.10,我怎么样才能忽略安装路径,按照我自己的意思,使用我想要的java版本呢?

$ alternatives --help
usage: alternatives --install <link> <name> <path> <priority>
  [--initscript <service>]
  [--slave <link> <name> <path>]*
  alternatives --remove <name> <path>
  alternatives --auto <name>
  alternatives --config <name>
  alternatives --display <name>
  alternatives --set <name> <path>

common options: --verbose --test --help --usage --version
  --altdir <directory> --admindir <directory>

alternatives --install <link> <name> <path> <priority> 添加候选项
其中,
install表示安装
link是符号链接
name则是标识符
path是执行文件的路径
priority则表示优先级
例如向系统添加一个新安装的java命令版本 alternatives --install /usr/bin/java java /tools/jdk/bin/java 3

设置默认java版本
比如系统中同时装了 java5 和 java7

$ alternatives --config java
There are 2 programs which provide 'java'.

  Selection Command
-----------------------------------------------
*+ 1 /usr/lib/jvm/jre-1.7.0-icedtea/bin/java
  2 /usr/lib/jvm/jre-1.5.0-gcj/bin/java

Enter to keep the current selection[+], or type selection number:

当前默认 java 命令由序号为1的java7提供,如果想改为java5,根据提示按2即可。

设置默认邮件发送MTA
设置系统默认mta为postfix

alternatives --config mta
There are 2 programs which provide 'mta'.

 Selection    Command
-----------------------------------------------
+ 1           /usr/sbin/sendmail.postfix
*  2           /usr/sbin/sendmail.sendmail

Enter to keep the current selection[+], or type selection number: 1

输入1后回车即把MTA功能切换到postfix上,+号会显示在sendmail的行头。


rpm

http://www.cnblogs.com/xiaochaohuashengmi/archive/2011/10/08/2203153.html

-v:输出详细信息

安装rpm -i

rpm -i 需要安装的包文件名
例如:安装example.rpm包:
$rpm -i example.rpm

查询rpm -qa

rpm -q …
附加查询命令:
a 查询所有已经安装的包

例如查看已安装sms的版本
rpm -q sms

例如:查看 tomcat4 是否被安装:
rpm -qa | grep tomcat4

例如:查看 example.rpm 安装包的信息:
rpm -qip example.rpm

例如:查询一个已经安装的文件属于哪个软件包;
rpm -qf /usr/lib/libacl.la

升级rpm -U

rpm -U …
比如已安装sms-1.1.24-0.x86_64.rpm
想升级到sms-1.1.25-0.x86_64.rpm
rpm -U sms-1.1.25-0.x86_64.rpm

卸载rpm -e

rpm -e 需要卸载的安装包
例如:卸载 tomcat4 软件包
$rpm -e tomcat4

在卸载之前,通常需要使用rpm -q …命令查出需要卸载的安装包名称
例如安装rpm -i nginx-1.0.0-0.x86_64.rpm
之后通过rpm -e nginx-1.0.0-0.x86_64.rpm卸载会提示:
error: package nginx-1.0.0-0.x86_64.rpm is not installed
因为此安装包安装之后的名字并不是nginx-1.0.0-0.x86_64.rpm,所以我们查询一下
rpm -qa | grep nginx
结果为:nginx-1.0.0-0.x86_64
然后rpm -e nginx-1.0.0-0.x86_64就可以成功卸载了

在Linux操作系统下,几乎所有的软件均通过RPM进行安装、卸载及管理等操作。RPM 的全称为Redhat Package Manager ,是由Redhat公司提出的,用于管理Linux下软件包的软件。


yum

yum(全称为 Yellow dog Updater, Modified)是一个在Fedora和RedHat以及SUSE中的Shell前端软件包管理器。
yum基於RPM包管理,能够从指定的服务器自动下载RPM包并且安装,可以自动处理依赖性关系,并且一次安装所有依赖的软体包,无须繁琐地一次次下载、安装。yum提供了查找、安装、删除某一个、一组甚至全部软件包的命令,而且命令简洁而又好记。
yum的关键之处是要有可靠的repository,顾名思义,这是软件的仓库,它可以是http或ftp站点, 也可以是本地软件池,但必须包含rpm的header, header包括了rpm包的各种信息,包括描述,功能,提供的文件,依赖性等.正是收集了这些 header并加以分析,才能自动化地完成余下的任务。

yum [options] [command] [package ...]
其中的[options]是可选的,选项包括-h(帮助)等。[command]为所要进行的操作,[package …]是操作的对象。
-y:当安装过程提示选择全部为”yes”
-q:不显示安装的过程
-x [package], –exclude=[package] 采用全名或通配符排除软件包

yum repolist 列出所有可用的源(repo)

yum repolist
通过查看 /etc/yum.repos.d/ 目录,也可以看当前的yum源
ls /etc/yum.repos.d/

repo文件是Fedora中yum源(软件仓库)的配置文件,通常一个repo文件定义了一个或者多个软件仓库的细节内容,例如我们将从哪里下载需要安装或者升级的软件包,repo文件中的设置内容将被yum读取和应用!

yum list available 查看是否按照了某个repo

yum list available | grep extras 查看是否按照了某个repo

rpm -qa 查询是否安装了某个yum源

rpm -qa |grep -i repo-name

rpm -Uvh 在线命令安装yum源

可以通过 rpm 命令,指定源链接在线安装,
注意对应的linux版本,如果版本不对可能安装失败。
比如安装nginx源,RHEL/CentOS 7.x 版本中

sudo rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm

又比如安装mysql源
RHEL/CentOS 7.x 版本中

sudo rpm -Uvh http://dev.mysql.com/get/mysql80-community-release-el7-1.noarch.rpm

RHEL/CentOS 6.x 版本中

sudo rpm -Uvh https://dev.mysql.com/get/mysql80-community-release-el6-3.noarch.rpm

手动创建yum源文件

还可以直接创建 /etc/yum.repos.d/xxx.repo 文件,写入软件信息即可。
比如nginx官方给的方式,直接创建 /etc/yum.repos.d/nginx.repo 文本文件

[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key

[nginx-mainline]
name=nginx mainline repo
baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/
gpgcheck=1
enabled=0
gpgkey=https://nginx.org/keys/nginx_signing.key

http://nginx.org/en/linux_packages.html#RHEL-CentOS

或者直接 wget 把repo文件下载到 /etc/yum.repos.d/ 目录中,比如安装 maven yum repo
wget http://repos.fedorapeople.org/repos/dchen/apache-maven/epel-apache-maven.repo -O /etc/yum.repos.d/epel-apache-maven.repo

通过yum-config-manager安装yum源

先安装 yum-config-manager
sudo yum update && yum install -y yum-utils
通过 yum-config-manager 安装 docker 源
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

通过 yum-config-manager 安装 maven 源

$ sudo yum-config-manager --add-repo http://repos.fedorapeople.org/repos/dchen/apache-maven/epel-apache-maven.repo
已加载插件:fastestmirror
adding repo from: http://repos.fedorapeople.org/repos/dchen/apache-maven/epel-apache-maven.repo
grabbing file http://repos.fedorapeople.org/repos/dchen/apache-maven/epel-apache-maven.repo to /etc/yum.repos.d/epel-apache-maven.repo
repo saved to /etc/yum.repos.d/epel-apache-maven.repo

rpm -e 删除yum源(及缓存)

rpm -qa|grep 查找yum源的具体名称
rpm -e repo-name 删除yum源

1、例如删除remi源

$ rpm -qa|grep remi
remi-release-6.10-1.el6.remi.noarch
$ sudo rpm -e remi-release-6.10-1.el6.remi.noarch

2、例如在 centos 6.x系统上错误安装了 7.x的mysql源后删除

$ rpm -qa|grep mysql
mysql80-community-release-el7-1.noarch
$ sudo rpm -e mysql80-community-release-el7-1.noarch
警告:/etc/yum.repos.d/mysql-community.repo 已另存为 /etc/yum.repos.d/mysql-community.repo.rpmsave

安装的 yum源都在 /etc/yum.repos.d/ 目录中,直接进入能看到,删除后的yum源会被标为 repo.rpmsave 结尾的文件

删除yum缓存

删除yum repo缓存
一开始我删除7.x的repo后马上安装6.x的repo,结果安装的mysql版本还是7.x的,原来是yum repo有缓存,需要手动删除repo缓存,否则还会读取缓存中的7.x repo

$ cd /var/cache/yum/x86_64/latest/
$ ls
amzn-main  amzn-updates  mysql56-community  mysql-connectors-community  mysql-tools-community  nodesource  timedhosts
$ sudo rm -rf mysql*

或者

yum clean headers  #清理/var/cache/yum的headers
yum clean packages #清理/var/cache/yum下的软件包
yum clean metadata

yum search 查询想安装的软件

yum search keyword

yum install 安装

yum install package1 安装指定的安装包package1

yum update 更新和升级

yum update package1 更新指定程序包package1

yum list 查找和显示

yum info package1 显示安装包信息package1
yum list package1 显示指定程序包安装情况package1
yum list installed 列出所有已安装的软件包
yum list updates 列出所有可更新的软件包

yum clean 清理

yum clean packages 清除暂存中的rpm包文件

yum remove 删除

yum remove package1 删除程序包package1,同时会提示与之有依赖关系的包

yum安装软件日志

tail /var/log/yum.log
查看yum使用的历史记录的方法:
yum history info


上一篇 SoapUI使用笔记

下一篇 pgAdmin使用笔记

阅读
评论
32,253
阅读预计130分钟
创建日期 2015-11-03
修改日期 2020-06-27
类别
目录
  1. 硬件|监测|内核|Shell
    1. 性能监测与优化
      1. top
      2. free
      3. lsof
      4. vmstat
      5. lscpu
      6. time
      7. strace
    2. Shell内建命令
      1. env
      2. set
        1. set -e 失败立即结束
        2. set -x 打印出命令本身
        3. set -u 遇到未定义变量时报错
      3. unset
      4. declare
      5. export
      6. readonly
      7. echo
      8. source
      9. alias
      10. history
      11. kill
      12. ulimit
    3. 内核与模块管理
      1. sysctl
      2. uname
        1. 查看Linux系统版本
    4. 文件系统管理
      1. swapon
      2. swapoff
    5. 磁盘管理
      1. mkswap
        1. 添加交换分区
        2. 添加交换文件
        3. 删除交换文件
      2. fdisk
      3. du
      4. df
      5. lsblk
  2. 系统管理
    1. 用户和工作组管理
      1. su
      2. id
      3. useradd
      4. userdel
      5. passwd 修改口令
      6. usermod
        1. This account is currently not available
      7. last
      8. chsh
    2. 进程和作业管理
      1. ps
      2. pgrep
      3. pmap
      4. nohup
        1. nohup和&
    3. 文件系统管理
      1. mount
      2. unmount
  3. 文件目录管理
    1. 目录基本操作
      1. cd
      2. pwd
      3. cp
      4. mv
      5. rm
      6. mkdir
      7. ls
    2. 文件权限属性设置
      1. stat
      2. chmod
      3. chown
      4. chgrp
    3. 文件查找和比较
      1. find
      2. whereis
      3. which
      4. diff
    4. 文件编辑
      1. sed
        1. s命令替换
          1. sed -i直接编辑文件
          2. 全面替换标记/g
          3. 任意定界符
          4. &匹配查找到的串
        2. sed -n x,yp filename 逗号选定行范围
        3. d命令删除
    5. 文件过滤分割与合并
      1. grep
        1. 在多个文件中查找
        2. 从文件末尾搜索
        3. 搜索含空格的字符串
        4. 或操作
        5. 与操作
        6. grep -A -B -C
      2. egrep
      3. wc
      4. tr
      5. sort
      6. uniq
    6. 文件内容查看
      1. cat
      2. cut
      3. tail
      4. less
    7. 文件处理
      1. ln
      2. touch
      3. dd
    8. 文件压缩与解压
      1. tar
      2. unzip
    9. 文件传输
      1. sz,rz
      2. scp
  4. 网络管理
    1. 网络测试
      1. netstat
        1. 查看某端口占用情况
      2. traceroute
      3. dig
      4. ping
      5. tcpping
    2. 网络配置
      1. ifconfig
      2. hostname
    3. 网络应用
      1. curl
      2. wget
      3. telnet
  5. 软件|工具|开发|打印
    1. 常用工具命令
      1. man
      2. xargs
      3. md5sum
    2. 软件包管理
      1. service
        1. 如何增加一个服务
      2. chkconfig
      3. systemctl
        1. systemctl enable 设置开机启动
        2. 查看是否开机启动
        3. systemctl start 启动服务
        4. systemctl/service/chkconfig命令对比
        5. 系统服务管理/usr/lib/systemd/
      4. alternatives
      5. rpm
        1. 安装rpm -i
        2. 查询rpm -qa
        3. 升级rpm -U
        4. 卸载rpm -e
      6. yum
        1. yum repolist 列出所有可用的源(repo)
        2. yum list available 查看是否按照了某个repo
        3. rpm -qa 查询是否安装了某个yum源
        4. rpm -Uvh 在线命令安装yum源
        5. 手动创建yum源文件
        6. 通过yum-config-manager安装yum源
        7. rpm -e 删除yum源(及缓存)
        8. 删除yum缓存
        9. yum search 查询想安装的软件
        10. yum install 安装
        11. yum update 更新和升级
        12. yum list 查找和显示
        13. yum clean 清理
        14. yum remove 删除
        15. yum安装软件日志

页面信息

location:
protocol:
host:
hostname:
origin:
pathname:
href:
document:
referrer:
navigator:
platform:
userAgent:

评论