11 监视系统资源
这些任务包括跟踪计算机中正在运行的程序(ps和top)、终止出错的进程(kill)、列
出所有打开的文件(lsof)、报告系统内存的占用情况(free)和磁盘空间的占用情况(df和du)
11.1 查看当前正在运行的所有进程
ps aux
STAT列用不同的字母表示进程的状态,最重要的一些状态如表
STAT 字母 含 义
R 运行(running)
S 休眠(sleeping)
T 停止(stopped)
Z 僵尸①(zombie)
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.0 1340 440 ? S Nov05 0:04 init
root 2 0.0 0.0 0 0 ? SW Nov05 0:00 [keventd]
root 3 0.0 0.0 0 0 ? SW Nov05 0:00 [keventd]
...
------------------------------------------------------
USER域指明了是哪个用户启动了这个命令;
用户可以查看某个进程占用了多少CPU;
内存使用及其VSZ(虚拟内存大小)和RSS(常驻集大小):
VSZ表示如果一个程序完全驻留在内存的话需要占用多少内存空间;
RSS指明了当前实际占用了多少内存;
STAT显示了进程当前的状态:
"S":进程处在睡眠状态,表明这些进程在等待某些事件发生--可能是用户输入或者系统资源的可用性;
last命令可以有效的查看系统登录事件
在一个进程调用了exit之后,该进程并非马上就消失掉,而是留下一个称为僵尸进程(Zombie)的数据结构。在Linux进程的5种状态中,僵尸进程是非常特殊的一种,它已经放弃了几乎所有内存空间,没有任何可执行代码,也不能被调度,仅仅在进程列表中保留一个位置,记载该进程的退出状态等信息供其他进程收集,除此之外,僵尸进程不再占有任何内存空间。
系统调用exit的作用是使进程退出,但也仅仅限于将一个正常的进程变成一个僵尸进程,并不能将其完全销毁。
进程一旦调用了wait,就立即阻塞自己,由wait自动分析是否当前进程的某个子进程已经退出,如果让它找到了这样一个已经变成僵尸的子进程,wait 就会收集这个子进程的信息,并把它彻底销毁后返回;如果没有找到这样一个子进程,wait就会一直阻塞在这里,直到有一个出现为止。
运行 ps aux 的到如下信息:
ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
smmsp 3521 0.0 0.7 6556 1616 ? Ss 20:40 0:00 sendmail: Queue runner@01:00:00 f
root 3532 0.0 0.2 2428 452 ? Ss 20:40 0:00 gpm -m /dev/input/mice -t imps2
htt 3563 0.0 0.0 2956 196 ? Ss 20:41 0:00 /usr/sbin/htt -retryonerror 0
htt 3564 0.0 1.7 29460 3704 ? Sl 20:41 0:00 htt_server -nodaemon
root 3574 0.0 0.4 5236 992 ? Ss 20:41 0:00 crond
xfs 3617 0.0 1.3 13572 2804 ? Ss 20:41 0:00 xfs -droppriv -daemon
root 3627 0.0 0.2 3448 552 ? SNs 20:41 0:00 anacron -s
root 3636 0.0 0.1 2304 420 ? Ss 20:41 0:00 /usr/sbin/atd
dbus 3655 0.0 0.5 13840 1084 ? Ssl 20:41 0:00 dbus-daemon-1 --system
....................................
ps命令能提供很多信息,包括进程的拥有者、唯一的进程ID编号
① tty通常用于指各种类型的终端设备。——译者注
12.1 查看当前正在运行的所有进程 213
(PID,用于标识进程)、进程正在使用的CPU百分比(%CPU)和内存
百分比(%MEM)、进程的当前状态(STAT)及进程的名称。
stat 中的参数意义如下:
D 不可中断 Uninterruptible(usually IO)
R 正在运行,或在队列中的进程
S 处于休眠状态
T 停止或被追踪
Z 僵尸进程
W 进入内存交换(从内核2.6开始无效)
X 死掉的进程
< 高优先级
n 低优先级
s 包含子进程
+ 位于后台的进程组
11.2 ps命令
要对进程进行监测和控制,首先必须要了解当前进程的情况,也就是需要查看当前进程,而ps命令就是最基本同时也是非常强大的进程查看命令.使用该命令可以确定有哪些进程正在运行和运行的状态、进程是否结束、进程有没有僵尸、哪些进程占用了过多的资源等等.总之大部分信息都是可以通过执行该命令得到的.
ps命令最常用的还是用于监控后台进程的工作情况,因为后台进程是不和屏幕键盘这些标准输入/输出设备进行通信的,所以如果需要检测其情况,便可以使用ps命令了.
1)ps a 显示现行终端机下的所有程序,包括其他用户的程序。
2)ps -A 显示所有程序。
3)ps c 列出程序时,显示每个程序真正的指令名称,而不包含路径,参数或常驻服务的标示。
4)ps -e 此参数的效果和指定"A"参数相同。
5)ps e 列出程序时,显示每个程序所使用的环境变量。
6)ps f 用ASCII字符显示树状结构,表达程序间的相互关系。
7)ps -H 显示树状结构,表示程序间的相互关系。
8)ps -N 显示所有的程序,除了执行ps指令终端机下的程序之外。
9)ps s 采用程序信号的格式显示程序状况。
10)ps S 列出程序时,包括已中断的子程序资料。
11)ps -t<终端机编号> 指定终端机编号,并列出属于该终端机的程序的状况。
12)ps u 以用户为主的格式来显示程序状况。
13)ps x 显示所有程序,不以终端机来区分。
最常用的方法是ps -aux,然后再利用一个管道符号导向到grep去查找特定的进程,然后再对特定的进程进行操作。
将ps aux的输出通过管道传递给grep,这是一种对特定命令的结果进行限制的简单方法
11.3 查找特定进程 ps aux | grep firefox
[root@localhost home]# ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.1 127928 6552 ? Ss Jan13 0:01 /usr/lib/systemd/systemd --switched-
root 2 0.0 0.0 0 0 ? S Jan13 0:00 [kthreadd]
root 4 0.0 0.0 0 0 ? S< Jan13 0:00 [kworker/0:0H]
USER:启动该进程的用户账号名称
PID:该进程的ID号,在当前系统中是唯一的
TTY:该进程在哪个终端上运行。“?”表未知或不需要终端
STAT:显示了进程当前的状态,如S(休眠)、R(运行)、Z(僵死)、<(高优先级)、N(低优先级)、s(父进程)、+(前台进程)。对处于僵死状态的进程应予以手动终止。
START:启动该进程的时间
TIME:该进程占用CPU时间
COMMAND:启动该进程的命令的名称
%CPU:CPU占用的百分比
%MEM:内存占用的百分比
VSZ:占用虚拟内存(swap空间)的大小
RSS:占用常驻内存(物理内存)的大小
11.4查看进程树
ps axjf
[root@localhost home]# ps axjf
PPID PID PGID SID TTY TPGID STAT UID TIME COMMAND
0 2 0 0 ? -1 S 0 0:00 [kthreadd]
2 4 0 0 ? -1 S< 0 0:00 \_ [kworker/0:0H]
2 5 0 0 ? -1 S 0 0:00 \_ [kworker/u256:0]
2 6 0 0 ? -1 S 0 0:00 \_ [ksoftirqd/0]
2 7 0 0 ? -1 S 0 0:00 \_ [migration/0]
2 8 0 0 ? -1 S 0 0:00 \_ [rcu_bh]
2 9 0 0 ? -1 S 0 0:00 \_ [rcu_sched]
2 10 0 0 ? -1 S< 0 0:00 \_ [lru-add-drain]
2 11 0 0 ? -1 S 0 0:00 \_ [watchdog/0]
2 12 0 0 ? -1 S 0 0:00 \_ [watchdog/1]
2 13 0 0 ? -1 S 0 0:00 \_ [migration/1]
2 14 0 0 ? -1 S 0 0:00 \_ [ksoftirqd/1]
2 16 0 0 ? -1 S< 0 0:00 \_ [kworker/1:0H]
2 17 0 0 ? -1 S 0 0:00 \_ [watchdog/2]
ps axjf命令引入了一个重要的新列:PPID。PPID(Parent
Process ID,父进程ID编号)是创建PID进程的进程的PID编号。有了
PID或PPID,就能够终止任何失控(runaway)的进程,
查看特定用户拥有的进程
ps U [username] 一定要大写
For more details see ps(1).
[root@localhost ~]# ps U root
PID TTY STAT TIME COMMAND
1 ? Ss 0:01 /usr/lib/systemd/systemd --switched-root --system --deserialize 22
2 ? S 0:00 [kthreadd]
4 ? S< 0:00 [kworker/0:0H]
6 ? S 0:00 [ksoftirqd/0]
7 ? S 0:00 [migration/0]
8 ? S 0:00 [rcu_bh]
9 ? S 0:00 [rcu_sched]
11.5 终止正在运行的进程
kill
信号编号 信号单词 含 义
-1 -HUP (hang up,
挂起)
控制进程已经死了,关闭进程(如果用于系统
服务,会导致重新加载配置文件并重启)
-15 -TERM 正常中止进程,清除将要失控的进程和文件
-9 -KILL 停止任何正在进行的处理,马上关闭
kill命令默认使用TERM信号
kill pid
查看正在运行的进程的动态更新列表
11.6 top 实时更新进程
可以使用ps命令,美中不足的是ps不能自己更新信息。其实ps命令提供的只是系统进程的快照而已。
另一方面,top命令提供的则是进程的动态更新的视图,展示系统中正在运行着什么进程,以及每个进程正在使用多少系统资源。
[root@localhost ~]# top
top - 21:56:25 up 2:08, 2 users, load average: 0.00, 0.01, 0.02
Tasks: 121 total, 1 running, 120 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.0 us, 0.1 sy, 0.0 ni, 99.9 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 3861348 total, 3529008 free, 197224 used, 135116 buff/cache
KiB Swap: 1048572 total, 1048572 free, 0 used. 3470536 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1 root 20 0 127928 6564 4156 S 0.0 0.2 0:01.56 systemd
2 root 20 0 0 0 0 S 0.0 0.0 0:00.01 kthreadd
4 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kworker/0:0H
6 root 20 0 0 0 0 S 0.0 0.0 0:00.01 ksoftirqd/0
top命令输出的前5行显示了大量的系统信息,之后则逐行列出每
个正在运行的进程。注意,top命令会自动根据%CPU列的数值对输出
进行排序,所以当程序占用的处理器资源变得更多或更少时,它们在
top命令列表中的位置也会发生相应变化。
如果想在top命令中关闭程序,只需按k键。这时在列表上方(在
以Swap:开始的那一行的后面),会看到以下内容:
PID to kill:
输入想关闭进程的PID(假设为8026),按Enter键,命令会询问
要使用什么信号编号(12.4节中讨论过这一问题):
Kill PID 8026 with signal [15]:
按q键;退出top命令。
11.7 列出打开的文件
lsof
[root@localhost ~]# lsof
-bash: lsof: command not found
yum install lsof
lsof | less 分页显示
退出 按q
列出某个用户打开的文件
lsof -u root
列出正在使用特定文件的用户
lsof [file]
让我们来看看谁正在使用SSH守护进程
(daemon),远程连接到这台计算机的用户会使用该进程(记住,必须
以root用户来运行lsof)。
lsof -c [program]
任何特定的程序实际上都是由几个(或
很多)对其他进程、程序、套接字和设备的调用组成的
为了找出与正在运行中的特
定程序关联的所有其他文件,可以在lsof命令后面加上-c选项,然
[root@localhost /]# lsof -c netns
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
netns 29 root cwd DIR 253,0 241 64 /
netns 29 root rtd DIR 253,0 241 64 /
netns 29 root txt unknown /proc/29/exe
11.8 显示系统 RAM 的信息
free
[root@localhost /]# free
total used free shared buff/cache available
Mem: 3861348 198016 3405236 11812 258096 3434376
Swap: 1048572 0 1048572
常用参数:
-b 以Byte显示内存使用情况
-k 以kb为单位显示内存使用情况
-m 以mb为单位显示内存使用情况
-g 以gb为单位显示内存使用情况
-s 持续显示内存
-t 显示内存使用总合
free -h -s 10 # 使用 -s 选项定时刷新内存的使用情况,单位为秒。
[root@localhost /]# free -h
total used free shared buff/cache available
Mem: 3.7G 193M 3.2G 11M 252M 3.3G
Swap: 1.0G 0B 1.0G
free命令的介绍及参数的详细分析
第一行 total: 物理内存总量total=used + free
used: 已使用的内存总量,包含应用使用量 + buffer + cached
free: 空闲内存总量
shared 共享内存总量
buffers: 块设备所占用的缓存
cached: 普通文件数据所占用的缓存
available:(本博客中在centOS 7中有显示)当前可用的内存总量(可用于分配给应用的,不包含虚拟内存
*显示中第二行-/+ buffers/cache各标题的说明:
used:已使用内存(used)减去buffer和cached之后的内存,也就是应用正在使用的内存总量(应用使用内存的大小)
free: 空闲内存加上buffer和cached之后的内存,也就是真正的可用内存总量(除了应用使用的内存,剩下的内存)
第二行
* 显示中第三行swap各标题的说明:
total: 交换分区内存总量
used: 正在使用的交换分区内存
free: 空闲交换分区内存
虽然知道了关于free的各项参数及各选项的意义,但是,什么情况下才能知道内存不够用了呢?
所有上面的这些指标中,当出现以下情况,系统是正常的,不需要担心:
* 空闲内存free接近0
* 已使用内存used接近于total
* 可用内存(free+buffers/cache)占total的20%以上
* 交换分区内存swap没有发生改变
下面情况说明内存过低,需要注意!
* 可用内存(free+buffers/cache)过低,接近于0的时候
* 交换分区内存占用swap used增加或者有波动
* dmesg | grep oom-killer显示有OutofMemory-killer正在运行
buff/cache
先来提一个问题: buffer 和 cache 应该是两种类型的内存,但是 free 命令为什么会把它们放在一起呢?要回答这个问题需要我们做些准备工作。让我们先来搞清楚 buffer 与 cache 的含义。
buffer 在操作系统中指 buffer cache, 中文一般翻译为 "缓冲区"。要理解缓冲区,必须明确另外两个概念:"扇区" 和 "块"。扇区是设备的最小寻址单元,也叫 "硬扇区" 或 "设备块"。块是操作系统中文件系统的最小寻址单元,也叫 "文件块" 或 "I/O 块"。每个块包含一个或多个扇区,但大小不能超过一个页面,所以一个页可以容纳一个或多个内存中的块。当一个块被调入内存时,它要存储在一个缓冲区中。每个缓冲区与一个块对应,它相当于是磁盘块在内存中的表示(下图来自互联网):
注意,buffer cache 只有块的概念而没有文件的概念,它只是把磁盘上的块直接搬到内存中而不关心块中究竟存放的是什么格式的文件。
cache 在操作系统中指 page cache,中文一般翻译为 "页高速缓存"。页高速缓存是内核实现的磁盘缓存。它主要用来减少对磁盘的 I/O 操作。具体地讲,是通过把磁盘中的数据缓存到物理内存中,把对磁盘的访问变为对物理内存的访问。页高速缓存缓存的是内存页面。缓存中的页来自对普通文件、块设备文件 ( 这个指的就是 buffer cache 呀 ) 和内存映射文件的读写。
页高速缓存对普通文件的缓存我们可以这样理解:当内核要读一个文件 ( 比如 /etc/hosts ) 时,它会先检查这个文件的数据是不是已经在页高速缓存中了。如果在,就放弃访问磁盘,直接从内存中读取。这个行为称为缓存命中。如果数据不在缓存中,就是未命中缓存,此时内核就要调度块 I/O 操作从磁盘去读取数据。然后内核将读来的数据放入页高速缓存中。这种缓存的目标是文件系统可以识别的文件 ( 比如 /etc/hosts )。
页高速缓存对块设备文件的缓存就是我们在前面介绍的 buffer cahce 。因为独立的磁盘块通过缓冲区也被存入了页高速缓存(缓冲区最终是由页高速缓存来承载的)。
到这里我们应该搞清楚了:无论是缓冲区还是页高速缓存,它们的实现方式都是一样的。缓冲区只不过是一种概念上比较特殊的页高速缓存罢了。
那么为什么 free 命令不直接称为 cache 而非要写成 buff/cache: 这是因为缓冲区和页高速缓存的实现并非天生就是统一的,在 linux 内核 2.4 中才将它们统一。
更早的内核中有两个独立的磁盘缓存:页高速缓存和缓冲区高速缓存。前者缓存页面,后者缓存缓冲区。当你知道了这些故事之后,输出中列的名称可能已经不再重要了。
free 与 available
在 free 命令的输出中,有一个 free 列,同时还有一个 available 列。这二者到底有何区别?
free 是真正尚未被使用的物理内存数量。至于 available 就比较有意思了,它是从应用程序的角度看到的可用内存数量。Linux 内核为了提升磁盘操作的性能,会消耗一部分内存去缓存磁盘数据,就是我们介绍的 buffer 和 cache。所以对于内核来说,buffer 和 cache 都属于已经被使用的内存。当应用程序需要内存时,如果没有足够的 free 内存可以用,内核就会从 buffer 和 cache 中回收内存来满足应用程序的请求。所以从应用程序的角度来说,available = free + buffer + cache。请注意,这只是一个很理想的计算方式,实际中的数据往往有较大的误差。
交换空间(swap space)
swap space 是磁盘上的一块区域,可以是一个分区,也可以是一个文件。所以具体的实现可以是 swap 分区也可以是 swap 文件。当系统物理内存吃紧时,Linux 会将内存中不常访问的数据保存到 swap 上,这样系统就有更多的物理内存为各个进程服务,而当系统需要访问 swap 上存储的内容时,再将 swap 上的数据加载到内存中,这就是常说的换出和换入。交换空间可以在一定程度上缓解内存不足的情况,但是它需要读写磁盘数据,所以性能不是很高。
现在的机器一般都不太缺内存,如果系统默认还是使用了 swap 是不是会拖累系统的性能?理论上是的,但实际上可能性并不是很大。并且内核提供了一个叫做 swappiness 的参数,用于配置需要将内存中不常用的数据移到 swap 中去的紧迫程度。这个参数的取值范围是 0~100,0 告诉内核尽可能的不要将内存数据移到 swap 中,也即只有在迫不得已的情况下才这么做,而 100 告诉内核只要有可能,尽量的将内存中不常访问的数据移到 swap 中。在 ubuntu 系统中,swappiness 的默认值是 60。如果我们觉着内存充足,可以在 /etc/sysctl.conf 文件中设置 swappiness: vm.swappiness=10 。
如果系统的内存不足,则需要根据物理内存的大小来设置交换空间的大小。
/proc/meminfo 文件
其实 free 命令中的信息都来自于 /proc/meminfo 文件。/proc/meminfo 文件包含了更多更原始的信息,只是看起来不太直观
重要的是中间标记为-/+ buffers/
cache的那一行。硬盘驱动器使用缓冲(buffer)和缓存(cache)来
加速访问,如果一个程序需要内存,系统就能够快速地为该程序分配
内存。对于Linux计算机中正在运行的应用程序而言,现在可以使用
的空闲内存有442 MB,缓存空间为569 MB
11.9 显示文件系统的磁盘使用情况
df
free命令处理的是系统的RAM,而df命令(可以认为是disk free
的缩写)处理的则是系统中硬盘空间的大小。运行df,就会列出系统
中可以使用的磁盘空间,
[root@localhost /]# df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 1.9G 0 1.9G 0% /dev
tmpfs 1.9G 0 1.9G 0% /dev/shm
tmpfs 1.9G 12M 1.9G 1% /run
tmpfs 1.9G 0 1.9G 0% /sys/fs/cgroup
/dev/mapper/centos-root 8.0G 1.4G 6.6G 18% /
/dev/sda1 1014M 189M 826M 19% /boot
tmpfs 378M 0 378M 0% /run/user/0
[root@localhost /]#
Filesystem:设备名称。
1K-blocks:默认单位是1KB
Used:已使用的磁盘空间大小。
Available:剩余的磁盘空间大小。
Use%:磁盘使用率
Mounted on:磁盘挂载的目录
其他两个分区都被标识为tmpfs,表示它们是计算机上虚拟内存
或交换分区使用的临时文件系统。在关闭计算机后,这些分区的内容
就消失了
11.10报告目录使用的文件空间
du
先用cd命令将当前工作目录切换到待查的目录,
然后运行du命令。
[root@localhost home]# du -h
16K ./tian
12K ./xiang
12K ./yang
0 ./others1/de/rng
0 ./others1/de/tian
32K ./others1/de
44K ./others1
12K ./others2
0 ./de/rng
0 ./de/tian
0 ./de/c.t
0 ./de/xt
36K ./de
12K ./xi
176K .
du -s
只报告目录使用的总空间
[root@localhost home]# du -hs
176K .
学习
man ls 学习命令 翻页 上下键 q 退出学习资料页 /a 搜索a
man -f ls 根据命令的名称快速查找命令的功能
man -u 重建命令的 man 数据库 查不到数据 重新查询一遍
命令栈:命令栈是将所有需要运行的命令放到shell的一行上,再用分号(;)、隔开每个具体的命令。接着依次顺序执行每个命令,只有一个命令结束运行(无论成功或失败),才会运行下一个命令。连续运行多个命令:
mkdir s1 ; sleep 3 ; mkdir s2 连续运行多个命令:不管有没有成功
$ sleep 3 ; import -frame window.tif 睡眠+了ImageMagick
&& 只有前面的命令运行成功,才运行下一个命令
996 music singing sleep work3 work6 测试
arts piano singing, work2 work5 work7
[jackie_liu@rbtnode1 ~]$ rmdir work3 && rmdir work3 && rmdir work6
rmdir: failed to remove ‘work3’: No such file or directory
[jackie_liu@rbtnode1 ~]$ ls
996 arts music piano singing singing, sleep work2 work5 work6 work7 测试
[jackie_liu@rbtnode1 ~]$
|| 只有前面的命令运行失败,才运行下一个命令
rmdir work3 || rmdir work6
rmdir: failed to remove ‘work3’: No such file or directory
[jackie_liu@rbtnode1 ~]$ ls
996 arts music piano singing, sleep work7 测试
实际上已经删除了
$() 将一个命令的输出插入到另一个命令
mkdir $(date +%Y%_m%_d)
[jackie_liu@rbtnode1 ~]$ ls
201912 6 996 arts music piano singing, sleep work7 测试
[jackie_liu@rbtnode1 ~]$ mkdir $(date "+%Y-%m-%d") (不要随便复制命令)
[jackie_liu@rbtnode1 ~]$ ls
201912 2019-12-06 996 arts music piano singing, sleep work7 测试
[jackie_liu@rbtnode1 ~]$
理解输入/输出流
用键盘输入时,其实就是将输入发送到标准输入流,缩写
为stdin,标识为0。当计算机将输出显示到终端时,使用的就是标准
输出流,缩写为stdout,标识为1。如果计算机需要报告错误,并在终
端上显示错误信息,使用的就是标准错误流,缩写为stderr,标识为2
使用ls这个普通的命令,查看这三种输入/输出流。在键盘上输
入ls,使用的是stdin。输入ls后按Enter键,目录中文件和文件夹的列
表通过stdout显示出来。如果对并不存在的文件夹来运行ls命令,终
端上出现的错误信息就是通过stderr而提供的。
如何重定向输入和输出。例如,不让输出
呈现在终端上,可以将输出重定向到其他程序。不从键盘接受输入,
程序从文件获取输入。在理解了stdin和stdout的窍门以后,你就能够
做很多功能强大的事情了。
l 将一个命令的输出用作另一个命令的输入
ls-l | less (错误)
ls -1 | less 注意空格 ls -1的结果传递给less,就可以一次在屏幕上只查看结果的一页,这样用起来要容易得多。
[jackie_liu@rbtnode1 ~]$ ps ux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
jackie_+ 13507 0.0 0.1 156740 2288 ? S 21:04 0:00 sshd: jackie_liu@pts/2
jackie_+ 13508 0.0 0.1 116496 3160 pts/2 Ss 21:04 0:00 -bash
jackie_+ 14613 0.0 0.0 155364 1872 pts/2 R+ 21:22 0:00 ps ux
[jackie_liu@rbtnode1 ~]$ ps ux | grep firefox
jackie_+ 14636 0.0 0.0 112712 964 pts/2 S+ 21:22 0:00 grep --color=auto firefox
[jackie_liu@rbtnode1 ~]$
#查看当前用户的所有进程:
$ ps -ux
将ps的输出通过管道传递给grep命令,让它去搜索firefox,
绍grep命令,可以用它查找文件中与指定模式相匹配的行
要记住,虽然很多程序都能够用管道,但并非所有程序都如
此。例如,文本编辑器vim(或pico、nano及emacs)会接管整
个shell,因此,键盘的所有输入都直接发送给vim,而所有输
出都在程序的某个位置进行显示。因为vim完全控制着shell,
所以也就不能使用程序通过管道重定向它的输出。多使用几
次shell,你就能逐渐学会如何识别不能使用管道的程序了
> 将命令的输出重定向到文件
[jackie_liu@rbtnode1 ~]$ ls -1f >av.text
[jackie_liu@rbtnode1 ~]$ ls
201912 2019-12-06 996 arts av.text music piano singing, sleep work7 测试
[jackie_liu@rbtnode1 ~]$ cat av.text
work7
music
.lesshst
.
..
.bashrc
.viminfo
.bash_logout
piano
av.text
.cache
996
sleep
.bash_history
201912
.config
2019-12-06
测试
.bash_profile
singing,
arts
[jackie_liu@rbtnode1 ~]$
注意,在使用>之前,文件hank_mobley.txt并不存在。当使用>将输出重定向到并不存在的文件时,就会创建这个文件。特别需要注意的是,如果文件hank_mobley.txt早已存在,它将被完全覆盖。
防止重定向时覆盖文件
[jackie_liu@rbtnode1 ~]$ set -o noclobber 果将noclobber设置为on,bash就不允许重定向覆盖已经存在的文件,除非得到你的明确许可。
set +o noclobber 关闭覆盖提示
[jackie_liu@rbtnode1 ~]$ ls -1f > av.text
-bash: av.text: cannot overwrite existing file
如果要使用重定向并覆盖文件,应该用>|代替>,
[jackie_liu@rbtnode1 ~]$ ls -1f >| av.text
[jackie_liu@rbtnode1 ~]$ cat av.text
work7
music
.lesshst
.
..
.bashrc
.viminfo
.bash_logout
piano
av.text
.cache
996
sleep
.bash_history
201912
av
.config
2019-12-06
测试
.bash_profile
singing,
arts
ps -ux >> av.text 将命令的输出追加定文件的底部(如果文件不存在,就会创建
它)
< 它是将文件指定为输入设备,并将内容显示到控制台。
[jackie_liu@rbtnode1 ~]$ cat < av.txt
ls
ll
查看文件
cat av.txt cat命令将文件打印到屏幕,然后直接返回到命令提示符。如果文件长度超出屏幕的范围,必须向上滚动才能看到刚才一闪而过的内容,如果长度过长则需要使用LESS命令
cat av.txt va.txt 将文件拼接至标准输出设备 同时打开多个文件
cat av.txt va.txt > ava.txt 将两个文件拼接起来,最好还能将新连接的文件保存成另一个可以使用的文件。
cat av.txt ava.txt > ava.txt 不能和自身拼接
[jackie_liu@rbtnode1 ~]$ cat av.txt ava.txt > ava.txt
cat: ava.txt: input file is output file
cat -n 拼接文件,并给文件加上行号 tac 反向拼接文件
分屏幕查看文件
less file
PageDn、e或空格键 前进一页
PageUp或b 后退一页
Return、e、j或下箭头键 前进一行
y、k或上箭头键 后退一行
G或p 前进到文件的结尾
1G 回到文件的开始
Esc-)或右箭头键 向右滚动
Esc-(或左箭头键 向左滚动
Q
要在less命令界面中查看文件信息,可以按“=”(等号)键,就
会在屏幕的底部显示如下类似的信息:
less -n 查看行号
在分页器中搜索
/搜索模式 向前搜索使用正则表达式来表示的模式
n 向前重复搜索
N 向后重复搜索
在分页查看文件时进行编辑
less + v (环境变量可以配置默认打开VIM )
head av.txt 查看文件的前 10 行内容
head file1 file2 查看多个文件的前 10 行内容 自动提供有一个标题
head -n 5 查看一个或多个文件的前几行内容;这5行包括空白行和文本行。5行就是5行,不管这5行包含什么内容
head -c 100 va.txt (字节) $ head -c 100k(KB) head -c 100m (mb) 查看文件前几个字节、几 K 字节或几 M 字节的内容
tail 查看文件的最后 10 行内容
tail file1 file2 查看多个文件的最后 10 行内容 和head命令一样,tail命令也使用标题(分隔符)来分隔不同的文件,
tail -n 查看一个或多个文件的后面几行内容 tail -n 1 av.txt va.txt
tail –f 查看一个或多个文件中不断更新的最后几行 使用-f(或--follow)选项,tail命令就不会自动关闭了。每当文件发生变化时,它就会显示文件的最后10行(或在选项中增加-n,
指定不同的数字)的内容。用这种方法就可以观察到日志文件随时发生的所有变化 ,直到按Ctrl+c键才会停下来,
4个命令:cat、less、head以及tail。它们都能以只读模式显示文本文件的内容,但是显示的方法各不相同。cat命令一次显示整个文件的内容,而less命令则以分页方式一次一屏地显示内容。head命令和tail命令就好比是一枚硬币(或者是同一文件)的两
面,前者用于查看文件的开始部分,后者则显示文件结尾部分
查找
12 搜索文件名数据库
1、命令简介
locate(locate) 命令用来查找文件或目录。 locate命令要比find -name快得多,原因在于它不搜索具体目录,而是搜索一个数据库/var/lib/mlocate/mlocate.db 。这个数据库中含有本地所有文件信息。Linux系统自动创建这个数据库,并且每天自动更新一次,因此,我们在用whereis和locate 查找文件时,有时会找到已经被删除的数据,或者刚刚建立文件,却无法查找到,原因就是因为数据库文件没有被更新。为了避免这种情况,可以在使用locate之前,先使用updatedb命令,手动更新数据库。整个locate工作其实是由四部分组成的:
/usr/bin/updatedb 主要用来更新数据库,通过crontab自动完成的
/usr/bin/locate 查询文件位置
/etc/updatedb.conf updatedb的配置文件
/var/lib/mlocate/mlocate.db 存放文件信息的文件
1、运行locate
$ locate
-bash: locate: command not found
提示找不到命令
2、安装
$ sudo yum install mlocate
-b, --basename match only the base name of path names
-c, --count 只输出找到的数量
-d, --database DBPATH 使用DBPATH指定的数据库,而不是默认数据库 /var/lib/mlocate/mlocate.db
-e, --existing only print entries for currently existing files
-L, --follow follow trailing symbolic links when checking file existence (default)
-h, --help 显示帮助
-i, --ignore-case 忽略大小写
-l, --limit, -n LIMIT limit output (or counting) to LIMIT entries
-m, --mmap ignored, for backward compatibility
-P, --nofollow, -H don't follow trailing symbolic links when checking file existence
-0, --null separate entries with NUL on output
-S, --statistics don't search for entries, print statistics about eachused database
-q, --quiet 安静模式,不会显示任何错误讯息
-r, --regexp REGEXP 使用基本正则表达式
--regex 使用扩展正则表达式
-s, --stdio ignored, for backward compatibility
-V, --version 显示版本信息
-w, --wholename match whole path name (default)
3 updatedb 更新查询数据库 该命令的执行之所以这么快,是因为它实际上搜索的是一个包含计算机中所有文件和目录名称的数据库。对于手动安装在计算机的文件需要手动更新
locate pdf| less 将locate搜索结果通过管道输出至分页器less命令(在5.5节中介绍过这个命令),让这2 373个结果一次只在屏幕上显示一屏
locate -n 3 pdf 如果只想看前面的x个结果(x是你选择的一个整数),则可以使用-n选项,后面跟着你想要看的结果个数。
time updatedb 显示更新的时间
[root@localhost ~]# time updatedb
real 0m2.826s
user 0m0.027s
sys 0m0.482s
[root@localhost ~]#
[root@localhost de]# grep a b.txt
sajd
djljdlajsl
[root@localhost de]#
grep pain * 检查多个文件中是否有
[root@localhost de]# grep 我的 *
b.txt:难道我就这样过我的一身
b.txt:我的吻注定留不住我爱的人
grep: rng: Is a directory
grep: tian: Is a directory
[root@localhost de]#
在文本文件中搜索匹配的模式 grep是如何显示每个包含搜索内容的文件名,以及包含搜索内容的相应文本行的。
-E :开启扩展(Extend)的正则表达式。
-i :忽略大小写(ignore case)。
-v :反过来(invert),只打印没有匹配的,而匹配的反而不打印。
-n :显示行号
-w :被匹配的文本只能是单词,而不能是单词中的某一部分,如文本中有liker,而我搜寻的只是like,就可以使用-w选项来避免匹配liker
-c :显示总共有多少行被匹配到了,而不是显示被匹配到的内容,注意如果同时使用-cv选项是显示有多少行没有被匹配到。
-o :只显示被模式匹配到的字符串。
--color :将匹配到的内容以颜色高亮显示。
-A n:显示匹配到的字符串所在的行及其后n行,after
-B n:显示匹配到的字符串所在的行及其前n行,before
-C n:显示匹配到的字符串所在的行及其前后各n行,context
grep -w 搜索整个单词 被匹配的文本只能是单词,而不能是单词中的某一部分
[root@localhost de]# grep -w love *
b.txt:love you wunai
grep: rng: Is a directory
grep: tian: Is a directory
[root@localhost de]#
[root@localhost de]# grep -w 你是我不该我爱的人 *
b.txt:你是我不该我爱的人
grep: rng: Is a directory
grep: tian: Is a directory
[root@localhost de]#
grep -n 显示在搜索内容在哪一行
[root@localhost de]# grep -n 你是我不该我爱的人 *
b.txt:10:你是我不该我爱的人
grep: rng: Is a directory
grep: tian: Is a directory
[root@localhost de]#
ls -1 | grep 2005 * 在其他命令的输出中搜索特定内容
查看文件中搜索内容的上下文信息 -A, -B, -C
[root@localhost de]# ls -1 | grep -B 4 2006 b.txt
2002
2003
2004
2005
2006
[root@localhost de]#
[root@localhost de]# ls -1 | grep -C 5 2006 b.txt
2001
2002
2003
2004
2005
2006
2007
[root@localhost de]# ls -1 | grep -v 2006 b.txt
sajdi
时间啊数据库
你的调整、
难道我就这样过我的一身
也同样落得不可能
我的吻注定留不住我爱的人
djljdlajsl
faker
love you wunai
你是我不该我爱的人
2001
2002
2003
2004
2005
2007
[root@localhost de]#
列出包含搜索内容的文件名
[root@localhost de]# ls -1 | grep -l 2006 b.txt
b.txt
[root@localhost de]#
在搜索结果中进行搜索
[root@localhost de]# grep 你是我不该我爱的人 b.txt | grep 爱
你是我不该我爱的人
[root@localhost de]#
find 命令
-amin<分钟>:查找在指定时间曾被存取过的文件或目录,单位以分钟计算;
-anewer<参考文件或目录>:查找其存取时间较指定文件或目录的存取时间更接近现在的文件或目录;
-atime<24小时数>:查找在指定时间曾被存取过的文件或目录,单位以24小时计算;
-cmin<分钟>:查找在指定时间之时被更改过的文件或目录;
-cnewer<参考文件或目录>查找其更改时间较指定文件或目录的更改时间更接近现在的文件或目录;
-ctime<24小时数>:查找在指定时间之时被更改的文件或目录,单位以24小时计算;
-daystart:从本日开始计算时间;
-depth:从指定目录下最深层的子目录开始查找;
-expty:寻找文件大小为0 Byte的文件,或目录下没有任何子目录或文件的空目录;
-exec<执行指令>:假设find指令的回传值为True,就执行该指令;
-false:将find指令的回传值皆设为False;
-fls<列表文件>:此参数的效果和指定“-ls”参数类似,但会把结果保存为指定的列表文件;
-follow:排除符号连接;
-fprint<列表文件>:此参数的效果和指定“-print”参数类似,但会把结果保存成指定的列表文件;
-fprint0<列表文件>:此参数的效果和指定“-print0”参数类似,但会把结果保存成指定的列表文件;
-fprintf<列表文件><输出格式>:此参数的效果和指定“-printf”参数类似,但会把结果保存成指定的列表文件;
-fstype<文件系统类型>:只寻找该文件系统类型下的文件或目录;
-gid<群组识别码>:查找符合指定之群组识别码的文件或目录;
-group<群组名称>:查找符合指定之群组名称的文件或目录;
-help或——help:在线帮助;
-ilname<范本样式>:此参数的效果和指定“-lname”参数类似,但忽略字符大小写的差别;
-iname<范本样式>:此参数的效果和指定“-name”参数类似,但忽略字符大小写的差别;
-inum<inode编号>:查找符合指定的inode编号的文件或目录;
-ipath<范本样式>:此参数的效果和指定“-path”参数类似,但忽略字符大小写的差别;
-iregex<范本样式>:此参数的效果和指定“-regexe”参数类似,但忽略字符大小写的差别;
-links<连接数目>:查找符合指定的硬连接数目的文件或目录;
-iname<范本样式>:指定字符串作为寻找符号连接的范本样式;
-ls:假设find指令的回传值为Ture,就将文件或目录名称列出到标准输出;
-maxdepth<目录层级>:设置最大目录层级;
-mindepth<目录层级>:设置最小目录层级;
-mmin<分钟>:查找在指定时间曾被更改过的文件或目录,单位以分钟计算;
-mount:此参数的效果和指定“-xdev”相同;
-mtime<24小时数>:查找在指定时间曾被更改过的文件或目录,单位以24小时计算;
-name<范本样式>:指定字符串作为寻找文件或目录的范本样式;
-newer<参考文件或目录>:查找其更改时间较指定文件或目录的更改时间更接近现在的文件或目录;
-nogroup:找出不属于本地主机群组识别码的文件或目录;
-noleaf:不去考虑目录至少需拥有两个硬连接存在;
-nouser:找出不属于本地主机用户识别码的文件或目录;
-ok<执行指令>:此参数的效果和指定“-exec”类似,但在执行指令之前会先询问用户,若回答“y”或“Y”,则放弃执行命令;
-path<范本样式>:指定字符串作为寻找目录的范本样式;
-perm<权限数值>:查找符合指定的权限数值的文件或目录;
-print:假设find指令的回传值为Ture,就将文件或目录名称列出到标准输出。格式为每列一个名称,每个名称前皆有“./”字符串;
-print0:假设find指令的回传值为Ture,就将文件或目录名称列出到标准输出。格式为全部的名称皆在同一行;
-printf<输出格式>:假设find指令的回传值为Ture,就将文件或目录名称列出到标准输出。格式可以自行指定;
-prune:不寻找字符串作为寻找文件或目录的范本样式;
-regex<范本样式>:指定字符串作为寻找文件或目录的范本样式;
-size<文件大小>:查找符合指定的文件大小的文件;
-true:将find指令的回传值皆设为True;
-typ<文件类型>:只寻找符合指定的文件类型的文件;
-uid<用户识别码>:查找符合指定的用户识别码的文件或目录;
-used<日数>:查找文件或目录被更改之后在指定时间曾被存取过的文件或目录,单位以日计算;
-user<拥有者名称>:查找符和指定的拥有者名称的文件或目录;
-version或——version:显示版本信息;
-xdev:将范围局限在先行的文件系统中;
-xtype<文件类型>:此参数的效果和指定“-type”参数类似,差别在于它针对符号连接检查。
列出当前目录及子目录下所有文件和文件夹
find .
在/home目录下查找以.txt结尾的文件名
find /home -name "*.txt"
同上,但忽略大小写
find /home -iname "*.txt"
当前目录及子目录下查找所有以.txt和.pdf结尾的文件
find . \( -name "*.txt" -o -name "*.pdf" \)
或
find . -name "*.txt" -o -name "*.pdf"
匹配文件路径或者文件
find /usr/ -path "*local*"
基于正则表达式匹配文件路径
find . -regex ".*\(\.txt\|\.pdf\)$"
找出/home下不是以.txt结尾的文件
find /home ! -name "*.txt"
[root@localhost home]# find /home -name a.txt
/home/tian/a.txt
/home/others2/a.txt
[root@localhost home]#
根据拥有者搜索文件 $ find . ! -user scott
[root@localhost home]# find . ! -user tian
.
./tian/yang
./tian/a.txt
./xiang
./xiang/.bash_logout
./xiang/.bash_profile
./xiang/.bashrc
./yang
./yang/.bash_logout
./yang/.bash_profile
./yang/.bashrc
./others1
./others1/.bash_logout
./others1/.bash_profile
./others1/.bashrc
./others1/de
根据用户组搜索文件
file -group
[root@localhost home]# find -group root
.
./tian/yang
./tian/a.txt
./others1/de/b.txt
./others1/de/c.txt
./others1/de/rng
./others1/de/rng/d.txt
./others1/de/txt.zip
./others1/de/tian
./others1/de/a.txt.gz
./others1/de/de.tar
./de/rng
./de/rng/d.txt
./de/tian
./de/c.txt
./de/txt.zip
./de/a.txt.gz
./de/de.tar
./de/b.txt
./xi.zip
./tian.zip
./xiang.zip
./1.zip
./yan.zip
./de.tar.zip
[root@localhost home]#
根据文件大小搜索文件
file -size
[root@localhost home]# find -size 1M
.
./tian
./tian/.bash_logout
./tian/.bash_profile
./tian/.bashrc
./tian/.bash_history
./xiang
./xiang/.bash_logout
./xiang/.bash_profile
./xiang/.bashrc
./yang
./yang/.bash_logout
./yang/.bash_profile
./yang/.bashrc
./others1
./others1/.bash_logout
./others1/.bash_profile
./others1/.bashrc
./others1/de
./others1/de/.bash_logout
./others1/de/.bash_profile
./others1/de/.bashrc
./others1/de/rng
./others1/de/txt.zip
。如果要搜索的文件大小大于10 MB,需要在指定的
大小前面加一个加号(+);如果要搜索的文件大小小于10 MB,则需
要在大小前面加一个减号(?),如下所示:
[root@localhost home]# find -size -1M
./tian/yang
./tian/a.txt
./others1/de/b.txt
./others1/de/c.txt
./others1/de/rng/d.txt
./others2/a.txt
./others2/b.txt
./de/rng/d.txt
./de/c.txt
[root@localhost home]#
如果要搜索大型文本文件,可以在数字后面使用c。如表10-1
所示,c将搜索的大小单位修改成字节。在文本文件中一个字
符就是一个字节,
[root@localhost home]# find -size -1000c
.
./tian
./tian/.bash_logout
./tian/.bash_profile
./tian/.bashrc
./yan.zip
./de.tar.zip
[root@localhost home]#
根据文件类型搜索文件
find -type
文件类型字符 含 义
f 普通文件
d 目录
l 符号(软)链接
b 块文件
c 字符文件
p FIFO(First In First Out)文件
s 套接字
[root@localhost home]# find -type d
.
./tian
./xiang
./yang
./others1
./others1/de
./others1/de/rng
./others1/de/tian
./others2
./de
./de/rng
./de/tian
./xi
[root@localhost home]#
使用管道符(|)对find命令生成的列表进行过滤
[root@localhost home]# find -type d | sort
.
./de
./de/rng
./de/tian
./others1
./others1/de
./others1/de/rng
./others1/de/tian
./others2
./tian
./xi
./xiang
./yang
[root@localhost home]#
当表达式均为 true 时显示结果(AND)
find -a
[root@localhost home]# find . -name "*.txt" -a -type f
./tian/a.txt
./others1/de/b.txt
./others1/de/c.txt
./others1/de/rng/d.txt
./others2/a.txt
./others2/b.txt
./de/rng/d.txt
./de/c.txt
./de/b.txt
[root@localhost home]#
统计行数
[root@localhost home]# find . -name "*.txt" -a -type f | wc -l
9
[root@localhost home]#
当表达式中只有一个为 true时就显示结果(OR)
find -o
[root@localhost home]# find . -name a.txt -o -name b.txt
./tian/a.txt
./others1/de/b.txt
./others2/a.txt
./others2/b.txt
./de/b.txt
[root@localhost home]#
当前目录及子目录下查找所有以.txt和.pdf结尾的文件
find . -name "*.txt" -o -name "*.pdf"
查找当前目录下以test开头的文件
find -name "test*
筛选掉结果不是b名称的文件
[root@localhost home]# find . \(-name "*.txt"\) ! -name "*b*"
.
./tian
./tian/yang
./tian/a.txt
./xiang
./yang
./others1
./others1/de
./others1/de/c.txt
./others1/de/rng
./others1/de/rng/d.txt
./others1/de/txt.zip
./others1/de/tian
./others1/de/a.txt.gz
./others1/de/de.tar
./others2
./others2/a.txt
./de
./de/rng
./de/rng/d.txt
./de/tian
./de/c.txt
./de/txt.zip
./de/a.txt.gz
./de/de.tar
./xi
./xi.zip
./tian.zip
./xiang.zip
./1.zip
./yan.zip
./de.tar.zip
find: ‘(-name’: No such file or directory
find: ‘*.txt)’: No such file or directory
[root@localhost home]#
当表达式为 not true 时显示结果(NOT)
find -n
find . -name "*" | wc -l 查询当前目录文件个数
60
当表达式为 not true 时显示结果(NOT):反向查询
find . ! \( -name "*txt*" -o -name "*zip" -o -name "*ZIP" -o -type d \)
[root@localhost home]# find . ! \( -name "*txt*" -o -name "*zip" -o -name "*ZIP" -o -type d \)
./tian/.bash_logout
./tian/.bash_profile
./tian/.bashrc
./tian/.bash_history
./tian/yang
./xiang/.bash_logout
./xiang/.bash_profile
./xiang/.bashrc
./yang/.bash_logout
./yang/.bash_profile
./yang/.bashrc
./others1/.bash_logout
./others1/.bash_profile
./others1/.bashrc
./others1/de/.bash_logout
./others1/de/.bash_profile
./others1/de/.bashrc
./others1/de/de.tar
./others2/.bash_logout
./others2/.bash_profile
./others2/.bashrc
./de/.bash_logout
./de/.bash_profile
./de/.bashrc
./de/de.tar
./xi/.bash_logout
./xi/.bash_profile
./xi/.bashrc
[root@localhost home]#
对搜索到的每个文件执行命令
find -exec
将搜索结果打印到文件
find -fprint
shell:
查看命令行历史
history
[root@localhost de]# history
1 ls
2 cd av
3 ls
4 cd ../
5 ls
$ history | less 查看一屏幕的命令
继续按ENTER 逐个查询
再次运行最近运行过的命令
!!
使用数字再次运行以前运行过的命令
![##]
[root@localhost de]# !8
cd de
-bash: cd: de: No such file or directory
[root@localhost de]#
使用字符串再次运行以前运行过的命令 有重复的 取时间最近的一条
![string]
[root@localhost home]# !c
cd /home
[root@localhost home]#
显示所有命令的别名
alias
[root@localhost home]# alias
alias cp='cp -i'
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias grep='grep --color=auto'
alias l.='ls -d .* --color=auto'
alias ll='ls -l --color=auto'
alias ls='ls --color=auto'
alias mv='mv -i'
alias rm='rm -i'
alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'
[root@localhost home]#
查看特定命令的别名
alias [alias name]
[root@localhost home]# alias rm
alias rm='rm -i'
[root@localhost home]#
查看当前目录下的子目录:
[root@localhost home]# ls -d */
de/ others1/ others2/ tian/ xi/ xiang/ yang/
创建新的临时别名
alias [alias]= '[command]'
[root@localhost home]# alias lsd='ls -d */'
[root@localhost home]# lsd
de/ others1/ others2/ tian/ xi/ xiang/ yang/
[root@localhost home]#
用这种方法使用alias时,应该注意几点内容。别名中不能包含
等号(=),在定义别名时,会在名称后面立即跟上一个等号。不过,
在别名真正的内容中可以使用等号。此外,用这种方法创建的别名只
有在当前shell会话(session)有效时才能存在。会话退出后,别名也
就不存在了。
-bash: ls-a: command not found
[root@localhost home]# ls -a ~
. anaconda-ks.cfg .bash_history .bash_profile .cshrc .viminfo
.. av .bash_logout .bashrc .tcshrc
[root@localhost home]# vim .bashrc
[root@localhost home]# lsd
-bash: lsd: command not found
[root@localhost home]# ..bash_aliases
-bash: ..bash_aliases: command not found
[root@localhost home]# . .bash_aliases
-bash: .bash_aliases: No such file or directory
[root@localhost home]# . .bashrc
[root@localhost home]# lsd
de/ others1/ others2/ tian/ xi/ xiang/ yang/
[root@localhost home]#
创建新的永久别名 在用户目录下找存贮别名的文件
alias [alias name]= '[command]'
如何找出应该使用哪个文件来保存别名?很简单:输入ls -a ~(注意空格)
如果在结果中看到.bash_aliases,那就使用这个文件;否则,
检查一下.bashrc,看看里面是否定义了其他别名。如果在这
个文件中没有看到任何别名,那就再看看.profile,偶尔也会
用到它。
1 [root@localhost ~]# ls -a ~
. anaconda-ks.cfg .bash_history .bash_profile .cshrc .viminfo
.. av .bash_logout .bashrc .tcshrc
2 [root@localhost ~]# cat .bashrc
# .bashrc
# User specific aliases and functions
alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'
# Source global definitions
if [ -f /etc/bashrc ]; then
. /etc/bashrc
3[root@localhost ~]# vim .bashrc
4 alias lsd='ls -d */'
5 source /root/.bashrc #对配置文件立即生效
就在这个别名的前面放一个英磅符号(#),表示注释掉它,如下
所示:
# alias lsd='ls -d */'
保存.bash_aliases文件,再用. .bash_aliases命令重新加载它,
注释掉的别名就不再起作用了。
13 安 装 软 件
在Linux
世界中,软件包的格式有好多种,尤其以RPM和DEB两种格式为主
14 连 接
查看网络接口状态
ifconfig –a命令会显示全部的接口,包括那些没有启用的接口;
而单用ifconfig命令时,只显示启用的网络连接。
这里列出了3个网络接口:ath0(一个无线网卡)、eth0(一个以
太网卡)和lo[环回(loopback)接口,
查看当前处于激活状态的网络接口信息:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
[root@localhost ~]# ifconfig
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
从flags可知该接口已启用,支持广播、组播,mtu值
inet 10.10.10.140 netmask 255.255.255.0 broadcast 10.10.10.255
IPv4地址 子网掩码 广播地址
inet6 fe80::20c:29ff:fec8:ff4e prefixlen 64 scopeid 0x20<link>
IPv6地址 掩码长度 作用域,link表示仅该接口有效
ether 00:0c:29:c8:ff:4e txqueuelen 1000 (Ethernet)
网卡接口的MAC地址 传输队列长度 接口类型为Ethernet
RX packets 266 bytes 26083 (25.4 KiB)
上行表示此接口接收的报文个数,总字节数
RX errors 0 dropped 0 overruns 0 frame 0
接收报文错误数,丢弃数,溢出数,冲突的帧数
TX packets 141 bytes 20086 (19.6 KiB)
上行表示此接口发送的报文个数,总字节数
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
发送报文错误数,丢弃数,溢出数,载荷数,冲突数
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1 (Local Loopback)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
验证计算机是否正在运行和能否接收请求
ping
ping –c
ping命令能够向指定的IP地址发送一种特殊的数据包(ICMPECHO_REQUEST消息)。如果那个地址上的计算机正在监听ICMP消息,它将用ICMP ECHO_REPLY数据包做出响应
下Ctrl+C组合键,ping命令才会停下来
使用-c选项,后面跟上一个数字。在ping发送的数据包个
数达到指定的数量后,就会停止,并报告结果
使用-c选项,后面跟上一个数字。在ping发送的数据包个
数达到指定的数量后,就会停止,并报告结果
跟踪数据包在两台主机之间经过的路由
traceroute
-bash: traceroute: command not found
[root@localhost ~]# yum install -y traceroute
traceroute -q 4 www.58.com ,表示向每个网关发送4个数据包。
[root@localhost ~]# traceroute www.baidu.com
traceroute to www.baidu.com (182.61.200.7), 30 hops max, 60 byte packets
1 gateway (192.168.12.1) 0.802 ms 0.913 ms 0.574 ms
2 * * *
3 * * *
4 10.30.0.13 (10.30.0.13) 3.626 ms 4.132 ms 3.387 ms
5 10.0.7.241 (10.0.7.241) 5.076 ms 4.215 ms 4.959 ms
6 103.216.40.11 (103.216.40.11) 4.062 ms 4.263 ms 4.272 ms
7 182.61.253.148 (182.61.253.148) 6.057 ms 6.864 ms 5.925 ms
8 182.61.252.218 (182.61.252.218) 6.209 ms * *
9 * * *
10 * * *
11 * * *
12 * * *
13 * * *
1.命令格式:
traceroute[参数][主机]
2.命令功能:
traceroute指令让你追踪网络数据包的路由途径,预设数据包大小是40Bytes,用户可另行设置。
具体参数格式:traceroute [-dFlnrvx][-f《存活数值》][-g《网关》。。.][-i《网络界面》][-m《存活数值》][-p《通信端口》][-s《来源地址》][-t《服务类型》][-w《超时秒数》][主机名称或IP地址][数据包大小]
3.命令参数:
-d 使用Socket层级的排错功能。
-f 设置第一个检测数据包的存活数值TTL的大小。
-F 设置勿离断位。
-g 设置来源路由网关,最多可设置8个。
-i 使用指定的网络界面送出数据包。
-I 使用ICMP回应取代UDP资料信息。
-m 设置检测数据包的最大存活数值TTL的大小。
-n 直接使用IP地址而非主机名称。
-p 设置UDP传输协议的通信端口。
-r 忽略普通的Routing Table,直接将数据包送到远端主机上。
-s 设置本地主机送出数据包的IP地址。
-t 设置检测数据包的TOS数值。
-v 详细显示指令的执行过程。
-w 设置等待远端主机回报的时间。
-x 开启或关闭数据包的正确性检验
说明:
记录按序列号从1开始,每个纪录就是一跳 ,每跳表示一个网关,我们看到每行有三个时间,单位是 ms,其实就是-q的默认参数。探测数据包向每个网关发送三个数据包后,网关响应后返回的时间;如果您用 traceroute -q 4 www.58.com ,表示向每个网关发送4个数据包。
有时我们traceroute 一台主机时,会看到有一些行是以星号表示的。出现这样的情况,可能是防火墙封掉了ICMP的返回信息,所以我们得不到什么相关的数据包返回数据。
有时我们在某一网关处延时比较长,有可能是某台网关比较阻塞,也可能是物理设备本身的原因。当然如果某台DNS出现问题时,不能解析主机名、域名时,也会 有延时长的现象;您可以加-n 参数来避免DNS解析,以IP格式输出数据。
如果在局域网中的不同网段之间,我们可以通过traceroute 来排查问题所在,是主机的问题还是网关的问题。如果我们通过远程来访问某台服务器遇到问题时,我们用到traceroute 追踪数据包所经过的网关,提交IDC服务商,也有助于解决问题;但目前看来在国内解决这样的问题是比较困难的,就是我们发现问题所在,IDC服务商也不可能帮助我们解决。
实例2:跳数设置
命令:traceroute -m 10 www.baidu.com
[root@localhost ~]# traceroute -m 10 www.baidu.com
traceroute to www.baidu.com (182.61.200.7), 10 hops max, 60 byte packets
1 gateway (192.168.12.1) 0.787 ms 1.035 ms 0.981 ms
2 * * *
3 * * *
4 10.30.0.13 (10.30.0.13) 4.006 ms 3.981 ms 4.358 ms
5 10.0.7.241 (10.0.7.241) 4.908 ms 4.234 ms 4.332 ms
6 103.216.40.11 (103.216.40.11) 5.200 ms 4.825 ms 4.384 ms
7 182.61.253.162 (182.61.253.162) 5.614 ms 182.61.253.148 (182.61.253.148) 5.546 ms 182.61.253.162 (182.61.253.162) 5.504 ms
8 182.61.252.220 (182.61.252.220) 6.147 ms * 7.351 ms
9 * * *
10 * * *
显示IP地址,不查主机名
命令:traceroute -n www.baidu.com
把探测包的个数设置为值4
命令:traceroute -q 4 www.baidu.com
探测包使用的基本UDP端口设置6888
命令:traceroute -p 6888 www.baidu.com
绕过正常的路由表,直接发送到网络相连的主机
命令:traceroute -r www.baidu.com
[root@localhost ~]# traceroute -r www.baidu.com
traceroute to www.baidu.com (182.61.200.7), 30 hops max, 60 byte packets
connect: Network is unreachable
把对外发探测包的等待响应时间设置为3秒
命令:traceroute -w 3 www.baidu.com
Traceroute的工作原理:
Traceroute最简单的基本用法是:traceroute hostname
Traceroute程序的设计是利用ICMP及IP header的TTL(Time To Live)栏位(field)。首先,traceroute送出一个TTL是1的IP datagram(其实,每次送出的为3个40字节的包,包括源地址,目的地址和包发出的时间标签)到目的地,当路径上的第一个路由器(router)收到这个datagram时,它将TTL减1。此时,TTL变为0了,所以该路由器会将此datagram丢掉,并送回一个「ICMP time exceeded」消息(包括发IP包的源地址,IP包的所有内容及路由器的IP地址),traceroute 收到这个消息后,便知道这个路由器存在于这个路径上,接着traceroute 再送出另一个TTL是2 的datagram,发现第2 个路由器。。.。。. traceroute 每次将送出的datagram的TTL 加1来发现另一个路由器,这个重复的动作一直持续到某个datagram 抵达目的地。当datagram到达目的地后,该主机并不会送回ICMP time exceeded消息,因为它已是目的地了,那么traceroute如何得知目的地到达了呢?
Traceroute在送出UDP datagrams到目的地时,它所选择送达的port number 是一个一般应用程序都不会用的号码(30000 以上),所以当此UDP datagram 到达目的地后该主机会送回一个「ICMP port unreachable」的消息,而当traceroute 收到这个消息时,便知道目的地已经到达了。所以traceroute 在Server端也是没有所谓的Daemon 程式。
Traceroute提取发 ICMP TTL到期消息设备的IP地址并作域名解析。每次 ,Traceroute都打印出一系列数据,包括所经过的路由设备的域名及 IP地址,三个包每次来回所花时间。
windows之tracert:
格式:
tracert [-d] [-h maximum_hops] [-j host-list] [-w timeout] target_name
参数说明:
tracert [-d] [-h maximum_hops] [-j computer-list] [-w timeout] target_name
该诊断实用程序通过向目的地发送具有不同生存时间 (TL) 的 Internet 控制信息协议 (CMP) 回应报文,以确定至目的地的路由。路径上的每个路由器都要在转发该 ICMP 回应报文之前将其 TTL 值至少减 1,因此 TTL 是有效的跳转计数。当报文的 TTL 值减少到 0 时,路由器向源系统发回 ICMP 超时信息。通过发送 TTL 为 1 的第一个回应报文并且在随后的发送中每次将 TTL 值加 1,直到目标响应或达到最大 TTL 值,Tracert 可以确定路由。通过检查中间路由器发发回的 ICMP 超时 (ime Exceeded) 信息,可以确定路由器。注意,有些路由器“安静”地丢弃生存时间 (TLS) 过期的报文并且对 tracert 无效。
参数:
-d 指定不对计算机名解析地址。
-h maximum_hops 指定查找目标的跳转的最大数目。
-jcomputer-list 指定在 computer-list 中松散源路由。
-w timeout 等待由 timeout 对每个应答指定的毫秒数。
target_name 目标计算机的名称。
实例:
代码如下:
C:\Users\Administrator》tracert www.58.com
Tracing route to www.58.com [221.187.111.30]
over a maximum of 30 hops:
1 1 ms 1 ms 1 ms 10.58.156.1
2 1 ms 《1 ms 《1 ms 10.10.10.1
3 1 ms 1 ms 1 ms 211.103.193.129
4 2 ms 2 ms 2 ms 10.255.109.129
5 1 ms 1 ms 3 ms 124.205.98.205
6 2 ms 2 ms 2 ms 124.205.98.253
7 2 ms 6 ms 1 ms 202.99.1.125
8 5 ms 6 ms 5 ms 118.186.0.113
9 207 ms * * 118.186.0.106
10 8 ms 6 ms 11 ms 124.238.226.201
11 6 ms 7 ms 6 ms 219.148.19.177
12 12 ms 12 ms 16 ms 219.148.18.117
13 14 ms 17 ms 16 ms 219.148.19.125
14 13 ms 13 ms 12 ms 202.97.80.113
15 * * * Request timed out.
16 12 ms 12 ms 17 ms bj141-147-82.bjtelecom.net [219.141.147.82]
17 13 ms 13 ms 12 ms 202.97.48.2
18 * * * Request timed out.
19 14 ms 14 ms 12 ms 221.187.224.85
20 15 ms 13 ms 12 ms 221.187.104.2
21 * * * Request timed out.
22 15 ms 17 ms 18 ms 221.187.111.30
Trace complete.
上面就是Linux下traceroute命令的相关介绍了,使用traceroute命令可进行ip地址的查询,跳数设置和探测包的设置等。
DNS(Domain Name System,域名系统)的建立使得人们可以更
容易地访问因特网上的各种资源。毕竟,计算机可以完美地处理数字,
它所做的每一件事实际上都可以表示为数字,而人类则更擅长记忆和
处理文字信息。一个网站的IP地址可能是72.14.203.99,但大多数人都
很难记住这么长串数字。而要访问www.google.com,记忆这个名字就
容易得多了。DNS基本上就是一个巨大的数据库,记录了72.14.203.99
和www.google.com之间的对应关系,以及其他数百万的IP地址和域名
的数据。
执行 DNS 查询
host
host: command not found
yum install bind-utils
[root@localhost ~]# host www.baidu.com
www.baidu.com is an alias for www.a.shifen.com.
www.a.shifen.com has address 182.61.200.6
www.a.shifen.com has address 182.61.200.7
Host www.a.shifen.com not found: 2(SERVFAIL)
Host www.a.shifen.com not found: 2(SERVFAIL)
得到5个响应,因为host命令执行了几种DNS查询。
配置网络接口
ifconfig
ifconfig命令更为强大的功能是能够配置网络接口
将ens33上的以太网卡的IP地址修改为192.168.0.125 ,(几乎所有与ifconfig相关的命令,都需要以root用户来运行)
[root@localhost ~]# ifconfig ens33 192.168.0.125
Socket error Event: 32 Error: 10053.
Connection closing...Socket close.
Connection closed by foreign host.
Disconnected from remote host(本地liunx) at 18:37:11.
Type `help' to learn how to use Xshell prompt.
[D:\~]$ 证明修改已经生效
为了运行某种类型的网络数据包嗅探工具(如强大的Ethereal),
需要首先将网卡设置为混杂(promiscuous)模式。在默认情况下,
eth0只监听发送给它的特定数据包,但为了嗅探网络上传递的所
有数据包,就需要让网卡监听所有数据包,这就是混杂模式,如
下所示:
# ifconfig eth0 promisc
设置好混杂模式后,运行ifconfig命令,就能看到这个网卡正在
监听它能接收到的所有数据包。看到第四行的PROMISC了吗?
查看无线网络接口的状态
iwconfig
[root@localhost ~]# iwconfig
-bash: iwconfig: command not found
使用网络;
telnet发送的所有东西(包括用户名、密码及命令和数据),没有经过一点加密就直接发送了出去。能监听到这些信息的任何人都可以看到发送的所有东西,这样真不安全。为了克服这个问题,ssh(secure shell)应运而生
ssh的所有流量都经过加密,这让ssh功能更强大、也更有用
查看SSH是否安装(检查是否装了SSH包)。
输入命令:rpm -qa | grep ssh 或者(rpm -qa | grep openssh)
若没安装SSH则可输入:yum install openssh-server 进行安装
.查看SSH服务是否正在运行。
输入命令:或者(service sshd status)
[root@localhost ~]# service sshd status
Redirecting to /bin/systemctl status sshd.service
● sshd.service - OpenSSH server daemon
Loaded: loaded (/usr/lib/systemd/system/sshd.service; enabled; vendor preset: enabled)
Active: active (running) since Thu 2020-01-16 02:44:29 CST; 2h 13min ago
Docs: man:sshd(8)
man:sshd_config(5)
Main PID: 1188 (sshd)
CGroup: /system.slice/sshd.service
└─1188 /usr/sbin/sshd -D
Jan 16 02:44:29 localhost.localdomain systemd[1]: Starting OpenSSH server daemon...
Jan 16 02:44:29 localhost.localdomain sshd[1188]: Server listening on 0.0.0.0 port 22.
Jan 16 02:44:29 localhost.localdomain sshd[1188]: Server listening on :: port 22.
Jan 16 02:44:29 localhost.localdomain systemd[1]: Started OpenSSH server daemon.
Jan 16 02:45:18 localhost.localdomain sshd[1730]: Accepted password for root from 192.168.12.198...sh2
Hint: Some lines were ellipsized, use -l to show in full.
[root@localhost ~]#
若CentOS 6.5系统中SSH服务处于非运行状态则使用(service sshd start)命令开启SSH服务;停止SSH服务命令(service sshd stop);重启SSH服务命令(service sshd restart)。为了演示效果,我这里先停止SSH服务,然后启动SSH服务,再接着重启SSH服务。[service sshd stop] -> [/etc/init.d/sshd status] -> [service sshd start]-> [service sshd restart] -> [/etc/init.d/sshd status]