1. linux 起源
由unix -> linux
2. linux 哲学
小即是美
让每个程序只做好一件事
尽快建立原型 (快速完成,先跑的对,再跑的好)
可移植性比效率更重要
使用纯文本文件存储数据(易于阅读,通用)
重复利用软件杠杆效应(软件与软件组合)
避免强制性用户界面(利于自动化)
让每一个程序都成为过滤器(即管道,重复实现组合)
人类创造的三个系统
什么样的程序该减肥?
传递给函数的参数过多,超过4个;
子程序长度超过一个屏幕
要靠阅读注释,才能记住子程序在做什么
目录中文件列表的长度一屏幕放不下
某个文件已经很难控制,无法定义全局变量
已经无法记起一个给定的错误信息是在什么条件下引发的。
===> 函数拆分,或者抽象方法
3.linux 一些次要准则
使用小写字母,尽量保持简短
沉默是金,没有消息就是好消息
并行思考
寻找90%的解决方案:允许不完美
更坏就是更好:包容
层次化思考:/ 目录结构 思路更加清晰
K.I.S.S 简单又傻瓜
4. linux 启动过程
①BIOS (基本输入输出系统) 检查硬件,读取主启动磁盘MBR区的引导加载程序(Boot Loader)并执行,显示给用户一个选择界面。
②用户选择要启动的系统,即选定了相应的内核(vmlinuz),Boot Loader 通过initrd(初始RAM磁盘) 在内存中建立一个供内核使用的临时文件系统,然后由内核程序接管后续启动流程。
③内核开始初始化系统中的各部分硬件。此时操作系统的基本环境已建立,但还没有用户程序可供人使用,于是内核继续执行,启动linux世界中的造物主 — /sbin/init 进程
④/sbin/init 进程启动后,自然成为linux中所有进程的父/爷进程。它会首先调用 /etc/rc.d/rc.sysinit 脚本,完成设置环境变量,交换分区,初始化系统时钟等工作。然后调用 /etc/inittab (配置文件) ,执行相应运行级别下的程序脚本 (/etc/rc.d/rc<x>.d/*)启动或杀掉相应进程
⑤各启动脚本执行完毕后,init 按 /etc/inittab(配置文件) 中的配置启动相应的控制台交互界面,提示用户登录(字符界面下默认有6个虚拟控制台,Alt + Fx 切换)
启动过程简要描述:
①BIOS (基本输入输出系统) 检查硬件,读取主启动磁盘MBR区的引导加载程序(Boot Loader)并执行,显示给用户一个选择界面。
②用户选择要启动的系统,Boot Loader 通过initrd(初始RAM磁盘) 在内存中建立一个供内核使用的临时文件系统,然后由内核程序接管后续启动流程。
③内核开始初始化系统中的各部分硬件。
④启动/sbin/init 进程
⑤ /sbin/init 进程调用 /etc/rc.d/rc.sysinit 脚本,完成设置环境变量,交换分区,初始化系统时钟等工作。
⑥ /sbin/init 调用 /etc/inittab (配置文件) ,执行相应运行级别下的程序脚本启动或杀掉相应进程(这里可以设置程序自动启动)
⑦各启动脚本执行完毕后,/sbin/init 按 /etc/inittab(配置文件) 中的配置启动相应的控制台交互界面,提示用户登录
设置程序自动启动的方法:
① /etc/rc.d/rc.local 中 写启动命令
② /etc/rc.d/init.d/* 写 shell 脚本,然后在 /etc/rc*.d 中建立软连接
③使用chkconfig 工具,如chkconfig — level 2345 auditd on.
5. linux 命令帮助文档
man
info:GNU 项目推荐的新一代文档格式,功能更强
命令 — — helf
6. Linux 的目录结构
/ 根目录
|boot 开机启动有关
|usr 主要包含用户级的应用程序
| bin 应用程序
| lib 公共库
|__ share 共享文件
|__ include 包含的公共的可以用的文件或代码
|__ etc 配置文件
|__ home 家文件目录
|__ yangck 用户
|__ .bashrc 环境配置文件
|__ .mozilla 特定程序独有
|__ Desktop 桌面
|__ Pictures 自己设置
|__ Music 自己设置
|__ dev 用于存放设备文件
|__ proc 系统当前的进程和属性
7. Linux 中的文件及权限
-rwx r-x r-xwei
4+2+1
4+0+1
4+0+1
755
user 文件所有者
group 所属用户组
others 其他人
read 4 读
write 2 写
execute 1 执行
为什么普通用户可以执行 passwd ,修改 /etc/passwd?
如何让普通用户只能追加写文件,不能删除文件?
chattr + a /var/log/access_log
chattr: chattr命令用于改变文件属性
如何让用户只能读或者创建PHP的配置文件,但是不允许修改?
chattr + i /etc/php.ini
8. linux 磁盘相关
df 查看磁盘空间占用
du 统计文件占用空间
fdisk 分区管理
mkfs.ext3 磁盘格式化
mount 磁盘挂载
umount 磁盘卸载
ext2 ext3 ext4 对比
linux 内核所用的文件系统
文件系统:在存储设备上组织文件的方法
独立磁盘冗余阵列(RAID,redundant array of independent disks)是把相同的数据存储在多个硬盘的不同的地方(因此,冗余地)的方法
磁盘组织
Raid0 写的快,没备份
Raid1 写的慢,有备份
Raid5 兼容前两者优点,缺点有可能文件系统和磁盘在同一个
Raid10 相当于0和1
大部分通过硬件来实现的
9. 查找文件
find / -name chuankun.php - print (默认)
find . -type f 查找本目录下所有的文件
find . -type d 查找本目录下所有的目录
find ./ -name “chuankun.php” -exec php {} ;
find [路径] [选项] [查找规则] [动作]
which 查找环境变量PATH 下的可执行文件及别名
whereis 查找系统常见目录中的可执行文件、文档、源代码、配置文件等
locate 通过索引数据库查找文件 查找速度快
10. 文本工具
cat 查看文件内容
head 查看文件头部
tail 查看文件尾部
more 分页查看文件内容
less 更强的分页查看文件内容
cut 按列查看文件内容 默认以TAB 分割
cut -d: -f1 /etc/passwd
-d 指定分隔符
-f 指定输出的字段
sort 对文件内容排序 默认ASCII顺序排序
sort -n -k3 -t: /etc/passwd
-n 按数字排序
-t 指定列的分隔符
-r 倒序排列
sort -t: -k6nr -k3n /etc/passwd
按第6列倒序排列,第3列正序排列
uniq 对文件内容排重, -c 可统计重复行数量
diff 对比文件内容
grep 查找文件内容,输出匹配的行
grep [选项] 正则表达式 [文件]
grep -cP ‘bot|spider’ ./access.log
查询日志文件中出现bot或spider关键词的行数
-c 输出匹配到的行数
-P 使用正则
-E 更强大的正则
split 按行、字节等切分并输出文件
wc 字节、单词、行计算
面试题:需求:分析网站访问日志文件,找出访问量最大的前10个IP地址,降序排列
找出IP,每行1个
cut -d “ “ -f1 ./access.log
去重并计数
uniq -c
排序
sort -n -r
取前10行
head 10
cut -d “ “ -f1 ./access.log | sort | uniq -c | sort -n -r | head -10
linux 命令 简单好用组合性高
11. linux 管道
linux 中有三个系统文件描述符: 0 标准输入 1标准输出 2 标准错误输出
管道是linux进程间通信的方式之一
管道像一根供数据流通的单向管道
所有linux程序的标准输出都可以通过管道传递给另一个程序作为标准输入
find ./ -type f -name “*.php” -print0 | xargs -0 wc -l
xargs 从标准输入中构建并执行指定命令
xargs -0 wc -l 从标准输入中读取数据,以\0 (null) 字符分割,再以空格合并,然后传递给wc -l 作为参数并执行
12. 输入/输出重定向
怎么保存下来结果,可以用输出重定向
符号 可重定向输出位置
< 符号 重定向输入位置
ls -l > ls_output.log 将标准输出重定向到ls_output.log 文件
ls -l >> ls_append.log 将标准输出重定向 追加到 ls_append.log 文件
ls -l 1> ls_output.log 2> ls_error.log 将标准输出重定向ls_output.log 标准错误输出重定向到 ls_error.log 文件
ls -l 1> ls_out.log 2> &1 标准错误输出重定向和标准输出地方一样
more < xxx.txt 输入重定向
不想要重定向的文件:
删除 或者 > /dev/null 可以重定向到黑洞文件 (相当于系统定义的一个空文件)
13. Linux系统管理
ps 命令 显示当前进程
-ef 显示带启动命令行的进程信息
-u root 显示某用户的进程
-A 显示全部进程
-ejH 显示进程树
kill 命令 : 向进程发送信号,常用于终止某进程
kill -s PID
-s 指定信号
-l 所有信号标识列表
kill -9 PID 可用于强制退出某进程
kill -9 -1 把当前登录界面的所有进程都kill掉 慎用
killall 可用于通过进程名称发送信号
fg命令:将后台任务调到前台
命令后加 & 或 Ctrl + Z 可将任务转到后台执行
后台执行中的任务,可以通过fg %任务序号 调到前台
crontab:让命令自动定时运行
netstat 查看网络状态
netstat -alpn 查看所有网络连接状态,带进程名称
Ifconfig 查看网卡配置, ip 地址信息
iptables linux 防火墙 好东西
service iptables start 启动服务
可以控制访问ip或被访问ip
iptables -A OUTPUT -d 8.8.8.8 -j DROP
禁止服务器访问指定ip地址
iptables -A INPUT -s 8.8.8.8 -p tcp —destination-port 80 -j DROP
禁止某IP访问服务器的80端口
service iptables save 保存规则 ,否则重启失效
iptables -L -n --line-numbers 列出当前配置及规则号
iptables -D INPUT 4 删除INPUT 类第4号规则
iptables -F 清除所有规则
top 命令 : 显示系统进程资源占用情况
top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器
常用操作:
P 按CPU 使用量排列
M 按内存使用量排列
h 显示帮助
q 退出
1 多CPU 显示
k 杀死进程
r 设置进程nice 级别
内容:
load average: 0.00, 0.03 0.05
平均负载: 最近1分钟,最近5分钟,最近15分钟
load < 1 系统空余资源丰富
load=1 利用充分
load>1 系统超载
多核 最佳状态为 cpu 数量 x 0.8
各列参数的含义
软件中断和硬件中断对比
同步与异步事件
PC总线是不是被占用,占用 不占用
级别高低
不能被忽略与可以被标记
执行过程中发生中断,外设发生中断
不用外设,用于外设。
14. shell 语言
解放生产力,提高自动化水平
让程序自动化运行和维护
shell 参数
shell 流程控制
命令列表
函数
通配符
*任意字符串
?单个字符
[abc] a或b或c
[^abc] 非(a或b或c)
{php, java} php 或 java
ls /etc/cron.{daily,weekly}
两个目录罗列
shell语法
变量:字符串、数字,环境变量,参数
条件判断:shell 中的布尔值
程序控制:if\elif\for\while\…
命令列表
函数
内置命令
获取命令的执行结果
shell 变量
foo=bar
区分大小写
等号两边无空格
所有变量都是字符串
环境变量
与系统相关的一些全局变量,常用的有
$HOME 当前用户的家目录
$PATH 搜索命令列表,以冒号分割
$0 shell 脚本文件名
$# 传递给脚本的参数个数
$$ shell 脚本进程号 PID 可用于生成唯一的临时文件
$PS1 命令提示符
$PS2 二级命令提示符,一般为>
$IFS 输入域分隔符,通常为空格,制表符、换行符
参数变量
与参数相关的变量
$1, $2, …$n 第n个参数
$* 以IFS 分隔的所有参数
$@ 以空格分隔的所有参数
$# 参数个数
条件判断
test或 [] 用于执行常见判断
if test -f foo.php
then
…
fi
if [ -f foo.php]
then
…
fi
test 字符串比较
str1 = str2
str1 != str2
-n str 字符串不为空作为真
-z str 字符串为null (空) 为真
test 算术比较
exp1 -eq exp2 相等
-ne 不等
-gt 大于
-ge 大于等于
-lt 小于
-le 小于等于
! 非
test 文件测试
-d file 为目录
-f 为文件
-e 存在
-s 大小不为0
-r 可读
-w 可写
-x 可执行
case 语句
for循环
while 循环
until语句
shell 命令列表
and 列表 state1 && state2 && state3
or 列表 state1 || state2 || state3
语句块
多条命令包起来
shell 函数
func() {}
1.函数调用时,脚本的位置参数( $* $@ $# $1 $2 …) 会被替换为函数的参数,函数执行完毕后,会恢复原值
函数中的变量默认为全局作用域,除非使用local关键字
3.通过return 命令可以让函数返回数字值,常用于表示函数是否成功。
如果返回字符串值,则需要在函数中echo,然后函数外使用 $(func) 捕获。或者将字符串保存在一个变量中,函数执行完毕后读取该变量
4.如果函数没有使用return 指定返回值,则函数返回值为最后一条命令的退出码( $? 捕获返回值)
15. AWK
awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大。简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理。
16.SED
Sed是一种非交互式的流编辑器,利用脚本来处理文本文件。
网友评论