摘要:日常学习中对一些知识点进行总结得出该系列文章。学习笔记内容包括前端技术,Django web开发技术,数据库技术如MySQL,MongoDB,PGSQL等等。此外还有一些工具如Dock,ES等等。(本文原创,转载必须注明出处.)
1 Linux介绍
1.1 基本知识
应用领域:服务器使用 LAMP(Linux + Apache + MySQL + PHP)或 LNMP(Linux + Nginx+ MySQL + PHP)组合。
linux启动:Linux系统的启动过程可以分为5个阶段:
- 内核的引导。当计算机打开电源后,首先是BIOS开机自检,按照BIOS中设置的启动设备(通常是硬盘)来启动。操作系统接管硬件以后,首先读入 /boot 目录下的内核文件。
- 运行 init。init 进程是系统所有进程的起点,你可以把它比拟成系统所有进程的老祖宗,没有这个进程,系统中任何进程都不会启动。init 程序首先是需要读取配置文件 /etc/inittab。/boot /init 进程
- 系统初始化。在init的配置文件中有这么一行: si::sysinit:/etc/rc.d/rc.sysinit 它调用执行/etc/rc.d/rc.sysinit,而rc.sysinit是一个bash shell的脚本,它主要是完成一些系统初始化的工作,rc.sysinit是每一个运行级别都要首先运行的重要脚本。
- 建立终端 。rc执行完毕后,返回init。这时基本系统环境已经设置好了,各种守护进程也已经启动了。
- 用户登录系统。命令行登录、ssh登录、图形界面登录。
运行级别:
- 运行级别0:系统停机状态,系统默认运行级别不能设为0,否则不能正常启动
- 运行级别1:单用户工作状态,root权限,用于系统维护,禁止远程登陆
- 运行级别2:多用户状态(没有NFS)
- 运行级别3:完全的多用户状态(有NFS),登陆后进入控制台命令行模式
- 运行级别4:系统未使用,保留
- 运行级别5:X11控制台,登陆后进入图形GUI模式
- 运行级别6:系统正常关闭并重启,默认运行级别不能设为6,否则不能正常启动
窗口切换:默认登录就是第一个窗口,也就是tty1,这个六个窗口分别为tty1,tty2 … tty6,你可以按下Ctrl + Alt + F1 ~ F6 来切换它们。当你进入命令窗口界面后再返回图形界面只要按下Ctrl + Alt + F7 就回来了。
Linux关机:正确的关机流程为:sync > shutdown > reboot > halt
1
2
3
4
5
6
7
8
9sync 将数据由内存同步到硬盘中。
shutdown –h now 立马关机
shutdown –h 20:25 系统会在今天20:25关机
shutdown –h +10 十分钟后关机
shutdown –r now 系统立马重启
shutdown –r +10 系统十分钟后重启
reboot 就是重启,等同于 shutdown –r now
halt 关闭系统,等同于shutdown –h now 和 poweroffLinux 忘记密码:进入单用户模式更改一下root密码即可。
远程登陆:Linux系统中是通过ssh服务实现的远程登录功能,默认ssh服务端口号为 22。Window系统上 Linux 远程登录客户端有SecureCRT, Putty, SSH Secure Shell等,本文以Putty为例来登录远程服务器。
putty下载地址:http://www.putty.org/
1.2 Linux 系统目录结构
登录系统后,在当前命令窗口下输入命令ls /
- /bin:目录存放着最经常使用的命令。
- /boot:这里存放的是启动Linux时使用的一些核心文件,包括一些连接文件以及镜像文件。
- /dev :dev是Device(设备)的缩写, 该目录下存放的是Linux的外部设备,在Linux中访问设备的方式和访问文件的方式是相同的。
- /etc:存放所有的系统管理所需要的配置文件和子目录。
- /home:用户的主目录,在Linux中,每个用户都有一个自己的目录,一般该目录名是以用户的账号命名的。
- /lib:这个目录里存放着系统最基本的动态连接共享库,其作用类似于Windows里的DLL文件。几乎所有的应用程序都需要用到这些共享库。
- /media:linux系统会自动识别一些设备,例如U盘、光驱等等,当识别后,linux会把识别的设备挂载到这个目录下。
- /mnt:系统提供该目录是为了让用户临时挂载别的文件系统的,我们可以将光驱挂载在/mnt/上,然后进入该目录就可以查看光驱里的内容了。
- /opt: 这是给主机额外安装软件所摆放的目录。比如你安装一个ORACLE数据库则就可以放到这个目录下。默认是空的。
- /proc:这个目录是一个虚拟的目录,它是系统内存的映射,我们可以通过直接访问这个目录来获取系统信息。
- /root:该目录为系统管理员,也称作超级权限者的用户主目录。
- /sbin:s就是Super User的意思,这里存放的是系统管理员使用的系统管理程序。
- /selinux: 这个目录是Redhat/CentOS所特有的目录,Selinux是一个安全机制,类似于windows的防火墙,但是这套机制比较复杂,这个目录就是存放selinux相关的文件的。
- /srv: 该目录存放一些服务启动之后需要提取的数据。
- /sys:该目录下安装了2.6内核中新出现的一个文件系统 sysfs 。sysfs文件系统集成了下面3种文件系统的信息:针对进程信息的proc文件系统、针对设备的devfs文件系统以及针对伪终端的devpts文件系统。
- /tmp:这个目录是用来存放一些临时文件的。
- /usr: 这是一个非常重要的目录,用户的很多应用程序和文件都放在这个目录下,类似于windows下的program files目录。
- /usr/bin:系统用户使用的应用程序。
- /usr/sbin:超级用户使用的比较高级的管理程序和系统守护程序。
- /usr/src:内核源代码默认的放置目录。
- /var:这个目录中存放着在不断扩充着的东西,我们习惯将那些经常被修改的目录放在这个目录下。包括各种日志文件。
- /run:是一个临时文件系统,存储系统启动以来的信息。当系统重启时,这个目录下的文件应该被删掉或清除。如果你的系统上有 /var/run 目录,应该让它指向 run。
1.3 文件操作
文件基本操作
在Linux中第一个字符代表这个文件是目录、文件或链接文件等等。
- 当为[ d ]则是目录
- 当为[ - ]则是文件;
- 若是[ l ]则表示为链接文档(link file);
- 若是[ b ]则表示为装置文件里面的可供储存的接口设备(可随机存取装置);
- 若是[ c ]则表示为装置文件里面的串行端口设备,例如键盘、鼠标(一次性读取装置)。
1 | [root@www /]# ls -l |
文件属主和属组
1 | [root@www /]# ls -l |
- chgrp:更改文件属组,语法:-R:递归更改文件属组,该目录下的所有文件的属组都会更改。
1 | chgrp [-R] 属组名 文件名 |
- chown:更改文件属主,也可以同时更改文件属组,语法:
1 | chown [–R] 属主名 文件名 |
进入 /root 目录(~)将install.log的拥有者改为bin这个账号:
1 | [root@www ~] cd ~ |
将install.log的拥有者与群组改回为root:
1 | [root@www ~]# chown root:root install.log |
- chmod:更改文件9个属性
Linux文件属性有两种设置方法,一种是数字,一种是符号。Linux文件的基本权限就有九个,分别是owner/group/others三种身份各有自己的read/write/execute权限。各权限的分数对照表如下:r:4,w:2,x:1
每种身份(owner/group/others)各自的三个权限(r/w/x)分数是需要累加的,例如当权限为: [-rwxrwx—-] 分数则是:
- owner = rwx = 4+2+1 = 7
- group = rwx = 4+2+1 = 7
- others= —- = 0+0+0 = 0
所以等一下我们设定权限的变更时,该文件的权限数字就是770啦!变更权限的指令chmod的语法是这样的:xyz : 就是刚刚提到的数字类型的权限属性,为 rwx 属性数值的相加。
1 | chmod [-R] xyz 文件或目录 |
举例来说,如果要将.bashrc这个文件所有的权限都设定启用,那么命令如下:
1 | [root@www ~]# ls -al .bashrc |
那如果要将权限变成 -rwxr-xr— 呢?那么权限的分数就成为 [4+2+1][4+0+1][4+0+0]=754。
处理目录的常用命令
ls: 列出目录
cd:切换目录
pwd:显示目前的目录
mkdir:创建一个新的目录
rmdir:删除一个空的目录
cp: 复制文件或目录
rm: 移除文件或目录
mv: 移动文件与目录,或修改文件与目录的名称
文件内容查看
cat 由第一行开始显示文件内容
tac 从最后一行开始显示,可以看出 tac 是 cat 的倒著写!
nl 显示的时候,顺道输出行号!
more 一页一页的显示文件内容
less 与 more 类似,但是比 more 更好的是,他可以往前翻页!
head 只看头几行
tail 只看尾巴几行
1.4 用户和用户组
实现用户账号的管理,要完成的工作主要有如下几个方面:
用户账号的添加、删除与修改。
1
useradd –d /usr/sam -m sam
用户口令的管理。用户管理的一项重要内容是用户口令的管理。用户账号刚创建时没有口令,但是被系统锁定,无法使用,必须为其指定口令后才可以使用,即使是指定空口令。
用户组的管理。用户组的管理涉及用户组的添加、删除和修改。组的增加、删除和修改实际上就是对/etc/group文件的更新。
1.5 磁盘管理
Linux磁盘管理好坏直接关系到整个系统的性能问题。Linux磁盘管理常用三个命令为df、du和fdisk。
df:列出文件系统的整体磁盘使用量,可以利用该命令来获取硬盘被占用了多少空间,目前还剩下多少空间等信息。
du:检查磁盘空间使用量,Linux du命令是对文件和目录磁盘使用的空间的查看。
fdisk:用于磁盘分区
列出所有分区信息:fdisk -l
1.6 vim 编辑器
Vim是从 vi 发展出来的一个文本编辑器。代码补完、编译及错误跳转等方便编程的功能特别丰富,在程序员中被广泛使用。
基本上 vi/vim 共分为三种模式,分别是命令模式(Command mode),输入模式(Insert mode)和底线命令模式(Last line mode)。 这三种模式的作用分别是:
(1)命令模式
户刚刚启动 vi/vim,便进入了命令模式。此状态下敲击键盘动作会被Vim识别为命令,而非输入字符。比如我们此时按下i,并不会输入一个字符,i被当作了一个命令。以下是常用的几个命令:
- i 切换到输入模式,以输入字符。
- x 删除当前光标所在处的字符。
- : 切换到底线命令模式,以在最底一行输入命令。
若想要编辑文本:启动Vim,进入了命令模式,按下i,切换到输入模式。命令模式只有一些最基本的命令,因此仍要依靠底线命令模式输入更多命令。
(2)输入模式
在命令模式下按下i就进入了输入模式。在输入模式中,可以使用以下按键:
- 字符按键以及Shift组合,输入字符
- ENTER,回车键,换行
- BACK SPACE,退格键,删除光标前一个字符
- DEL,删除键,删除光标后一个字符
- 方向键,在文本中移动光标
- HOME/END,移动光标到行首/行尾
- Page Up/Page Down,上/下翻页
- Insert,切换光标为输入/替换模式,光标将变成竖线/下划线
- ESC,退出输入模式,切换到命令模式
(3)底线命令模式
在命令模式下按下:(英文冒号)就进入了底线命令模式。底线命令模式可以输入单个或多个字符的命令,可用的命令非常多。在底线命令模式中,基本的命令有(已经省略了冒号):
- q 退出程序
- w 保存文件
按ESC键可随时退出底线命令模式。简单的说,我们可以将这三个模式想成底下的图标来表示:
使用案例
创建文件,按下i进入编辑模式,Esc回到一般模式,:wq保存且退出,:q退出
1
vim runoob.txt
常见按键
1.7 yum 命令
yum( Yellow dog Updater, Modified)是一个Shell前端软件包管理器。可以自动处理依赖性关系,并且一次安装所有依赖的软体包,无须繁琐地一次次下载、安装。yum提供了查找、安装、删除某一个、一组甚至全部软件包的命令,而且命令简洁而又好记。
- 常见命令
- 1.列出所有可更新的软件清单命令:yum check-update
- 2.更新所有软件命令:yum update
- 3.仅安装指定的软件命令:yum install
- 4.仅更新指定的软件命令:yum update
- 5.列出所有可安裝的软件清单命令:yum list
- 6.删除软件包命令:yum remove
- 7.查找软件包 命令:yum search
- 8.清除缓存命令:
- yum clean packages: 清除缓存目录下的软件包
- yum clean headers: 清除缓存目录下的 headers
- yum clean oldheaders: 清除缓存目录下旧的 headers
- yum clean, yum clean all (= yum clean packages; yum clean oldheaders) :清除缓存目录下的软件包及旧的headers
2 Shell编程
2.1 基础知识
Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。Shell 既是一种命令语言,又是一种程序设计语言。Shell 脚本(shell script),是一种为 shell 编写的脚本程序。shell 和 shell script 是两个不同的概念。新建一个文件 test.sh,扩展名为 sh(sh代表shell)保存为 test.sh,并 cd 到相应目录:
1 |
|
(1)作为可执行程序运行
1 | chmod +x ./test.sh #使脚本具有执行权限 |
(2) 作为解释器参数运行
1 | /bin/sh test.sh |
- shell变量,变量名和等号之间不能有空格
1 | your_name="runoob.com" |
1 | for file in `ls /etc` |
以上语句将 /etc 下目录的文件名循环出来。
- 定义只读变量
1 |
|
- 删除变量
1 | unset variable_name |
- 变量类型,运行shell时,会同时存在三种变量:
- 1) 局部变量 局部变量在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量。
- 2) 环境变量 所有的程序,包括shell启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行。必要的时候shell脚本也可以定义环境变量。
- 3) shell变量 shell变量是由shell程序设置的特殊变量。shell变量中有一部分是环境变量,有一部分是局部变量,这些变量保证了shell的正常运行
- 拼接字符串
1 | your_name="runoob" |
- 获取字符串长度
1 | string="abcd" |
- 提取子字符串,第 2 个字符开始截取 4 个字符
1 | string="runoob is a great site" |
- 查找子字符串,查找字符 i 或 o 的位置(哪个字母先出现就计算哪个):
1 | string="runoob is a great site" |
- shell数组,bash支持一维数组(不支持多维数组),没有限定数组大小。数组
元素用"空格"符号
分割开。定义数组的一般形式为:
1 | 数组名=(值1 值2 ... 值n) |
可以不使用连续的下标,而且下标的范围没有限制。
1 | array_name[0]=value0 |
读取数组,使用 @ 符号可以获取数组中的所有元素
1
2
3${数组名[下标]}
valuen=${array_name[n]}
echo ${array_name[@]}获取数组长度
1
2
3
4
5
6# 取得数组元素的个数
length=${#array_name[@]}
# 或者
length=${#array_name[*]}
# 取得数组单个元素的长度
lengthn=${#array_name[n]}shell注释。每一行加一个 # 号设置多行注释,
2.2 Shell传参
向脚本传递参数,脚本内获取参数的格式为:$n。n 代表一个数字,1 为执行脚本的第一个参数,2 为执行脚本的第二个参数,以此类推……
1 |
|
为脚本设置可执行权限,并执行脚本,输出结果如下所示:
1 | $ chmod +x test.sh |
- $* 与 $@ 区别:
- 相同点:都是引用所有参数。
- 不同点:只有在双引号中体现出来。假设在脚本运行时写了三个参数 1、2、3,,则 “ * “ 等价于 “1 2 3”(传递了一个参数),而 “@” 等价于 “1” “2” “3”(传递了三个参数)。
2.3 运算符
原生bash不支持简单的数学运算,但是可以通过其他命令来实现,例如 awk 和 expr,expr 最常用。expr
是一款表达式计算工具,使用它能完成表达式的求值操作。
(1)算数运算符:乘号(*)前边必须加反斜杠()才能实现乘法运算;if…then…fi 是条件语句.
(2)关系运算符
(3)布尔运算符
(4)字符串运算符
(5)文件测试运算符
2.4 echo
换行
结果定向到文件
1 | echo "It is a test" > myfile |
显示当前时间
1
echo `date`
2.5 printf命令
%s %c %d %f都是格式替代符;%-10s 指一个宽度为10个字符(-表示左对齐,没有则表示右对齐),任何字符都会被显示在10个字符宽的字符内,如果不足则自动以空格填充,超过也会将内容全部显示出来。%-4.2f 指格式化为小数,其中.2指保留2位小数。
3 流程控制
3.1 if-else-fi
Python,Java、PHP等语言不一样,sh的流程控制不可为空.
3.2 for
3.3 while
使用中使用了 Bash let 命令,它用于执行一个或多个表达式,变量计算中不需要加上 $ 来表示变量
3.4 case
取值后面必须为单词in,每一模式必须以右括号结束。取值可以为变量或常数。匹配发现取值符合某一模式后,其间所有命令开始执行直至 ;;。取值将检测匹配的每一个模式。一旦模式匹配,则执行完匹配模式相应命令后不再继续其他模式。如果无一匹配模式,使用星号 * 捕获该值,再执行后面的命令。下面的脚本提示输入1到4,与每一种模式进行匹配:
1 | echo '输入 1 到 4 之间的数字:' |
3.5 break
1 |
|
3.6 continue
1 |
|
4 函数
4.1 函数的使用
1 |
|
函数返回值在调用该函数后通过 $? 来获得。
4.2 函数参数
在Shell中,调用函数时可以向其传递参数。在函数体内部,通过 n 的形式来获取参数的值,例如,$1表示第一个参数,$2表示第二个参数…
1 | funWithParam(){ |
4.3 重定向
- 输出重定向
1 | $ echo "菜鸟教程:www.runoob.com" >> users |
输入重定向
一般情况下,每个 Unix/Linux 命令运行时都会打开三个文件:
- 标准输入文件(stdin):stdin的文件描述符为0,Unix程序默认从stdin读取数据。
- 标准输出文件(stdout):stdout 的文件描述符为1,Unix程序默认向stdout输出数据。
- 标准错误文件(stderr):stderr的文件描述符为2,Unix程序会向stderr流中写入错误信息。
默认情况下,command > file 将 stdout 重定向到 file,command < file 将stdin 重定向到 file。注意:0 是标准输入(STDIN),1 是标准输出(STDOUT),2 是标准错误输出(STDERR)。
1 | command 2 > file |
4.4 文件包含
test1.sh 代码如下:
1 |
|
test2.sh 代码如下:
1 |
|
接下来,我们为 test2.sh 添加可执行权限并执行:
1 | $ chmod +x test2.sh |
注:*被包含的文件 test1.sh 不需要可执行权限*
5 Nginx
Nginx(“engine x”)是一款是由俄罗斯的程序设计师Igor Sysoev所开发高性能的 Web和 反向代理 服务器,也是一个 IMAP/POP3/SMTP 代理服务器。在高连接并发的情况下,Nginx是Apache服务器不错的替代品。
技术交流共享QQ群
【机器学习和自然语言QQ群:436303759】:
机器学习和自然语言(QQ群号:436303759)是一个研究深度学习、机器学习、自然语言处理、数据挖掘、图像处理、目标检测、数据科学等AI相关领域的技术群。其宗旨是纯粹的AI技术圈子、绿色的交流环境。本群禁止有违背法律法规和道德的言谈举止。群成员备注格式:城市-自命名。微信订阅号:datathinks