文章目录
常用命令
目录相关
find
查找文件。
find -iname {file_name}
:查找指定文件,不区分大小写
find -iname “{file_name}” exec {} \
:查找指定文件,并且执行相应命令
查找指定目录下大小超过10MB的文件
加号表示超过,减号就是小于
find /usr -type f -size +10240k
查找目录下名为core的文件,并且直接删除
find / -name core -exec rm {} \ ;
被访问过或者被修改过
120天之前修改过的
find /home -mtime +120
90天以内未被访问过的,如果是访问过的感叹号去掉
find /home \! -atime -90
df、du
查看磁盘使用情况的命令。
df -k/-h
:以字节单位大小(或者便于阅读的大小格式如GB)显示磁盘使用量。
df -T
:显示文件系统类型,如ext4类型
cp
-p
:会保留原有的时间戳、文件所有者等信息
-d
:复制链接所指向的源文件
-s
:创建新的符号链接文件,指向原符号的链接文件
-u
:只复制更新的文件
tail
默认显示后十行
-n
:指定显示的行数
-f
:实时显示,输出完以后会一直等待,如果有新的内容添加到文件,会动态显示出来
通用相关
grep
grep -i “asdan odajsoia”
:查找字符串
grep -A3 -i “asdan odajsoia” {filename}
:输出匹配成功的行数以及后三行,-B是前三行,C是前后三行
grep -r “asdan odajsoia” *
:在一个文件夹里递归寻找存在指定字符串的文件
sed
使用脚本命令处理文件
一些参数
-i
:插入,在之前插入-a
:新增,在目标行之后,类似于追加吧-d
:删除,后面一般不加东西-s
:代替replace,可以使用正则表达式-c
:替换
在第四行后面插入追加一行newline
sed -e 4a\newline testfile
追加两行的话,需要用斜杠分割
nl /etc/passwd | sed '2a Drink tea or ......\
> drink beer ?'
删除文件的某几行显示出来
使用$是到末尾,2d是第二行,2,5d是2到5行
nl /etc/passwd | sed ‘3,$d’
替换,2到5行换为number
nl /etc/passwd | sed “2,5c No 2-5 number”
替换字符串
sed ‘s/要被取代的字串/新的字串/g’
也可以使用默认分隔符,比如可以指定用5这个字符分割
nl /etc/passwd |sed “s5ftp5445”
多点编辑,就是处理多个操作
删除3到最后一行,日换bash为blueshell
nl /etc/passwd | sed -e ‘3,$d’ -e ‘s/bash/blueshell/’
直接修改文件
在文件末尾添加一行
sed -i ‘$a # This is a test’ regular_express.txt
查看某几行
cat /etc/passwd |sed -n ‘2,5’
awk
其实是一种程序设计语言,可以读取输入文件,对数据进行一些处理。
大致awk ‘{pattern + action}’ {filename}
pattern是匹配的正则表达式,action则是匹配成功后进行的操作。
通常awk是以行读取文件的,读取一行进行相应的操作。
使用参数-F
指定分隔符
这个命令意思是对每一行使用冒号进行分割,然后打印出第一项
awk -F":" ‘{print $1}’ /etc/passed
查询指定20到30行的内容
awk ‘{if(NR>=20 && NR<=30) print $1}’ test.txt
搜索uid=gid的行
awk -F ‘:’ ‘$3=$4’ /etc/passwd
运维相关
crontab
用于定期执行某个命令,每分钟都会查询是否有需要执行的任务,如果有就执行。
在创建以后不会立刻生效,需要等待两分钟。或者重启cron
可以通过-u
参数指定某个用户的日程表,只要有root
指定的时间格式如下:
{分钟} {小时} {一个月中第几日} {月份} {一周第几天} {program}
- 参数为
*
,说明全部执行,不过滤,比如第一个就表示每分钟。 - 设定范围
a-b
,表明a-b分钟或者a-b小时都要执行 - 设定离散
a,b,c
,表明a、b、c分钟或者a、b、c小时都要执行 - 间隔
*/n
:每隔n分钟或者n小时执行一次
每分钟执行/bin/ls
* * * * * /bin/ls
在 12 月内, 每天的早上 6 点到 12 点,每隔 3 个小时 0 分钟执行一次 /usr/bin/backup
0 6-12/3 * 12 * /usr/bin/backup
**每两个小时重启一次apache **
0 */2 * * * /sbin/service httpd restart
每天早上7:50开启ssh,22:50关闭ssh
50 7 * * * /sbin/service sshd start
5022 * * * /sbin/service sshd stop
注意:在每次执行完任务以后,会给用户发邮件,取消的话在命令后面加 > /dev/null 2>&1
>/dev/null 2>&1
先讲一下重定向
这是shell的重定向,在执行shell脚本的时候,我们如果需要将执行的文件结果存储到文件里,就可以使用重定向功能。
执行shell的时候会默认打开三个文件描述符
- 标准输入:0,从键盘获得输入,/proc/self/fd/0
- 标准输出:1,输出到显示器上,/proc/self/fd/1
- 错误输出:2,输出到屏幕上,/proc/self/fd/2
这时候如果重定向将1指向文件,那么结果就会存储到文件里。
输出重定向
如下,fd默认为1标准输出,指将结果输出到指定文件里,如果是>>
,表示追加到文件里。如果是2则重定向错误输出
command {fd}> filename
测试一下,如下
[root@VM-16-8-centos ~]# ls >out
[root@VM-16-8-centos ~]# ls
django out
[root@VM-16-8-centos ~]# ls django/ >out
[root@VM-16-8-centos ~]# cat out
BlueSite
输入重定向
默认fd为0标准输入,即从filename内容作为输入,如果不指定filename,默认读取键盘输入
comand {fd}<filename
如果是双书名号呢,此时会将所有输入的保存在out里,如果读取到了end,就结束,相当于分隔符的作用
cat >out <<end
读取输入保存在文件里
cat >out
将input文件内容输出到out里面
cat >out <input
> /dev/null 2>&1
这是分为两条,其中第一条> /dev/null
表示把标准输出重定向到后者去,这个代表linux的空设备文件,写入进入的数据都会丢失,相当于没有写入,也就是说不会有输出。
第二条2>&1
叫重定向绑定,将错误输出和标准输出用一个文件描述符,也就是会输出到同一个地方,即上面的空设备文件。
一个常用的是nohup command >/dev/null 2>&1 &
,后台运行的程序不让他在前台输出信息。
ps命令
参数:
-e
:显示所有进程-f
:完整格式输出-N
:与指定参数不符的进程-l
:长列表,显示更多信息-j
:显示任务信息-c
:显示进程额外调度器信息
Shell脚本中$0、$?、$!、$$、$*、$#、$@等的意义说明
$0
:shell文件名$?
:$#
:终端跟在shell后面的参数个数$1~$n
:终端跟在shell后面的第n个参数$*、$@
:输出全部参数$!
:最后运行的后台进程的pid$$
:本进程的pid
lsof - [查看一个进程打开哪些文件]
lsof -p pid
可以查看指定进程打开的所有文件信息。
包括普通文件、打开的socket连接、网络文件、管道、字符设备文件等。
如果不带参数显示的是所有打开的文件
lsof -c program
:可以查看指定程序打开的文件
lsof /root/proc
:查看谁正在使用这个文件
还可以查看网络连接情况
lsof -i
:查看所有网络连接情况
lsof -i udp
:查看UDP网络连接情况
lsof -i tcp:3306
:查看TCP指定端口连接情况
一些基础
性能分析
Linux命令:查看磁盘使用情况、查进程、ps哪些参数
查看磁盘使用情况:
df
:查看磁盘使用情况,磁盘空间。比如第二列是能容纳多少个1024字节的块,第三列是已经使用多少个块。常用参数是-h,通常用于按照用户更易读的方式显示大小,如MB或者GB。du
:可以显示某个特定目录下的磁盘使用情况,如是否存在超大文件。默认会显示当前目录下的所有文件和文件夹,递归显示。一些参数有-
-c
:显示出所有已经列出的文件总大小
-
-h
:大小转为用户易读的格式
查看进程:
netstat
一些参数:
-a
:显示所有选项-t、-u
:只显示tcp或者udp-p
:显示建立相关链接的程序名-n
:拒绝显示别名,显示数字啥的
查看端口占用netstat -anp|grep {port}
select / poll和epoll
linux系统中为了处理大量的客户端请求,需要非阻塞式IO和复用。
这三个就是IO复用的三种方式。
select
select函数运行后会进入阻塞状态,直到有请求发来。收到请求有返回值以后,遍历文件描述符,找到就虚的文件描述符进行后续操作。
仅仅知道有IO事件发生了,但是并不知道是哪个,因此需要轮询,同时处理的流越多,时间就越长
时间复杂度O(n)
单个进程限制最大可监视数,32位是1024个,64位式2048个.
对fd的扫描是线性的,很慢
poll
本质上和select差不多,将用户传入的数组拷贝到内核空间,区别就是poll没有最大连接数上线,因为是通过链表进行连接的。
时间复杂度O(n)。
水平触发:如果这一轮报告的事件没有触发,下一轮会继续报告。
epoll
epoll会告诉我们具体某一个流发生了什么IO事件,实际上是事件驱动型的。
时间复杂度O(1)。
分为两个模式,默认的LT和高速ET。
LT模式只要fd还有数据可以读取,就会一直返回报告事件。
ET模式只会报告一次,直到下一次数据到来之前都不会报告了,因此只要有数据就需要一次性读取完。
优点:
没有连接上限,1G内存最多可以监听约10万个端口。
效率提升,不是轮询,只有当活跃的fd才可以触发回调函数,而不活跃的不会理会,因此不受限于最大连接数。
但是在连接少而且所有连接都比较活跃的时候,epoll可能不如前两者,毕竟过多的函数回调会对性能有损失
kill -2和-9
-2:相当使用ctrl-c退出,可能会是正常流程,在退出前没准可以保存一些信息
-9:是强制退出
6个命令空间
- IPC命名空间(进程间通信):将消息队列分离出来
- 进程命名空间:命名空间内的虚拟PID可能会和外面的pid重复,会映射到哇面的另一个pid
- 网络命名空间:用来隔离网络资源,可以虚拟出网卡,而且后台进程可以运行在不同的命名空间的相同端口
- 挂载命名空间:可以将挂载点与系统分离
- UTS命名空间:独立出主机名和网络信息服务
- 用户命名空间:不同空间可以存在相同ID的用户
linux进程五种状态
- 运行:正在运行或者运行队列中等待的
- 中断:休眠、受阻或者阻塞等到某个信号
- 不可中断:收到信号也不会唤醒,进程必须等待有中断发生
- 僵死:进程终止,但是描述符还在,就是僵尸进程
- 停止:收到停止信号以后停止运行
iptables
他里面会有几个链
当一个数据包到达网卡的时候,先进入PREROUTING
链,判断数据包的走向
如果是发向本机的,会到达INPUT
链,然后应用程序就可以接受到了
如果单纯是需要转发,而且内核也是允许转发的,会经过FORDWARD
链,然后经过POSTROUTING
链出去;
当本机程序需要发送数据包的时候,先经过OUTPUT
链,然后再经过POSTROUTING
链。
当一个数据包到达一个链的时候,就会按照规则顺序挨个检查是否匹配。
除了链还有表,表的对应关系如下
- filter(iptable_filter):过滤数据包
- Nat(iptable_nat):用于网络地址转换,IP或者端口
- Mangle(iptable_mangle):修改数据包的服务类型、TTL等参数,配置路由实现QOS等,一般用不上
- Raw(iptable_raw):决定数据包是否被状态跟踪机制处理,用的也不多
在数据包到达的时候,比如先进入PREROUTING链,判断是否需要IP地址转换等,然后进行路由判断如何转发。在这时候,在这个链中会按照表的顺序依次进行匹配。
用户态和内核态
这两个状态是操作系统的两种运行级别。
内核态:运行操作系统程序,操作硬件。执行特权指令(用户无法直接使用)
用户态:运行用户程序,可以运行非特权指令
用户态的时候,能够访问的内存地址空间和对象受到限制,而且CPU是可抢占的;内核态可以访问所有的内存地址空间和系统中的对象,CPU是不可抢占的,独有的。
从用户态切换到内核态的三种方式:
- 系统调用:用户通过系统调用申请使用操作系统提供的服务完成相应工作,比如fork()函数创建新进程就是一个系统调用
- 异常:比如程序运行的时候如果发生了缺页异常之类的情况
- 外围设备中断:当一些设备完成了用户的操作,会发出一个中断信号通知CPU,然后CPU会暂停下一条命令的执行,先去执行中断信号对应的程序