linux总结

2020/04/13 Linux

我的linux整理

一 常用操作以及概念

1. 操作系统概念

1.1 操作系统概念

操作系统是计算机系统的内核与基石。操作系统需要处理如管理与配置内存、决定系统资源供需的优先次序、控制输入与输出设备、操作网络与管理文件系统等基本事务。 操作系统也提供一个让用户与系统交互的操作界面。(软件之下,硬件之上)

系统图

系统图

1.2 Unix和Linux之间的关系

系统图

1.3 发行版和内核之间的关系

发行版只是在内核的基础少包了一层壳;

系统图

1.4 多用户操作系统(不同于Windows的单用户操作系统)

系统图

  • /:根目录,一般根目录下只存放目录,在Linux下有且只有一个根目录。所有的东西都是从这里开始。当你在终端里输入“/home”,你其实是在告诉电脑,先从/(根目录)开始,再进入到home目录。
  • /bin: /usr/bin: 可执行二进制文件的目录,如常用的命令ls、tar、mv、cat等。
  • /boot:放置linux系统启动时用到的一些文件,如Linux的内核文件:/boot/vmlinuz,系统引导管理器:/boot/grub。
  • /dev:存放linux系统下的设备文件,访问该目录下某个文件,相当于访问某个设备,常用的是挂载光驱 mount /dev/cdrom /mnt。
  • /etc:系统配置文件存放的目录,不建议在此目录下存放可执行文件,重要的配置文件有 /etc/inittab、/etc/fstab、/etc/init.d、/etc/X11、/etc/sysconfig、/etc/xinetd.d。
  • /home:系统默认的用户家目录,新增用户账号时,用户的家目录都存放在此目录下,~表示当前用户的家目录~edu 表示用户 edu 的家目录。
  • /lib: /usr/lib: /usr/local/lib:系统使用的函数库的目录,程序在执行过程中,需要调用一些额外的参数时需要函数库的协助。
  • /lost+fount:系统异常产生错误时,会将一些遗失的片段放置于此目录下。
  • /mnt: /media:光盘默认挂载点,通常光盘挂载于 /mnt/cdrom 下,也不一定,可以选择任意位置进行挂载。
  • /opt:给主机额外安装软件所摆放的目录。
  • /proc:此目录的数据都在内存中,如系统核心,外部设备,网络状态,由于数据都存放于内存中,所以不占用磁盘空间,比较重要的目录有 /proc/cpuinfo、/proc/interrupts、/proc/dma、/proc/ioports、/proc/net/* 等。
  • /root:系统管理员root的家目录。
  • /sbin: /usr/sbin: /usr/local/sbin:放置系统管理员使用的可执行命令,如fdisk、shutdown、mount 等。与 /bin 不同的是,这几个目录是给系统管理员 root使用的命令,一般用户只能”查看”而不能设置和使用。
  • /tmp:一般用户或正在执行的程序临时存放文件的目录,任何人都可以访问,重要数据不可放置在此目录下。
  • /srv:服务启动之后需要访问的数据目录,如 www 服务需要访问的网页数据存放在 /srv/www 内。
  • /usr:应用程序存放目录,/usr/bin 存放应用程序,/usr/share 存放共享数据,/usr/lib 存放不能直接运行的,却是许多程序运行所必需的一些函数库文件。/usr/local: 存放软件升级包。/usr/share/doc: 系统说明文件存放目录。/usr/share/man: 程序说明文件存放目录。
  • /var:放置系统执行过程中经常变化的文件,如随时更改的日志文件 /var/log,/var/log/message:所有的登录文件存放目录,/var/spool/mail:邮件存放的目录,/var/run:程序或服务启动后,其PID存放在该目录下。

1.2 常用命令

终端命令格式以及常用linux命令:

基本格式:

command [-options] [parameter]
  • command: 命令名,相应功能的英文单词或单词的缩写;
  • [-options]: 选项,可以用来对命令进行控制,也可以省略;
  • [parameter] : 传给命令的参数,可以是零个,一个或多个;

注: []代表的是可选操作。

小技巧: ctrl + -/+ 可以缩小/放大终端的字体;

常用的7个命令:

序号 命令 对应英文 作用
01 ls list 查看当前文件夹下的内容
02 pwd print wrok directory 查看当前所在文件夹
03 cd [目录名] change directory 切换文件夹
04 touch [文件名] touch 如果文件不存在,新建文件
05 mkdir [目录名] make directory 创建目录
06 rm[文件名] remove 删除指定的文件名
07 clear clear 清屏

1.2.1 查看相关命令的帮助信息的两种方式

  • command –help,比如 ls – help查看ls的命令的帮助信息;
  • man,比如man ls查看ls的帮助信息;

1.2.2 Linux下文件和目录的特点

  • Linux文件或目录名称最长可以有256个字符;
  • .开头 的文件为隐藏文件,需要用-a参数才能显示;
  • . 代表当前目录;
  • .. 代表上一级目录;

1.2.3 命令结合通配符的使用

通配符 含义
* 匹配零个或多个字符。
? 匹配任意单个字符。
[0-9] 匹配范围内的数字。
[abc] 匹配已出的任意字符。
[a-f] 匹配已出的任意字符。

例子如下

  • 查看sda开头的所有设备文件:
      [root@linuxprobe ~]# ls /dev/sda*
      /dev/sda /dev/sda1 /dev/sda2
    
  • 查看sda后面有一个字符的设备文件:
      [root@linuxprobe ~]# ls /dev/sda?
      /dev/sda1 /dev/sda2
    
  • 查看sda后面包含0-9数字的设备文件:
      [root@linuxprobe ~]# ls /dev/sda[0-9]
      /dev/sda1 /dev/sda2
    
  • 查看sda后面是1或3或5的设备文件:
      [root@linuxprobe ~]# ls /dev/sda[135]
      /dev/sda1
    

1.2.4 cd命令的常用变化格式以及路径

cd 是英文单词change directory的简写,其功能为更改当前的工作目录,也是用户最常用的命令之一。

注意:linxu所有目录和文件名都是大小写敏感的。

命令 含义
cd 切换都当前用户的主目录(/home/用户目录)
cd ~ 切换到当前用户的主目录(/home/用户目录)
cd . 保持当前目录不变
cd .. 切换到上级目录
cd - 可以在最近两次工作目录之间来回切换

相对路径在输入路径时,最前面不是/或者~,表示 相对当前目录 所在的目录位置 绝对路径在输入路径时,最前面是/或者~,表示从 根目录/家目录 开始的具体目录位置

1.2.5 创建、删除、移动、复制操作

1.2.5.1 touch
  • 如果文件不存在,可以创建一个空白文件
  • 如果文件已经存在,可以修改文件的末次修改日期

1.2.5.2 mkdir

  • 创建一个新的目录
选项 含义
-P 可以递归创建目录

新建目录的名称不能与当前目录中已有的目录或文件同名

1.2.5.3 rm

  • 删除文件或目录
使用 rm 命令要小心,因为文件删除后不能恢复
参数 含义
-f 强制删除,忽略不存在的文件,无需提示
-r 递归地删除目录下的内容,删除文件夹时必须加此参数

1.2.5.4 cp

  • cp命令的功能是将给出的文件或目录复制到另-一个文件或目录中,相当于DOS下的copy命令
选项 含义
-f 已经存在的目标文件直接覆盖,不会提示
-i 覆盖文件前提示
-r 若给出的源文件是目录文件,则cp将递归复制该目录下的所有子目录和文件,目标文件必须为-一个目录名

1.2.5.5 mv

  • mv命令可以用来移动文件或目录,也可以给文件或目录重命名,可以-i参数覆盖文件前提示

1.2.6 查看文件内容的三个命令

查看文件内容

序号 命令 对应英文 作用
01 cat文件名 concatenate 查看文件内容、创建文件、文件合并、追加文件内容等功能
02 more文件名 more 分屏显示文件内容
03 grep搜索文本文件名 grep 搜索文本文件内容

1.2.6.1 cat

  • cat命令可以用来查看文件内容创建文件文件合并追加文件内容等
  • cat会一次显示所有的内容,适合查看内容较少的文本文件
选项 含义
-b 对非空输出行编号
-n 对输出的所有行编号

Linux中还有一个nl的命令和cat -b的效果等价

1.2.6.2 more

  • more命令可以用于分屏显示文件内容,每次只显示一页内容

  • 适合于查看内容较多的文本文件

使用more的操作键:

操作键 功能
空格键 显示手册页的下一屏
Enter键 一次滚动手册页的一行
b 回滚一屏
f 前滚一屏
q 退出
/word 搜索word字符串

1.2.6.3 grep

  • Linux系统中grep 命令是-种强大的文本搜索工具

  • grep允许对文本文件进行模式查找,所谓模式查找,又被称为正则表达式

选项 含义
-n 显示匹配行及行号
-V 显示不包含匹配文本的所有行(相当于求反)
-i 忽略大小写
  • 常用的两种模式查找
参数 含义
^a 行首,搜寻以a开头的行
ke$ 行尾,搜寻以ke结束的行

1.2.7 echo、重定向、管道

1.2.7.1 echo文字内容

  • echo会在终端中显示参数指定的文字,通常会和重定向联合使用

1.2.7.2 重定向>和»

  • Linux 允许将命令执行结果重定向到一个文件

  • 将本应显示在终端上的内容输出/追加到指定文件中

其中

  • >表示输出,会覆盖文件原有的内容

  • >>表示追加,会将内容追加到已有文件的末尾

1.2.7.3 管道 |

  • Linux允许将-个命令的输出可以通过管道做为另一个命令的输入

  • 可以理解现实生活中的管子,管子的一头塞东西进去,另一头取出来,这里|的左右分为两端,左端塞东西(写),右端取东西(读)

  • 常用的管道命令有:

    • more: 分屏显示内容
    • grep: 在命令执行结果的基础上查询指定的文本

2 磁盘

3 分区

4 文件系统

5 压缩与打包

5.1 压缩文件名

Linux 底下有很多压缩文件名,常见的如下:

扩展名 压缩程序
*.Z compress
*.zip zip
*.gz gzip
*.bz2 bzip2
*.xz xz
*.tar tar 程序打包的数据,没有经过压缩
*.tar.gz tar 程序打包的文件,经过 gzip 的压缩
*.tar.bz2 tar 程序打包的文件,经过 bzip2 的压缩
*.tar.xz tar 程序打包的文件,经过 xz 的压缩

5.2 压缩指令

5.2.1. gzip

gzip 是 Linux 使用最广的压缩指令,可以解开 compress、zip 与 gzip 所压缩的文件。

经过 gzip 压缩过,源文件就不存在了。

有 9 个不同的压缩等级可以使用。

可以使用 zcat、zmore、zless 来读取压缩文件的内容。

$ gzip [-cdtv#] filename
-c :将压缩的数据输出到屏幕上
-d :解压缩
-t :检验压缩文件是否出错
-v :显示压缩比等信息
-# : # 为数字的意思,代表压缩等级,数字越大压缩比越高,默认为 6

5.2.2. bzip2

提供比 gzip 更高的压缩比。

查看命令:bzcat、bzmore、bzless、bzgrep。

$ bzip2 [-cdkzv#] filename
-k :保留源文件

5.2.3. xz

提供比 bzip2 更佳的压缩比。

可以看到,gzip、bzip2、xz 的压缩比不断优化。不过要注意的是,压缩比越高,压缩的时间也越长。

查看命令:xzcat、xzmore、xzless、xzgrep。

$ xz [-dtlkc#] filename

6 Bash

7 管道指令

8 正则表达式

9 进程管理

9.1 进程

9.1.1

9.1.1.1 ps

查看某个时间点的进程信息。

示例:查看自己的进程
# ps -l
示例:查看系统所有进程
# ps aux
示例:查看特定的进程
# ps aux | grep threadx

9.1.1.2 pstree

查看进程树。

示例:查看所有进程树
# pstree -A

9.1.1.3 top

实时显示进程信息。

示例:两秒钟刷新一次
# top -d 2

9.1.1.4 netstat

查看占用端口的进程

示例:查看特定端口的进程
netstat -anp | grep port

9.1.1.5 stace

strace常用来跟踪进程执行时的系统调用和所接收的信号。 在Linux世界,进程不能直接访问硬件设备,当进程需要访问硬件设备(比如读取磁盘文件,接收网络数据等等)时,必须由用户态模式切换至内核态模式,通过系统调用访问硬件设备。strace可以跟踪到一个进程产生的系统调用,包括参数,返回值,执行消耗的时间。

FreeBSD/MacOS 下可以使用 truss

strace常用参数:

-p  跟踪指定的进程
-f  跟踪由fork子进程系统调用
-F  尝试跟踪vfork子进程系统调吸入,与-f同时出现时, vfork不被跟踪
-o  filename 默认strace将结果输出到stdout。通过-o可以将输出写入到filename文件中
-ff 常与-o选项一起使用,不同进程(子进程)产生的系统调用输出到filename.PID文件
-r  打印每一个系统调用的相对时间
-t  在输出中的每一行前加上时间信息。 -tt 时间确定到微秒级。还可以使用-ttt打印相对时间
-v  输出所有系统调用。默认情况下,一些频繁调用的系统调用不会输出
-s  指定每一行输出字符串的长度,默认是32。文件名一直全部输出
-c  统计每种系统调用所执行的时间,调用次数,出错次数。
-e  expr    输出过滤器,通过表达式,可以过滤出掉你不想要输出

用法示例

1. 通用的完整用法 跟踪28979进程的所有系统调用(-e trace=all),并统计系统调用的花费时间,以及开始时间(并以可视化的时分秒格式显示),最后将记录结果存在output.txt文件里面。
# strace -o output.txt -T -tt -e trace=all -p 28979

2.不同进程(子进程)产生的系统调用输出到xxx.PID文件
# strace -ff -o ./xxxx  对应进程

3. 查FPM进程的所有网络调用
# strace -frt -e trace=network -p pid (http://blog.wingflare.com/2019/11/mr1pjzwm7qw2go4e.html)

9.1.1.6 lsof

Linux 平台提供了 lsof 工具可以查看某个进程打开的文件句柄。可以用于跟踪工作进程所有打开的 socket、file、资源。

用法示例

lsof -p [进程ID]
lsof -p 26821
lsof: WARNING: can't stat() tracefs file system /sys/kernel/debug/tracing
      Output information may be incomplete.
COMMAND   PID USER   FD      TYPE             DEVICE SIZE/OFF    NODE NAME
php     26821  htf  cwd       DIR                8,4     4096 5375979 /home/htf/workspace/swoole/examples
php     26821  htf  rtd       DIR                8,4     4096       2 /
php     26821  htf  txt       REG                8,4 24192400 6160666 /opt/php/php-5.6/bin/php
php     26821  htf  DEL       REG                0,5          7204965 /dev/zero
php     26821  htf  DEL       REG                0,5          7204960 /dev/zero
php     26821  htf  DEL       REG                0,5          7204958 /dev/zero
php     26821  htf  DEL       REG                0,5          7204957 /dev/zero
php     26821  htf  DEL       REG                0,5          7204945 /dev/zero
php     26821  htf  mem       REG                8,4   761912 6160770 /opt/php/php-5.6/lib/php/extensions/debug-zts-20131226/gd.so
php     26821  htf  mem       REG                8,4  2769230 2757968 /usr/local/lib/libcrypto.so.1.1
php     26821  htf  mem       REG                8,4   162632 6322346 /lib/x86_64-linux-gnu/ld-2.23.so
php     26821  htf  DEL       REG                0,5          7204959 /dev/zero
php     26821  htf    0u      CHR             136,20      0t0      23 /dev/pts/20
php     26821  htf    1u      CHR             136,20      0t0      23 /dev/pts/20
php     26821  htf    2u      CHR             136,20      0t0      23 /dev/pts/20
php     26821  htf    3r      CHR                1,9      0t0      11 /dev/urandom
php     26821  htf    4u     IPv4            7204948      0t0     TCP *:9501 (LISTEN)
php     26821  htf    5u     IPv4            7204949      0t0     UDP *:9502 
  • so 文件是进程加载的动态连接库
  • IPv4/IPv6 TCP (LISTEN) 是服务器监听的端口
  • UDP 是服务器监听的 UDP 端口
  • unix type=DGRAM 时是进程创建的 unixSocket
  • IPv4 (ESTABLISHED) 表示连接到服务器的 TCP 客户端,包含了客户端的 IP 和 PORT,以及状态 (ESTABLISHED)
  • 9u / 10u 表示该文件句柄的 fd 值 (文件描述符)
  • 其他更多信息可以参考 lsof 的手册

https://www.jianshu.com/p/a3aa6b01b2e1

9.1.1.7 tcpdump

常用命令

sudo tcpdump -i any tcp port 9501
  • -i 参数指定了网卡,any 表示所有网卡
  • tcp 指定仅监听 TCP 协议
  • port 指定监听的端口

tcpdump 需要 root 权限;需要要看通信的数据内容,可以加 -Xnlps0 参数,其他更多参数请参见网上的文章

运行结果

13:29:07.788802 IP localhost.42333 > localhost.9501: Flags [S], seq 828582357, win 43690, options [mss 65495,sackOK,TS val 2207513 ecr 0,nop,wscale 7], length 0
13:29:07.788815 IP localhost.9501 > localhost.42333: Flags [S.], seq 1242884615, ack 828582358, win 43690, options [mss 65495,sackOK,TS val 2207513 ecr 2207513,nop,wscale 7], length 0
13:29:07.788830 IP localhost.42333 > localhost.9501: Flags [.], ack 1, win 342, options [nop,nop,TS val 2207513 ecr 2207513], length 0
13:29:10.298686 IP localhost.42333 > localhost.9501: Flags [P.], seq 1:5, ack 1, win 342, options [nop,nop,TS val 2208141 ecr 2207513], length 4
13:29:10.298708 IP localhost.9501 > localhost.42333: Flags [.], ack 5, win 342, options [nop,nop,TS val 2208141 ecr 2208141], length 0
13:29:10.298795 IP localhost.9501 > localhost.42333: Flags [P.], seq 1:13, ack 5, win 342, options [nop,nop,TS val 2208141 ecr 2208141], length 12
13:29:10.298803 IP localhost.42333 > localhost.9501: Flags [.], ack 13, win 342, options [nop,nop,TS val 2208141 ecr 2208141], length 0
13:29:11.563361 IP localhost.42333 > localhost.9501: Flags [F.], seq 5, ack 13, win 342, options [nop,nop,TS val 2208457 ecr 2208141], length 0
13:29:11.563450 IP localhost.9501 > localhost.42333: Flags [F.], seq 13, ack 6, win 342, options [nop,nop,TS val 2208457 ecr 2208457], length 0
13:29:11.563473 IP localhost.42333 > localhost.9501: Flags [.], ack 14, win 342, options [nop,nop,TS val 2208457 ecr 2208457], length 0
  • 13:29:11.563473 时间带有精确到微妙
  • localhost.42333 > localhost.9501 表示通信的流向,42333 是客户端,9501 是服务器端
  • [S] 表示这是一个 SYN 请求
  • [.] 表示这是一个 ACK 确认包,(client) SYN->(server) SYN->(client) ACK 就是 3 次握手过程
  • [P] 表示这个是一个数据推送,可以是从服务器端向客户端推送,也可以从客户端向服务器端推
  • [F] 表示这是一个 FIN 包,是关闭连接操作,client/server 都有可能发起
  • [R] 表示这是一个 RST 包,与 F 包作用相同,但 RST 表示连接关闭时,仍然有数据未被处理。可以理解为是强制切断连接
  • win 342 是指滑动窗口大小
  • length 12 指数据包的大小

9.1.1.6 gdb

GDB 是 GNU 开源组织发布的一个强大的 UNIX 下的程序调试工具,可以用来调试 C/C++ 开发的程序,PHP 和 Swoole 是使用 C 语言开发的,所以可以用 GDB 来调试 PHP+Swoole 的程序。

gdb 调试是命令行交互式的,需要掌握常用的指令。

常用命令

gdb -p 进程ID
gdb php
gdb php core
9.1.1.6.1 gdb 有 3 种使用方式:
  • 跟踪正在运行的 PHP 程序,使用 gdb -p 进程 ID
  • 使用 gdb 运行并调试 PHP 程序,使用 gdb php -> run server.php 进行调试
  • PHP 程序发生 coredump 后使用 gdb 加载 core 内存镜像进行调试 gdb php core

如果 PATH 环境变量中没有 php,gdb 时需要指定绝对路径,如 gdb /usr/local/bin/php

常用指令

  • p:print,打印 C 变量的值
  • c:continue,继续运行被中止的程序
  • b:breakpoint,设置断点,可以按照函数名设置,如 b zif_php_function,也可以按照源代码的行数指定断点,如 b src/networker/Server.c:1000
  • t:thread,切换线程,如果进程拥有多个线程,可以使用 t 指令,切换到不同的线程
  • ctrl + c:中断当前正在运行的程序,和 c 指令配合使用
  • n:next,执行下一行,单步调试
  • info threads:查看运行的所有线程
  • l:list,查看源码,可以使用 l 函数名 或者 l 行号
  • bt:backtrace,查看运行时的函数调用栈
  • finish:完成当前函数
  • f:frame,与 bt 配合使用,可以切换到函数调用栈的某一层
  • r:run,运行程序
9.1.1.6.2 zbacktrace

zbacktrace 是 PHP 源码包提供的一个 gdb 自定义指令,功能与 bt 指令类似,与 bt 不同的是 zbacktrace 看到的调用栈是 PHP 函数调用栈,而不是 C 函数。

下载 php-src,解压后从根目录中找到一个.gdbinit 文件,在 gdb shell 中输入

source .gdbinit
zbacktrace
9.1.1.6.3 使用 gdb+zbacktrace 跟踪死循环问题
gdb -p 进程ID
  • 使用 ps aux 工具找出发生死循环的 Worker 进程 ID
  • gdb -p 跟踪指定的进程
  • 反复调用 ctrl + czbacktracec查看程序在哪段 PHP 代码发生循环
  • 找到对应的 PHP 代码进行解决

.gdbinit 还提供了其他更多指令,可以查看源码了解详细的信息。

9.1.1.6 perf

perf 工具是 Linux 内核提供一个非常强大的动态跟踪工具,perf top 指令可用于实时分析正在执行程序的性能问题。与 callgrind、xdebug、xhprof 等工具不同,perf 无需修改代码导出 profile 结果文件。

常用命令

perf top -p [进程ID]

系统图

perf 结果中清楚地展示了当前进程运行时各个 C 函数的执行耗时,可以了解哪个 C 函数占用 CPU 资源较多。 如果你熟悉 Zend VM,某些 Zend 函数调用过多,可以说明你的程序中大量使用了某些函数,导致 CPU 占用过高,针对性的进行优化。

9.2 进程状态

9.3 SIGCHLD

9.4 wait()

9.5 waitpid()

9.6 孤儿进程

9.7 僵尸进程

Search

    Table of Contents