我的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 + c
、zbacktrace
、c
查看程序在哪段 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 占用过高,针对性的进行优化。