读书笔记-linux私房菜

linux

《Linux私房菜》阅读笔记整理

chapter 0

计算机的五大单元 - 输入 输出 CPU内部的控制单元和算数逻辑单元 内存javascript

CPU

central processing unitphp

主要做用,管理和运算 (算数逻辑单元,控制单元) - 前者负责程序运算和逻辑判断 后者负责协调各个组件与各个单元之间的工做html

CPU的重点在与 运算和判断,这些数据来自于内存. 内存则从输入单元传输进来,CPU处理完毕以后先传递给内存,再从内存传输到输出单元java

目前主流的CPU是双核以上,本来的单核是指仅有一个运算单元,多核是指在一个CPU壳子里装了多个运算内核node

CPU 的性能对比

1 内部的微指令集linux

2 CPU的频率 -- 每秒CPU的工做次数 这个数值越高 表明单位时间内能够作更多的事情webpack

好比某款CPU频率 3GHZ 则其每秒可进行 3 x 10的9次方 工做c++

外频 倍频

为了加速计算速度,CPU开发商就在CPU内部加上一个加速功能git

外频 : CPU与外部组件进行数据传输,运算的频率程序员

倍频: CPU内部用来加速性能的一个倍数

二者相乘才是CPU的频率

  • 超频 -- 有人喜欢将CPU的倍频或者外频经过主板的设定更改成较高频率,但由于CPU的倍频通常在出厂的时候会被肯定没法更改,因此通常修改的是外频

好比 3GHZ的CPU设置为超频 能够将外频 333HZ 调整到 400 MHZ 这样主板各个组件运行频率增高 CPU能够到达 3.6GHZ 可是可能形成死机

软件程序运行

设计出一种人类能看懂的语言,而后创造一种“编译器”来将人类写的程序语言转换为机器语言,常见的编译器语言,c c++

操做系统

一组程序,用来管理计算机全部活动以及驱动系统中全部硬件

让CPU开始判断逻辑与运算数值,让内存开始加载数据

以上就是操做系统的内核

硬件由内核管理,那想要去开发软件,就须要去参考这个内核的先关功能,所以操做系统提供了一组开发接口出来

1 操做系统的内核是参考硬件规格写的,因此同一个操做系统不能在不一样的硬件架构下运行

2 应用程序的开发是参考操做系统提供的开发接口,因此该应用程序只能在该操做系统中运行

// 直接操做一个硬件设施
音箱 -- 请播放音乐 “黑白格”

// 使用内核
function play (music) {
  const target = '音箱'
  target.播放音乐(music)
}

好比,window的软件不能再Linux中运行

内核

内核主要在于管理硬件,提供合理的资源分配,好比CPU资源 内存使用资源等

  • 程序管理

多任务环境 --- 一部计算机可能同时有不少工做在等待CPU运算处理,内核须要控制这些工做,让CPU作有效分配

良好的CPU调度机制(CPU先让那个工做开始运行),能够加快总体系统性能

  • 内存管理

控制系统的内存

系统全部的程序代码和数据都必需要先放在内存里

  • 文件系统管理

好比数据输入输出 I/O

若是内核不认识某个文件系统,则没法使用此格式的文件

  • 设备驱动

内存

CPU读取的数据都来自与内存,无论是软件程序仍是数据,都要先读入内存才能够被使用

我的计算机的内存为

内存容量也很重要,由于数据要先存入内存中

通常内存越大 系统越快,由于不用释放内存内部数据

硬盘

存储数据,实际的数据是写在具备磁性物质的盘片上

linux vs unix

chapter 1

什么是Linux

linux 就是一套操做系统

计算机由一堆硬件设备组成,操做系统用户管理控制这些硬件资源(内核)

不止如此,为了程序员能够更好的开发软件,操做系统还提供了一组系统调用接口

Linux 提供了一个完整的操做系统中,最底层的硬件控制和资源管理的完整架构,这个是沿用Unix而来的,至关稳定且强大

Linux distributions

linux 是操做系统最底层的内核以及其提供的内核管理工具,任何均可以获取源码并执行这个内核程序

随着Linux使用者逐渐增多,能够在Linux上运行的软件也愈来愈多,Linux + 各类软件 就能够是一个至关完整的操做系统

为了让用户能够接触到Linux,有人将 Linux 与可运行的软件集成起来,加上 一个可让用户以光盘或者网络直接安装或者管理Linux系统,咱们称这一整套 可彻底安装的系统为 Linux distribution --- 可彻底安装套件

  • 常见的几个 Linux distribution

red hat - 红帽子

ubuntu -- 无班图

centos

  • Linux distribution 使用的都是 www.kernel.org 中提供的Linux内核,各家使用的软件大同小异,最大的差异在于软件的安装模式
  • 查看当前是什么 distribution
lsb_release -a

chapter 3

每个组件或者设备在Linux下都是一个文件

磁盘

主要有 盘片 机械手臂 主轴马达组成

分区

最简单的分区: 区分根目录 与内存交换空间 swap 便可

稍微麻烦一点:将一些读写频繁的重要目录,与根目录独立出来,好比 /, /usr, /var 等

chapter4

内存交换空间是指?

当有数据被存放在物理内存中,可是这些数据不是常被CPU所取用,那么这些不常被使用的程序将会被丢到硬盘的swap交换空间中,而将速度较快的物理内存空间释放出来给真正须要的程序使用

因此若是系统不忙,内存又打,就不须要swap了

chapter 5

基础

命令的格式

commond [option]
  • 区分大小写
  • 按下enter以后开始执行命令

一些简单的命令

命令 含义
date 获取日期
cal 获取日历
bc 进入计算器模式
  • cal

只是输入 cal 是展现当前月份的日历

cal // 当前月份
cal 2018 // 2018的全部月
cal 8 2018 // 2018 8月
  • bc 进入计算器模式

输入 quit 而后回车 能够自动退出计算器模式


重要的按键

  • tab 命令补齐 和 文件名补齐
  • ctr + c 终止当前命令

Linux在线求助 man page

好比想查看关于date 命令的一些信息

man date

man date

看下第一行这里是个 DATE(1)

1

这里的数字含义是 (这里列几个常见的)

数字 含义
1 用户在shell环境中可操做的命令或者更可执行的文件
4 设备文件
5 配置文件或者是某些文件的格式
8 系统管理员可用的管理命令

Linux在线求助 info page

另一种在线求助命令 info page

基础命令

关机 shutdown

数据同步写入硬盘 sync

重启 reboot halt poweroff

数据在计算机中运行的模式: 全部的数据都得要被读入内存后才可以被CPU所处理,可是数据又经常须要由内存写回硬盘当中(例如储存的动做)。 因为硬盘的速度太慢(相对于内存来讲),若是经常让数据在内存与硬盘中来回写入/读出,系统的效能就不会太好

所以在Linux系统中,为了加快数据的读取速度,因此在默认的状况中, 某些已经加载内存中的数据将不会直接被写回硬盘,而是先缓存在内存当中,如此一来, 若是一个数据被你重复的改写,那么因为他还没有被写入硬盘中,所以能够直接由内存当中读取出来, 在速度上必定是快上至关多的!

不过,如此一来也形成些许的困扰,那就是万一你的系统由于某些特殊状况形成不正常关机 (例如停电或者是不当心踢到power)时,因为数据还没有被写入硬盘当中,会形成数据不正常啦! 那要怎么办呢?这个时候就须要sync这个命令来进行数据的写入动做啦! 直接在文字接口下输入sync,那么在内存中还没有被升级的数据,就会被写入硬盘中!因此,这个命令在系统关机或从新启动以前,最好多运行几回

目前的 shutdown/reboot/halt 等等命令均已经在关机前进行了 sync 命令

chapter 6

文件权限与目录配置

三种身份

文件全部者、用户组、其余人

身份

系统中全部的账号与通常身份使用者,以及root的相关信息, 都是记录在/etc/passwd文件中,每一个人的密码则是记录在/etc/shadow文件中,此外,全部的组群名称记录在/etc/group文件中

  • 用户
Linux系统是一个多用户多任务的分时操做系统,任何一个要使用系统资源的用户,都必须首先向系统管理员申请一个帐号,而后以这个帐号的身份进入系统
  • 用户组
每一个用户都有一个用户组,系统能够对一个用户组中的全部用户进行集中管理。不一样Linux 系统对用户组的规定有所不一样,如Linux下的用户属于与它同名的用户组,这个用户组在建立用户时同时建立

ls -al 查看当前目录下文件的信息

ls 显示文件的文件名和相关属性

al 列出文件详细的权限的属性

-rw-r--r--   1 zhengzaijiazai  staff       66  4 25 10:21 .gitignore
drwxr-xr-x   2 zhengzaijiazai  staff       68  4 25 11:32 dist
  • drwxr-xr-x

rwx

d rwx r-x r-x

按照 1 3 3 3 的格式进行拆分

命令 含义
d 第一个字符 表明这个是目录 文件 或者 连接文件等
rwx 文件全部者的权限
r-x 文件同用户组的权限
r-x 其余非本用户的权限

r (read)可读 w (write) 可写 x (execute)可执行

文件权限的意义

对于文件

r 表明是否能查看文件的内容
w 表明可否对文件的内容进行操做,可是不能删除文件
x 表明可否被系统执行

对于目录

目录的主要内容是记录文件名列表

r 表示能够读取目录结构列表

w 表示具备更改目录列表的权限

w权限对于文件的含义
建立新的文件与目录
删除文件和目录(无论文件权限)
将已存在的文件与目录重命名
移动文件,目录位置

总而言之,目录的w权限与该目录下的文件名变更有关系

x 表示用户可否进入目录 好比cd 进入此目录


test time

有一个目录权限为

drwxr--r-- 3 root root .......

当前系统帐号为 userA userA不属于root组 那么 userA 对于这个帐户有什么权限, 能切换到此目录中吗

  • answer

userA 具备 读的权限

而进行目录切换是须要X的权限 因此不能够切换到此目录


修改文件的属性、权限

命令 含义
chgrp xxx filename 改变文件所属用户组
chown xxx filename 改变文件全部者
chmod xxx filename 改变文件的权限

chgrp (change group)

要改的那个组必须在 /etc/group 中存在 不然会报错

chgrp read.md groupB

chown (change owner)

要改的那个用户必须在 /etc/passwd 中有记录 不然会报错

chown read.md userB

chown

chmod 改变权限

  • 使用分数

使用分数也能够表明权限

命令 分数
r 4
w 2
x 1

rwx 7
rw- 6
r-x 5

  • 使用符号类型

有三种身份,就用 u g o 表明三种身份的权限

身份 字符
用户 u
用户组 g
其余人 o
全部身份 a
命令 含义
+ 增长
- 减去
= 设置

好比 须要设置一个文件的权限为 -rwxr-xr-x

则u 为rwx g/o 为 r-x

chmod u=rwx,go=rx readme.md
// 若是是给每一身份增长 w 权限
chmod a+w read.md

文件种类

任何设备都是文件

使用 ls -l 中第一个字符就是文件种类

分类

  • 普通文件文件

    ls -al 所显示出来的属性方面,第一个字符为 [ - ],例如 [-rwxrwxrwx ]。另外,依照文件的内容,又大略能够分为:纯文本 二进制文件 数据格式文件

  • 目录
  • 连接文件

好比: 快捷方式

  • 设备与设备文件

文件扩展名

与 window中的有很大不一样

在Windows底下, 能被执行的文件扩展名一般是 .com .exe .bat等等,而在Linux底下,只要你的权限当中具备x的话,例如[ -rwx-r-xr-x ] 即表明这个文件能够被执行

一般咱们仍是会以适当的扩展名来表示该文件是什么种类的。底下有数种经常使用的扩展名:

1 .sh : 脚本或批处理文件 (scripts),由于批处理文件为使用shell写成的,因此扩展名就编成 .sh ;

2 .Z, .tar, .zip : 通过打包的压缩文件。这是由于压缩软件分别为 gunzip, tar 等等的,因为不一样的压缩软件,而取其相关的扩展名

3 .html, .php:网页相关文件,分别表明 HTML 语法与 PHP 语法的网页文件

基本上,Linux系统上的文件名真的只是让你了解该文件可能的用途而已, 真正的执行与否仍然须要权限的规范才行

例如虽然有一个文件为可执行文件, 如常见的/bin/ls这个显示文件属性的指令,不过,若是这个文件的权限被修改为没法执行时, 那么ls就变成不能执行

目录配置

标准 FHS

为何每套Linux distributions他们的配置文件啊、执行文件啊、每一个目录内放置的咚咚啊,其实都差很少? 原来是有一套标准依据的

Linux来开发产品或distributions的社群/公司与我的实在太多了,若是每个人都按照本身的标准去配置文件目录,可能有管理上的困扰

FHS 用于规范每一个特定目录下应该要放置什么数据

FHS针对目录树定义了三个目录下应该放置什么数据

目录 含义
/ (root 根目录) 与开机系统有关系
/usr 与软件的安装、执行有关系
/var 与系统运做过程有关系

usr (UNIX Software Resource)Unix操做系统软件资源

FHS 定义(/)根目录下须要有如下目录

目录 文件内容
/bin 执行文件,在/bin 下的命令 能够被root和通常帐号使用,好比 cat cp等
/etc 系统主要配置文件,例如帐号密码文件,何种服务的启示文件
/tmp 正在执行的程序放置文件的地方 FHS建议在开机时将 /tmp下的数据删除

/usr

是系统默认的软件安装目录

下面比较常见的目录

目录 文件内容
/bin 用户可以使用的命令

/var

在系统安装以后,会慢慢占用硬盘容量


Q: 请问在 /bin 与 /usr/bin 有什么不一样

A:

/bin是系统的一些指令

bin为binary的简写主要放置一些系统的必备执行档例如:cat、cp、chmod df、dmesg、gzip、kill、ls、mkdir、more、mount、rm、su、tar等

/usr/bin 是你在后期安装的一些软件的运行脚本

主要放置一些应用软体工具的必备执行档例如c++、g++、gcc、chdrv、diff、dig、du、eject、elm、free、gnome、 gzip、htpasswd、kfm、ktop、last、less、locale、m四、make、man、mcopy、ncftp、 newaliases、nslookup passwd、quota、smb、wget等


绝对路径与相对路径

  • 绝对路径

由根目录开始写起的文件名或者目录

  • 相对路径

相对于当前路径

~ 表明当前用户的家目录 或者 使用cd 回车 也能够进入

/ 表明根目录

chapter 7 目录相关

特殊的目录

标志 含义
. 本层目录
.. 上一层目录
- 前一个工做目录

Q: 请问在Linux的根目录,有没有上层目录 (..) 的存在

A:

用普通用户身份看下

dir

用root身份看一下

dir


操做文件与目录

命令 含义
cd 切换目录 change directory
pwd 显示当前目录
mkdir 建立新目录
rmdir 删除空目录
cp 复制
mv 移动 重命名文件与目录
  • 建立目录 mkdir

mkdir 只能一层一层的建立目录, 如何一次性建立多层目录 -- 借助 -p 参数

mkdir -p webpack/w1-code/dist
  • 删除目录
rmdir config

只能删除一个空目录

若是要强制删除一个非空目录及它下面的所有

rm -r node_modules
  • 查看目录
ls -a // 显示所有,连同隐藏的文件
  • mv
// 将某一个文件移动到文件夹中
mv mian.js newdir
// 重命名文件夹
mv oldDir newdir
  • cp 复制

复制文件须要有 r (可读) 权限

// 复制index 文件到 当前位置
cp ./config/index.js .

默认条件中,cp的源文件与目的文件权限不一样,目的文件的全部者是命令操做者自己

查阅文件内容

file 查询文件类型

判断文件是二进制文件?数据文件?

which

查询命令所在的文件

which ifconfig

which 默认查找的是 PATH 内的目录

cat (Concatenate 连续)

命令 含义
cat 查看内容
cat -n 查看内容 显示行号
cat -b 查看内容 显示行号 【空白部分不算行号】

nl 添加行号打印

nl 能够将输出的内容自动加上行号 默认结果与cat -n有点相似

nl

  • nl [-bnw] filename
-b 命令 含义
a 空行也添加行号
t 空行不添加行号
-n 命令 含义
ln 行号在左侧显示
rn 行号在右侧显示 不加0
rz 行号在右侧显示 加0
nl index.js

nl -b a index.js 空行也添加行号

more

前面提到的nl cat 是一次性将全部内容展现到命令行 more 则是 有翻页功能

more index.js
-n 命令 含义
空格 向下翻一页
enter 或者 向下键 向下滚动一行
q 退出显示
  • 查找功能

按下 / 而后输入 要查找的字符 [可是没有发现有任何高亮提示]

less

less 的用法要比more 增长了向上翻页功能

less index.js
  • 查找功能

按下 / 而后输入 要查找的字符 [向下查询]
按下 ? 而后输入 要查找的字符 [向上查询]

选择数据 head tail

  • head 从前面开始展现

选取数据展现几行

head [-n number] filename

number 表示展现几行 默认展现前10行

  • tail 从后面开始展现
tail [-n number] filename

number 表示展现几行 默认展现最后10行


think

获取第 100 到 120 行

cat filename | head -n 120 | tail -n +100

从 100 行开始 显示 50行

cat filename | tail -n +100 | head -n 50

tail -n +100:从100行开始显示,显示100行之后的


文件的权限预设 umask

当新建一个文件时,它的默认权限和umask有关系

umask是用来指定当前用户在新建目录或文件时的权限预设值,具体来讲,umask值只是一个掩码,它从建立文件时的默认权限中掩去对应位置的权限

umask

0022 以数字形式表示权限

能够看到这里有四组权限,第一组是特殊权限使用的,咱们平时只须要后面三个就能够了

u=rwx 以符号类型表示权限

在默认权限的属性,文件和目录是不一样的

  • 用户建立通常文件,则默认取消可执行权限,即666(rw-rw-rw-)
  • 用户建立目录文件,因为x与是否能够进入此目录有关,所以默认开放全部权限,即777(rwxrwxrwx)

think

Q: 假设用户的umask是 003 则当其新建一个文件或者文件夹 的权限是什么

A: 也就是去掉的权限是 other的 写 w 与 x

文件 rw-rw-r--

文件夹 rwxrxwr--


设置 umask

umask 002

查询文件 find

find [指定路径] [指定条件] [指定动做]

默认会查找当前目录及子目录,把查找结果输出到屏幕上

find

touch

关于文件的三个时间参数

modification time (mtime): 当该文件的『内容数据』变动时,就会升级这个时间!内容数据指的是文件的内容,而不是文件的属性或权限

status time (ctime):当该文件的『状态 (status)』改变时,就会升级这个时间,举例来讲,像是权限与属性被更改了,都会升级这个时间

access time (atime):当『该文件的内容被取用』时,就会升级这个读取时间 (access)。举例来讲,咱们使用 cat 去读取 /etc/man.config , 就会升级该文件的 atime

在默认的状况下,ls 显示出来的是该文件的 mtime ,也就是这个文件的内容上次被更动的时间

ls -l —time=ctime test.conf

权限和文件的关系

![important]](https://user-gold-cdn.xitu.io...

  • 用户能进入某目录成为可工做目录的基本权限是什么
条件 内容
可以使用命令 cd等切换工做目录
目录所需权限 x 要有可执行的权限
  • 用户在某一个目录能够读取一个文件的基本权限是什么
条件 内容
可以使用命令 cat more less tail head 等
目录所需权限 x 要有可执行的权限
文件所需权限 r 要有可读的权限
  • 让用户修改一个文件的权限是什么
条件 内容
可以使用命令 vi vim 等
目录所需权限 x 要有可执行的权限
文件所需权限 r w 要有可读可写的权限
  • 让用户新建一个文件的基本权限是什么
条件 内容
可以使用命令 touch 等
目录所需权限 w x 要有可读可执行的权限

$PATH

为何在任何地方均可以执行 ls 这个命令呢 -- 环境变量 PATH

系统会依照PATH的设置去每一个定义PATH的目录下查询文件名为ls的可执行文件,若是在PATH定义的目录中含有多个文件名为ls的可执行文件,那么先查询的同名命令则先被执行

1 ls 是一个可执行文件
2 根源在 /bin/ls (也就是执行ls 与执行 /bin/ls 是一样的效果)
3 问题变为,为何随时能够执行 /bin/ls 这个文件
4 系统按照 PATH 的设置每个 path的定义目录下 查询名为ls的可执行文件
5 先找到的被执行

PATH

不一样身份的 默认的path 不一样,默认可以随意运行的命令也不一样(如root与vbird)

PATH是能够修改的

chapter 8 磁盘和文件管理

inode

EXT2

Linux最传统的磁盘文件系统(filesystem)使用的是EXT2

磁盘分区指的是告诉操做系统 这个磁盘在此分割槽能够存取的区域是由 A 磁柱到 B 磁柱之间的区块

如此一来操做系统就可以知道他能够在所指定的区块内进行文件数据的读/写/搜寻等动做了。 也就是说,磁盘分区意即指定分割槽的启始与结束磁柱

文件系统

磁盘在作分区以后还须要格式化,这是由于每种操做系统所配置的文件属性/权限并不相同, 为了存放这些文件所需的数据,所以就须要将分区进行格式化,以成为操做系统可以利用的文件系统格式

  • 文件系统的运行

这与操做系统的文件数据有关。较新的操做系统的文件数据除了文件实际内容外, 一般含有很是多的属性

例如 Linux 操做系统的文件权限(rwx)与文件属性(拥有者、群组、时间参数等)。 文件系统一般会将这两部份的数据分别存放在不一样的区块,权限与属性放置到 inode 中,至于实际数据则放置到 data block 区块中

另外,还有一个超级区块 (superblock) 会记录整个文件系统的总体信息,包括 inode 与 block 的总量、使用量、剩余量等

属性 含义
inode 记录文件的属性,一个文件占用一个inode,同时记录此文件的数据所在的 block 号码
block 实际记录文件的内容,若文件太大时,会占用多个 block
superblock 记录此 filesystem 的总体信息,包括inode/block的总量、使用量、剩余量, 以及文件系统的格式与相关信息等

block

inode

inode 的内容在记录文件的权限与相关属性,至于 block 区块则是在记录文件的实际内容

而文件系统一开始就将 inode 与 block 规划好了,除非从新格式化,不然 inode 与 block 固定后就再也不变更

Ext2 文件系统在格式化的时候基本上是区分为多个区块群组 (block group) 的,每一个区块群组都有独立的 inode/block/superblock 系统

block

data block 是用来放置文件内容数据地方,在 Ext2 文件系统中所支持的 block 大小有 1K, 2K 及 4K 三种而已。在格式化时 block 的大小就固定了

1 原则上,block 的大小与数量在格式化完就不可以再改变了(除非从新格式化)
2 每一个 block 内最多只可以放置一个文件的数据
3 承上,若是文件大于 block 的大小,则一个文件会占用多个 block 数量
4 承上,若文件小于 block ,则该 block 的剩余容量就不可以再被使用了(磁盘空间会浪费)


think

Q: 假设你的Ext2文件系统使用 4KB de block ,而该文件系统中有 10000 个小文件,每一个文件大小均为 50 bytes, 请问此时你的磁盘浪费多少容量?

A:

4kb = 4 * 1024 bytes = 4096 bytes

因此每个会浪费 4096 - 50 bytes

因此公共会是 4046 * 10000 bytes = 38.585666 = 38.6MB


与目录树的关系

  • 文件目录

当咱们在 Linux 下的 ext2 文件系统建立一个目录时, ext2 会分配一个 inode 与至少一块 block 给该目录

其中,inode 记录该目录的相关权限与属性,并可记录分配到的那块 block 号码

而 block 则是记录在这个目录下的文件名与该文件名占用的 inode 号码数据

  • 文件

当咱们在 Linux 下的 ext2 建立一个通常文件时, ext2 会分配一个 inode 与相对于该文件大小的 block 数量给该文件

例如:假设个人一个 block 为 4 Kbytes ,而我要建立一个 100 KBytes 的文件,那么 linux 将分配一个 inode 与 25 个 block 来储存该文件

inode 自己并不记录文件名,文件名的记录是在目录的 block 当中。 所以在第六章文件与目录的权限说明中, 咱们才会提到『新增/删除/改名文件名与目录的 w 权限有关』

由于文件名是记录在目录的 block 当中, 所以当咱们要读取某个文件时,就务必会通过目录的 inode 与 block ,而后才可以找到那个待读取文件的 inode 号码, 最终才会读到正确的文件的 block 内的数据

文件系统的操做

全部的数据都得要加载到内存后 CPU 才可以对该数据进行处理

想想,若是你经常编辑一个好大的文件, 在编辑的过程当中又频繁的要系统来写入到磁盘中,因为磁盘写入的速度要比内存慢不少, 所以你会经常耗在等待硬盘的写入/读取上

为了解决这个效率的问题, Linux 使用的方式是透过一个称为异步处理 (asynchronously) 的方式

当系统加载一个文件到内存后,若是该文件没有被更动过,则在内存区段的文件数据会被配置为干净(clean)的。 但若是内存中的文件数据被更改过了(例如你用 nano 去编辑过这个文件),此时该内存中的数据会被配置为脏的 (Dirty)。此时全部的动做都还在内存中运行,并无写入到磁盘中! 系统会不定时的将内存中配置为『Dirty』的数据写回磁盘,以保持磁盘与内存数据的一致性

因为内存的速度要比硬盘快的多,所以若是可以将经常使用的文件放置到内存当中,这样就会大大提高系统性能

  • Linux 系统上面文件系统与内存有很是大的关系:

1 系统会将经常使用的文件数据放置到主存储器的缓冲区,以加速文件系统的读/写
2 承上,所以 Linux 的物理内存最后都会被用光!这是正常的状况!可加速系统效能
3 你能够手动使用 sync 来强迫内存中配置为 Dirty 的文件回写到磁盘中
4 若正常关机时,关机命令会主动呼叫 sync 来将内存的数据回写入磁盘内
5 不正常关机(如跳电、死机或其余不明缘由),因为数据还没有回写到磁盘内, 所以从新启动后可能会花不少时间在进行磁盘检验,甚至可能致使文件系统的损毁(非磁盘损毁)

挂载

文件系统与目录树的结合操做称之为挂载 挂载点必定是目录 这样才能使用文件系统

磁盘和目录容量

磁盘的总体数据是在 superblock 区块中,可是每一个各别文件的容量则在 inode 当中记载的

命令 含义
df 列出文件系统的总体磁盘使用量
du 评估文件系统的磁盘使用量(经常使用在推估目录所占容量)
  • df

df

因为 df 主要读取的数据几乎都是针对一整个文件系统,所以读取的范围主要是在 Superblock 内的信息, 因此这个命令显示结果的速度很是的快速

  • du

与 df 不同的是,du 这个命令其实会直接到文件系统内去搜寻全部的文件数据

在默认的状况下,容量的输出是以 KB 来设计的, 若是你想要知道目录占了多少 MB ,那么就使用 -m 这个参数便可

链接文件

hard id_link

新建一个文件名 连接到 某个inode 号码

symbolic link

Symbolic link 就是在建立一个独立的文件,而这个文件会让数据的读取指向他 link 的那个文件的文件名

ln [-sf] 源文件 目标文件

// 不添加参数就是 hard link
// 添加参数 -s 就是 symbolic link

// f 若是目标文件存在 则先删除后再建立

chapter 10 vim 编辑器

vi 文本编辑器 vim 程序开发工具

vim

vi

vi 共分为三种模式,分别是『通常模式』、『编辑模式』与『指令列命令模式』

通常模式

以 vi 打开一个档案就直接进入通常模式了(这是默认的模式)

编辑模式

通常模式当中, 按下『i, I, o, O, a, A, r, R』等任何一个字母以后会进入编辑模式

指令列命令模式

通常模式当中,输入『 : / ? 』三个中的任何一个按钮,就能够将光标移动到最底下那一行

chapter 11 bash

Bash

shell

须要计算机输出音乐,这个过程须要什么支持呢

1 硬件

须要你的硬件有声卡芯片

2 内核管理

须要操做系统的内核能够支持这个芯片组 还有芯片的驱动程序

3 应用程序

须要用户输入播放声音的指令

以上三点是一个简单的输出声音的步骤。就是用户须要输出一个命令,硬件才会执行这个命令来工做。而硬件如何知道你所执行的命令呢,那就是内核的控制工做了

咱们须要经过shell将输入的命令与内核进行通讯,这样内核就能够控制硬件来工做

操做系统是一组软件,这组软件在控制硬件与管理系统的活动监测。若是这组软件能被用户随意操做会致使系统崩溃。

因此不能让用户随意去使用。所以产生了一种在操做系统上的应用程序->shell

其实shell的功能只是提供用户操做系统的一个接口,所以这个shell须要能够调用其余软件。

简而言之,只要可以操做应用程序的接口,都叫作shell

Linux的shell

Linux有多种shell, 能够看下 /etc/shells

shell

各家的shell功能差很少,可是在某些语法执行方面不一样。

Linux默认使用的是 bash

为何咱们系统上合法的 shell 要写入 /etc/shells 这个文件啊? 这是由于系统某些服务在运行过程当中,会去检查使用者可以使用的 shells ,而这些 shell 的查询就是藉由 /etc/shells 这个文件

我这个使用者何时能够取得 shell 来工做呢?还有, 我这个使用者默认会取得哪个 shell ?

当我登录的时候,系统就会给我一个 shell 让我来工做了。 而这个登录取得的 shell 就记录在 /etc/passwd 这个文件内

bash

bash 的几个优势

1 命令记忆功能

『上下键』能够追溯命令

~/.bash_history 记录的是前一次登录之前所运行过的命令, 而至于这一次登录所运行的命令都被缓存在内存中,当你成功的注销系统后,该命令记忆才会记录到 .bash_history 当中

2 命令与文件补全功能

tab 键

3 命名别名设置功能

查询 alias

设置 alias lm=‘ls -al’

4 做业控制,前台,后台控制

5 程序脚本

当登陆到Linux后,会依据/etc/passwd 文件的设置来给一个shell(默认bash) 而后就能够依据上面的命令操做 shell

type

内部命令:由 bash 内置的命令

外部命令:来字外部的命令,非 bash 内置

查询一个命令是外部的仍是bash内置的呢? -- type

type

能够看到 cd 这个命令是bash的内置命令

shell 的变量功能

Linux是多用户,多任务的环境,每一个人在登陆以后都会有一个bash。

显示当前使用的shell,能够输入:

echo $SHELL

  • 影响bash环境变量的操做

那么因为在 Linux System 下面,全部的线程都是须要一个运行码, 『真正以 shell 来跟 Linux 沟通,是在正确的登录 Linux 以后』这个时候你就有一个 bash 的运行程序,也才能够真正的经由 bash 来跟系统沟通

而在进入 shell 以前,也正如同上面提到的,因为系统须要一些变量来提供他数据的存取 (或者是一些环境的配置参数值, 例如是否要显示彩色等等的) ,因此就有一些所谓的『环境变量』 须要来读入系统中了!这些环境变量例如 PATH、HOME、MAIL、SHELL 等等

读取变量

变量在显示的时候,前面必须带着 $ 符号

echo $PATH
echo ${PATH}
cd $work

设置变量

workdir='workapce/mxx'
变量的设置规则
变量名称只能是字母与数字,但开头不能为数字
双引号内的特殊字符能够保留原特性,好比$ 可正确读取字符串中的变量,单引号则不会
name="my name is $USER"
echo $name
// mu name is tom
<!-- 若是是单引号 -->
name='my name is $USER'
echo $name
// mu name is $USER

取消变量

unset workdir

think

Q: 设置一个 变量表明 工做目录

dir
dir


在父进程中定义的变量是没法在子进程中使用的,好比你定义了这个变量,而后再从新发开一个进程,是读不到这个变量的

dir

不过经过export将此变量设置为环境变量就能够使用了

好比,定义变量 TRYPATH=/HOME/EORK

写一个脚本

echo $TRYPATH, 123

而后在当前进程中执行 sh test.sh

控制台无输出

若是 export TRYPATH=/HOME/EORK

就有信息输出了

环境变量的功能

查询当前有哪些环境变量,能够使用两个命令 env export

env

查询到目前shell环境下全部的环境变量

set

shell不仅是有环境变量,还有各类自定义的变量

set查询全部的变量

export

环境变量和自定义变量二者的差别在于 是否能够被子进程使用

子进程会继承父级进程的环境变量,不会继承父进程的自定义变量

export 能够将自定义变量转为环境变量

export

// export WORKDIR=$WORKDIR:workspace/blued-shopping/blued-shop

能够看到目前全部的环境变量

父进程?子进程?

当你登录 Linux 并取得一个 bash 以后,你的 bash 就是一个独立的程序,被称为 PID 的就是。 接下来你在这个 bash 底下所下达的任何命令都是由这个 bash 所衍生出来的,那些被下达的命令就被称为子程序了。

  • 为何子进程能够使用环境变量

1 当建立一个shell时候,操做系统会分配一个记忆块给shell使用,此内存的变量能够给子进程使用

2 在父进程使用了 export ,就能够将自定义的变量写到上面的那个记忆块中

3 当加载另外一个shell的时候(启动子进程,要离开父进程了)子shell能够将父shell的那个记忆块导入本身的环境变量块中

ulimit

Linux 主机里面同时登录了十我的,这十我的不知怎么搞的, 同时开启了 100 个文件,每一个文件的大小约 10MBytes ,

请问一下, 个人 Linux 主机的内存要有多大才够? 1010010 = 10000 MBytes = 10GBytes ... 内存占用量很大,因此能够限制这个大小

bash 能够限制用户的某些系统资源,好比文件打开数量,可用的CPU时间,可用内存总量等 ,这些经过 ulimit 进行设置

ulimit

参数解析 含义
unlimited 无限制
0 无限制

history

查看历史命令

history
history 10
history -w // 写入 ~./bash_history

历史命令的读取与记录是这样的:

以 bash 登录 Linux 主机以后,系统会主动的由家目录的 ~/.bash_history 读取之前曾经下过的命令,那么 ~/.bash_history 会记录几笔数据呢?这就与你 bash 的 HISTFILESIZE 这个变量配置值有关了!

假设我此次登录主机后,共下达过 100 次命令,『等我注销时, 系统就会将 101~1100 这总共 1000 笔历史命令升级到 ~/.bash_history 当中。』 也就是说,历史命令在我注销时,会将最近的 HISTFILESIZE 笔记录到个人纪录文件当中啦!

固然,也能够用 history -w 强制马上写入的!那为什么用『升级』两个字呢? 由于 ~/.bash_history 记录的笔数永远都是 HISTFILESIZE 那么多,旧的信息会被主动的拿掉! 仅保留最新的!

bash的操做环境

路径和命令的查找顺序

在咱们系统中存在多个名字相同的名字,那么 bash shell 究竟使用的是哪一个命令呢?其遵循的顺序以下

1.以相对/绝对路径来执行命令
2.由 alias 找到命令来执行
3.由 bash 内置命令来执行
4.经过$PATH 的顺序找到的第一个命令来执行

[root@localhost ~]# alias echo='echo -n'
[root@localhost ~]# type -a echo
echo is aliased to `echo -n'
echo is a shell builtin
echo is /bin/echo

能够看到先找alias在内置命令 最后PATH

bash的登陆信息

这些均可以进行配置的

shell 的配置文件

怎么咱们什么动做都没有进行,可是一进入 bash 就取得一堆有用的变量了?

这是由于系统有一些环境配置文件案的存在,让 bash 在启动时直接读取这些配置文件,以规划好 bash 的操做环境

这些配置文件又能够分为全体系统的配置文件以及用户我的偏好配置文件。

咱们前几个小节谈到的命令别名啦、自定义的变量啦,在你注销 bash 后就会失效,因此你想要保留你的配置, 就得要将这些配置写入配置文件才行。

  • Bash 配置文件

以 login shell 方式

1 /etc/profile 系统最主要的shell配置文件,每次login,bash都要读取 /etc/profile文件

PATH:会依据 UID 决定 PATH 变量要不要含有 sbin 的系统命令目录;
MAIL:依据帐号配置好使用者的 mailbox 到 /var/spool/mail/帐号名;
USER:根据用户的帐号配置此一变量内容;
HOSTNAME:依据主机的 hostname 命令决定此一变量内容;
HISTSIZE:历史命令记录数

2 我的配置文件

bash 在读完了总体环境配置的 /etc/profile 以及其余配置文件后,接下来则是会读取使用者的我的配置文件

其实 bash 的 login shell 配置只会读取上面三个文件的其中一个, 而读取的顺序则是依照上面的顺序。也就是说,若是 ~/.bash_profile 存在,那么其余两个文件不论有无存在,都不会被读取。 若是 ~/.bash_profile 不存在才会去读取 ~/.bash_login,而前二者都不存在才会读取 ~/.profile 的意思

在 login shell 的 bash 环境中,所读取的我的偏好配置文件其实主要有三个,依序分别是:

~/.bash_profile
~/.bash_login
~/.profile

~/.bash_profile 是我的的bash配置文件,存在每位用户的$HOME

~/.bash_login 用户登录时 bash会读取这个文件。一般把登录就要执行的指令放在这

以 non-login shell 方式

~/.bashrc 每次打开shell,shell都会读取的文件。每次打开shell,执行一次

其他的配置文件为

4 ~/.bash_logout 是退出系统时bash在退出时执行的

5 ~/.bash_history 是历史功能的记录文件

数据流重定向

数据流重定向 就是把某些要出如今屏幕上的数据传输到其余地方

数据流

输入数据流:以写文件为例,从键盘输入的字符就输入数据流

输出数据流:以读文件为例,将文件内容显示到屏幕上,显示的内容就是输出字符流

输出数据流又可分为:标准输出 标准错误输出

标准输入 < 或者 <<

标准输出 > 或者 >>

标准错误输出 2> 或者 2>>

( 一个< 表示覆盖 二个<< 表示进行追加 )

echo config.js > copy.js

本应该出如今屏幕上的全部的config的信息 会被 导入到copy.js文件

这个copy文件的建立方式为

1 该文件若不存在,系统会自动的将他建立起来

2 当这个文件存在的时候,那么系统就会先将这个文件内容清空,而后再将数据写入

也就是若以 > 输出到一个已存在的文件中,那个文件就会被覆盖掉

若是不想被覆盖,而是继续追加信息,使用 >>

命令行中的判断 && ||

ls tmp/info && touch tmp/info/a

管道

bash 命令运行的时候有输出的数据会出现! 那么若是这群数据必须要通过几道手续以后才能获得咱们所想要的格式,应该如何来配置?

  • grep
  • uniq 去重
  • wc 统计

chapter 13 shell script

就是在 shell 上运行的 script 脚本

开发

以 #!/bin/bash 开头 用以声明文件内语法使用bash语法

  • 条件判断
if [ 条件判断式 ]; then
    当条件判断式成立时,能够进行的命令工做内容;
fi   <==将 if 反过来写,就成为 fi 啦!结束 if 之意!

如何运行

sh base.sh
bash base.sh
/bin/bash base.sh
/bin/sh base.sh

source x.sh

source 能够回传变量

// 定义变量 export 到全局
export TRYPATH='trypath'

// 定义 test.sh 内容为  
// echo $TRYPATH
// TRYPATH='changepath'
sh test.sh  // -> trypath

echo $TRYPATH // -> trypath

// 使用source执行

source test.sh // trypath

echo $TRYPATH // -> changepath

也就是 source 能够修改父进程的变量

chapter 14 帐号管理与权限设置

Jurisdiction

帐号与用户组

登录 Linux 主机的时候,输入的是咱们的帐号, ID 与帐号的对应就在 /etc/passwd 当中

每一个登录的使用者至少都会取得两个 ID ,一个是使用者 ID (User ID ,简称 UID)、一个是群组 ID (Group ID ,简称 GID)

  • 文件如何判别他的拥有者与群组

每个文件都会有所谓的拥有者 ID 与拥有群组 ID ,当咱们有要显示文件属性的需求时,系统会依据 /etc/passwd 与 /etc/group 的内容, 找到 UID / GID 对应的帐号与组名再显示出来

  • 在输入帐号和密码登陆shell时候 系统会发生什么

1 先找寻 /etc/passwd 里面是否有你输入的帐号

若是没有则跳出,若是有的话则将该帐号对应的 UID 与 GID (在 /etc/group 中) 读出来,另外,该帐号的主文件夹与 shell 配置也一并读出

2 再来则是核对密码表啦!

这时 Linux 会进入 /etc/shadow 里面找出对应的帐号与 UID,而后核对一下你刚刚输入的密码与里头的密码是否相符

3 若是一切都 OK 的话,就进入 Shell 控管的阶段

/etc/passwd

每一行都表明一个帐号,有几行就表明有几个帐号在你的系统中

按照 : 分为 7个部分

[用户名]:[密码]:[UID]:[GID]:[身份描述]:[主目录]:[登陆shell]

/etc/shadow

咱们知道不少程序的运行都与权限有关,而权限与 UID/GID 有关!所以各程序固然须要读取 /etc/passwd 来了解不一样帐号的权限。 所以 /etc/passwd 的权限需配置为 -rw-r--r-- 这样的状况, 虽然早期的密码也有加密过,但却放置到 /etc/passwd 的第二个字段上!这样一来很容易被有心人士所窃取的, 加密过的密码也可以透过暴力破解法去 try and error (试误) 找出来

由于这样的关系,因此后来发展出将密码移动到 /etc/shadow 这个文件分隔开来的技术

testuser:!!:17854:0:99999:7:::

[帐号名称] [密码] [最近更动密码的日期] [密码不可被更动的天数] [密码须要从新变动的天数] [密码须要变动期限前的警告天数] [密码过时后的帐号宽限时间(密码失效日)] [帐号失效日期] [保留]

  • [密码]

通过编码的密码 (加密) 只会看到有一些特殊符号的字母

  • [最近更动密码的日期]

是以 1970 年 1 月 1 日做为 1 而累加的日期,1971 年 1 月 1 日则为 366

/etc/group

记录GID 和用户组组名对应

这个文件每一行表明一个群组

它总共分四个部分:[组名]:[密码域]:[GID]:[组员列表]

看下这三者的关系

relation

有效用户组(effective group)与初始用户组(initial group)

每一个使用者在他的 /etc/passwd 里面的第四栏有所谓的 GID,就是『初始群组 (initial group) 』。也就是说,当用户一登录系统,马上就拥有这个群组的相关权限

可是一个用户能够被加入到多个用户组去,好比 USERA 能够同时属于 group1 (初始用户组) 与 group2 (手动添加)

那么当这个用户在新建一个文件的时候,新文件所属组是哪个

这个取决于当时的有效用户组

查询当前用户所属的用户组

groups

第一个输出的群组即为 有效用户组 (effective group) 了

以这个用户身份去新建一个文件,则文件的用户组就是这个 有效用户组

有效群组的切换

newgrp newGrooup

可是使用newgrp 是有限制的,那就是你想要切换的群组必须是你已经有支持的群组,也就是说,只要个人用户有支持的群组就是可以切换成为有效群组

帐号管理

用户相关

// 新增一个用户
usersadd newName

// 删除一个用户
userdel newName

CentOS 系统主要会帮咱们处理几个项目

1 在 /etc/passwd 里面建立一行与帐号相关的数据,包括建立 UID/GID/家目录等

2 在 /etc/shadow 里面将此帐号的密码相关参数填入,可是还没有有密码

3 在 /etc/group 里面加入一个与帐号名称如出一辙的组名

4 在 /home 底下建立一个与帐号同名的目录做为用户家目录,且权限为 700

此时在 /etc/shadow 内仅会有密码参数而不会有加密过的密码数据,所以还须要使用『 passwd 帐号 』来给予密码才算是完成了用户建立的流程

passwd g1

为什么『 useradd vbird1 』会主动在 /home/vbird1 建立起用户的家目录?家目录内有什么数据且来自哪里?为什么默认使用的是 /bin/bash 这个 shell ?为什么密码字段已经都规范好了 (0:99999:7 那一串)? ---- 取决于 useradd 所使用的参考文件

useradd -D
// GROUP=100        <==默认的群组
// HOME=/home        <==默认的家目录所在目录
// INACTIVE=-1        <==密码失效日,在 shadow 内的第 7 栏
// EXPIRE=            <==帐号失效日,在 shadow 内的第 8 栏
// SHELL=/bin/bash        <==默认的 shell
// SKEL=/etc/skel        <==用户家目录的内容数据参考目录
// CREATE_MAIL_SPOOL=yes   <==是否主动帮使用者建立邮件信箱(mailbox)

用户组相关

// 新增一个用户组
groupadd newName

// 删除一个用户组  r 表示连同用户主文件夹一块儿删除
groupdel -r newName 

// 将用户加入到组和从组中删除
gpasswd –a 用户名  组名        //添加用户
gpasswd –d 用户名  组名        //删除用户

//  查看用户属于某组
#groups  用户名
// 新建用户加入某组
useradd –g  某组名  用户

用户组管理员设置

将 g3 设置为 girls 组的管理员, 管理员能够控制 那些帐号能够 移入 移除 用户组

gpasswd -A g3 girls

设置用户密码

当忘记了密码怎么办

  • 普通用户

root管理员处理

passwd usertest

passwd

  • root 忘记密码

安全模式?? 太复杂了

  • 关于处理密码
echo 123456 | passwd --stdin testuser2

直接变动密码,不须要重复确认

pwd

  • 关闭/打开 某一个用户密码
// 使用户密码失效
passwd -S xxx
// 使用户密码解锁
passwd -u xxx

lock

用户的身份切换

  • su

su 须要新用户的密码 (若是原来的是root 切换到哪个都不须要密码 )

本来的变量不会改变, 好比PATH变量 mail 变量 还会是以前用户的

// 使用 - 能够处理这个问题
su -

su

exit

退出 第二个 用户状态 恢复到原始用户环境

  • sudo

sudo 切换须要本身的密码,有时候还不须要

sudo 可让你以其余用户的身份运行命令 (一般是使用 root 的身份来运行命令), 只有在 /etc/sudoers 中的用户 才能够执行此命令

将用户添加到 /etc/sudoers

visudo

添加角色

visudo

用户功能

  • id

查询某人或者本身的uid/gid等信息

id
// uid=1006(g1) gid=1007(girls) 组=1007(girls)
id g2
// uid=1007(g2) gid=1007(girls) 组=1007(girls)
  • w / who

当前谁登录在系统上

w

chapter16 例行性工做 crontab

crontab

什么是例行性工做?

能够理解为node中的定时任务(node-schedule)

有两种任务性质,周期性,一次性

周期性: 好比天天要睡觉

一次性: 好比偶尔会捡到钱

at 命令用于处理 一次性 的工做

crontab 命令用于处理周期性的工做,循环工做

Linux常见的例行性工做调度

  • 日志文件的轮替
  • 临时文件的删除

某些软件在运行中会产生一些缓存文件,可是当这个软件关闭时,这些缓存文件可能并不会主动的被移除。

系统透过例行性工做排程运行名为 tmpwatch 的命令来删除这些缓存文件

at 一次性的工做调度

atd 用于负责处理 这些一次的工做,可是并不是全部的 Linux distributions 都默认会把他打开的

/etc/init.d/atd restart

使用 at 这个命令来产生所要运行的工做,并将这个工做以文字档的方式写入 /var/spool/at/ 目录内,该工做便能等待 atd 这个服务的取用与运行了

/etc/at.allow 与 /etc/at.deny

这两个文件限制了谁有权利去调用 at

1 /etc/at.allow

写在这个文件中的使用者才能使用 at ,没有在这个文件中的使用者则不能使用 at (即便没有写在 at.deny 当中)

2 若是 /etc/at.allow 不存在,就寻找 /etc/at.deny 这个文件 凡是被写入的都不能使用at了(没有被写的就能够使用)

3 若是两个文件都不存在,那么只有 root 能够使用 at 这个命令

  • 查询当前机器中有多少 at 的工做调度
atq
  • 删除某一个工做调度
atrm [jobnumber]
batch

batch 就是另外一种 at, 可是batch会在 CPU 工做负载 低于 0.8 的时候,才进行你所下达的工做任务

  • CPU 工做负载

若是某一个程序他须要一直使用 CPU 的运算功能,那么此时 CPU 的使用率可能到达 100% 可是 CPU 的工做负载则是趋近1,由于 CPU 仅负责一个工做

若是同时运行2个这样的程序 CPU 的使用率仍是 100% ,可是工做负载则变成 2

crontab

用户的设置

crontab 用来处理周期性的工做,为了安全考虑,能够限制哪些身份是能够使用 crontab

  • /etc/cron.allow
  • /etc/cron.deny

当使用者使用 crontab 这个命令来建立工做排程以后,该项工做就会被纪录到 /var/spool/cron/ 里面, 并且是以账号来做为判别

好比 dmtsai 使用 crontab 后, 他的工做会被记录到 /var/spool/cron/dmtsai 里头去

默认状况下,只要用户没有被放入 /etc/cron.deny 就能够直接执行 crontab -e 去编辑本身的例行性命令了

时间位置是五个数字 * 分别表明 分钟 小时 日期 月份 周几

编写

crontab -e

咱们写一个每一分钟输出当前时间的

*/1 * * * * echo $(date) > /tmp/test.txt

查看当前用的 crontab 工做

crontab -l

重启

/bin/systemctl start crond.service

系统层级的crontab

crontab -e 是对于用户的,若是是系统的例行性任务,就须要另外处理了

须要编辑 /etc/crontab 这个文件了

cron 这个服务的最低侦测限制是『分钟』,因此『 cron 会每分钟去读取一次 /etc/crontab 与 /var/spool/cron 里面的数据内容 』,所以,只要编辑完 /etc/crontab 这个文件,而且将他储存以后,那么 cron 的配置就自动运行

手动重启crond服务

/etc/init.d/crond restart

/etc/crontab

  • MAILTO

当 /etc/crontab 这个文件中的例行性工做的命令发生错误时,或者是该工做的运行结果有 STDOUT/STDERR 时,会将错误信息或者是萤幕显示的信息传给谁(默认是由系统直接寄发一封 mail 给 root)

  • PATH

命令路径

anacron 唤醒停机期间的工做任务

anacron 并不能指定什么时候运行某项任务, 而是以天为单位或者是在启动后马上进行 anacron 的动做,他会去侦测停机期间应该进行可是并无进行的 crontab 任务,并将该任务运行一遍后,anacron 就会自动中止了

anacron 会以一天、七天、一个月为期去侦测系统未进行的 crontab 任务

anacron 运行的时间一般有两个,一个是系统启动期间运行,一个是写入 crontab 的排程中。 这样才可以在特定时间分析系统未进行的 crontab 工做

chapter17 程序管理

17.1 进程 程序

触发任何一个事件时,系统都会将其定义为一个进程,并给与此进程一个ID,为PID. 同时依据启发这个程序的使用者与相关属性关系,给予这个 PID 一组有效的权限配置

程序通常是放置在实体磁碟中,而后透过使用者的运行来触发。触发后会加载到内存中成为一个个体,那就是进程。 为了操做系统可管理这个程序,所以程序有给予运行者的权限/属性等参数,并包括程序所须要的命令码与数据或文件数据等, 最后再给予一个 PID 。系统就是透过这个 PID 来判断该 process 是否具备权限进行工做

内存

  • 程序

系统须要启动的那个二进制的文件

一般为二进制程序放置在存储媒介中,以物理文件形式存在
  • 进程

程序触发以后,被加载到内存中成为一个个体,这就是进程

程序被触发后,执行者的权限与属性,程序的程序代码与所需数据会被加载到内存,操做系统会给与这个内存单元一个标识符PID

子程序与父程序

进程

程序彼此之间是有相关性的。以上面的图示来看,连续运行两个 bash 后,第二个 bash 的父程序就是前一个 bash

常驻进程

某些命令产生的进程很快就会被终止,好比ls显示文件 touch 建立文件等。可是有些进程会一直在执行,好比系统每一分钟会去扫描 /etc/crontab 来进行工做调度, 是 crond 这个程序所管理的,他启动后就在后台一直持续不断的运行。 这个就是一直存在内存中的进程

常驻在内存当中的程序一般都是负责一些系统所提供的功能以服务使用者各项任务,所以这些常驻程序就会被咱们称为:服务 (daemon)。系统的服务很是的多, 不过主要大体分红系统自己所须要的服务,例如刚刚提到的 crond 及 atd

网络服务会启动一个能够负责网络监听的端口 (port) ,以提供外部用户端 (client) 的连线要求

Linux 的多人多工环境

Q: 为何 Linux 这么多用户,可是却每一个用户均可以拥有本身的环境?

其实在 Linux 下运行一个命令时,系统会将相关的权限、属性、程序码与数据等均加载内存, 并给予这个单元一个程序识别码 (PID),最终该命令能够进行的任务则与这个 PID 的权限有关

// 文件目录
const dir = {}

// 一些内存
const Memory = {}

function linux1 () {
    // 用户1登陆的环境

    function crontab(){...}
    function pm2(){...}
}

function linux2 () {
    // 用户2 登陆的环境
    
    function crontab(){...}
    function pm2(){...}
}
  • 多任务行为

Linux 可让CPU在各个工做进行切换,也就是说,每个工做仅仅占用CPU几个命令次数,因此CPU每秒可以在各个进程之间进行切换

目前的 CPU 速度可高达几个 GHz。 这表明 CPU 每秒钟能够运行 109 这么屡次命令。Linux 可让 CPU 在各个工做间进行切换, 也就是说,其实每一个工做都仅占去 CPU 的几个命令次数,因此 CPU 每秒就可以在各个程序之间进行切换

  • 特殊的程序管理行为

Linux能够在任什么时候候, 将某个被困住的程序杀掉,而后再从新运行该程序而不用从新启动

  • bash 环境下的工做管理 (job control)

登录 bash 以后, 就是取得一个名为 bash 的 PID 了,而在这个环境底下所运行的其余命令, 就几乎都是子进程了

在这个单一的 bash 界面下,能够处理多个工做

工做管理 job control

当登陆系统取得 bash shell 以后,在单一终端机界面下同时进行多个工做的行为管理

能够出现提示字节让你操做的环境就称为前景 (foreground),其余工做就可让你放入背景 (background) 去暂停或运行

  • 直接将命令丢到后台中『运行』的 &

好比启动一个项目

node index.js

run

这个就是一直在前台启动,咱们能够将这个放在后台处理

node index.js &

&

添加的这个 & 会将命令放到后台处理,此时bash会输出一个 工做号码 1 和 PID 90328

  • 查询目前在后台的工做
jobs

jobs

参数 含义
l 除了列出 job number 与命令串以外,同时列出 PID 的号码
r 仅列出正在背景 run 的工做
s 仅列出正在背景当中暂停 (stop) 的工做

能够看到有一个 + - 号展现

  • 表明最近被放到背景的工做号码 - 表明最近最后第二个被放置到背景中的工做号码 而超过最后第三个之后的工做,就不会有 +/- 符号存在了
  • 后台工做拿到前台处理 fg (foreground)
fg // 默认将 + 的工做取出来
fg- // 取出来 - 的工做
fg %工做号码 // 取出来这个工做号码的对应工做
  • 管理工做 kill

kill

kill -signal %jobnumber
signal参数 含义
1 从新读取一次参数的配置档 (相似 reload)
2 表明与由键盘输入 [ctrl]-c 一样的动做
9 马上强制删除一个工做
15 以正常的程序方式终止一项工做。与 -9 是不同的

进程管理

为何须要进程管理

1 Linux 系统是个很忙碌的系统,那么当整个系统资源快要被使用光时, 您是否可以找出最耗系统的那个程序,而后删除该程序,让系统恢复正常呢

2 此外,若是由於某个程序写的很差,致使产生一个有问题的程序在内存当中,您又该如何找出他,而后将他移除呢?

3 若是同时有五六项工做在您的系统当中运行,但其中有一项工做才是最重要的, 该如何让那一项重要的工做被最优先运行呢

查看进程

  • ps
命令 含义
ps -l 查询只和本身bash相关的进程
ps aux 当前内存全部进程

ps 是静态的结果输出 是某一个时间点的进程状态

  • top

top 能够监测整个系统的进程工做状态

top [-d 数字] | top [-bnp]

-d 后面能够接秒数,默认是 5 秒, 表示每次更新进程资源的时间

在 top 运行过程中能够使用的按键命令

? :显示在 top 当中能够输入的按键命令
P :以 CPU 的使用资源排序显示
M :以 Memory 内存 的使用资源排序显示 (默认)
N :以 PID 来排序
T :由该 Process 使用的 CPU 时间累积 (TIME+) 排序
k :给予某个 PID 一个讯号 (signal)
r :给予某个 PID 从新制订一个 nice 值
q :离开 top 软件的按键


think

如何查找最消耗CPU的进程

使用 top 而后 按P


进程管理

实际上是透过给予该程序一个信号 (signal) 去告知该程序如何操做

查询全部的可用的singal

kill -l

经常使用的一些 信号

数值 名称 含义
1 SIGHUP 启动被终止的程序,可以让该 PID 从新读取本身的配置档,相似从新启动
  • killall -singal 命令名称

根据进程名称删除此进程

好比咱们经过 node index.js & 启动这个服务到后台

那么删除就能够是 killall -9 node

要删除某个程序,咱们能够使用 PID 或者是启动该程序的命令名称,

而若是要删除某个服务呢?呵呵!最简单的方法就是利用 killall , 由于他能够将系统当中全部以某个命令名称启动的程序所有删除。

进程的优先级

Linux 给予程序一个所谓的『优先运行序 (priority, PRI)』, 这个 PRI 值越低表明越优先的意思

以前咱们查看一个进程 ps -l

ps -l

能够看到 PRI 这个参数

PRI 是内核动态调整的,使用者无权去干涉 PRI

想要调整程序的优先运行序时,就得要透过 Nice 值了!Nice 值就是上表的 NI

通常来讲, PRI 与 NI 的相关性以下:

PRI(new) = PRI(old) + nice

可是,若是本来的 PRI 是 50 ,并非咱们给予一个 nice = 5 ,就会让 PRI 变成 55 。

由于 PRI 是系统『动态』决定的,因此,虽然 nice 值是能够影响 PRI ,不过, 最终的 PRI 还是要通过系统分析后才会决定的。

另外, nice 值是有正负的,而既然 PRI 越小越早被运行, 因此,当 nice 值为负值时,那么该程序就会下降 PRI 值,亦即会变的较优先被处理

  • nice

新执行的命令处理nice

nice [-n 数字] command

nice -n 5 vi

数字范围在 -20 - 19

  • renice

已经存在的进程nice从新调整

线程

查看系统资源

free 查看内存占用

free [-b|-k|-m|-g] [-t]

选项与参数

-b :直接输入 free 时,显示的单位是 Kbytes,咱们能够使用 b(bytes), m(Mbytes) k(Kbytes), 及 g(Gbytes) 来显示单位

-t :在输出的最终结果,显示实体内存与 swap 的总量

free

Mem 那一行显示的是实体内存的量, Swap 则是虚拟内存的量。 total 是总量, used 是已被使用的量, free 则是剩余可用的量。 后面的 shared/buffers/cached 则是在已被使用的量当中,用来做为缓冲及缓存的量。

Linux 测试用主机是很平凡的,根本没有什么工做, 可是实体内存是几乎被用光

不过,至少有 132MB 用在缓冲记忆 (buffers) 工做, 287MB 则用在缓存 (cached) 工做,也就是说,系统是『颇有效率的将全部的内存用光』, 目的是为了让系统的存取效能加速

不少朋友都会问到这个问题『个人系统明明很轻松,为什么内存会被用光光?』被用光是正常的!而须要注意的反而是 swap 的量

通常来讲, swap 最好不要被使用,尤为 swap 最好不要被使用超过 20% 以上, 若是您发现 swap 的用量超过 20% ,那么,最好仍是买实体内存

系统会使用到 swap , 绝对是由于实体内存不足了才会这样作的

Linux 系统为了要加速系统效能,因此会将最常使用到的或者是最近使用到的文件数据缓存 (cache) 下来, 这样将来系统要使用该文件时,就直接由内存中搜寻取出,而不须要从新读取硬盘,速度上面固然就加快了! 所以,实体内存被用光是正常的

uname:查阅系统与核心相关资讯

uptime:观察系统启动时间与工做负载

netstart

netstart -tlnp

特殊文件和程序

chapter 18 系统服务

service

系统为了某些功能必需要提供一些服务 (不管是系统自己仍是网络方面),这个服务就称为 service

可是 service 的老是须要程序的运行吧!达成这个 service 的程序咱们就称呼他为 daemon

举例来讲,达成循环型例行性工做排程服务 (service) 的程序为 crond 这个 daemon

chapter23 软件安装

Linux 开发商先在固定的硬件平台与操做系统平台上面将须要安装或升级的软件编译好, 而后将这个软件的全部相关文件打包成为一个特殊格式的文件,在这个软件文件内还包含了预先侦测系统与相依软件的脚本, 并提供记载该软件提供的全部文件资讯等。最终将这个软件文件发布。

用户端取得这个文件后,只要透过特定的命令来安装, 那么该软件文件就会依照内部的脚原本侦测相依的前驱软件是否存在,若安装的环境符合需求,那就会开始安装, 安装完成后还会将该软件的资讯写入软件管理机制中,以达成将来能够进行升级、移除等动做

目前Linux经常使用的两大安装方式为 dpkg rpm

不论 dpkg/rpm 这些机制或多或少都会有软件属性相依的问题,那该如何解决呢?

其实前面不是谈到过每一个软件文件都有提供相依属性的检查吗?那么若是咱们将相依属性的数据作成列表, 等到实际软件安装时,若发生有相依属性的软件情况时,管理机制自动去取得其依赖来同时安装, 就解决了属性相依的问题

目前新的 Linux 开发商都有提供这样的『线上升级』机制,透过这个机制, 原版光盘就只有第一次安装时须要用到而已,其余时候只要有网络,你就可以取得本来开发商所提供的任何软件了

CentOS 系统嘛!因此说:使用的软件管理机制为 RPM 机制,而用来做为线上升级的方式则为 yum

rpm

RPM是RedHat Package Manager(RedHat软件包管理工具)的缩写,这一文件格式名称虽然打上了RedHat的标志,可是其原始设计理念是开放式的,如今包括OpenLinux、S.u.S.E.以及Turbo Linux等Linux的分发版本都有采用,能够算是公认的行业标准了。



最大的特色就是将你要安装的软件先编译过, 而且打包成为 RPM 机制的包装文件,透过包装好的软件里头默认的数据库记录, 记录这个软件要安装的时候必须具有的相依属性软件,当安装在你的 Linux 主机时, RPM 会先依照软件里头的数据查询 Linux 主机的相依属性软件是否知足, 若知足则予以安装,若不知足则不予安装。那么安装的时候就将该软件的资讯整个写入 RPM 的数据库中,以便将来的查询、验证与反安装!这样一来的优势是:

由於已经编译完成而且打包完毕,因此软件传输与安装上很方便 (不须要再从新编译);
由於软件的资讯都已经记录在 Linux 主机的数据库上,很方便查询、升级与反安装

缺点

由於 RPM 文件是已经包装好的数据,也就是说, 里面的数据已经都『编译完成』了!因此,该软件文件几乎只能安装在本来默认的硬件与操做系统版本中。 也就是说,你的主机系统环境必需要与当初建立这个软件文件的主机环境相同才行

有的时候相同 distribution 的不一样版本之间也没法互通,例如 CentOS 4.x 的 RPM 文件就没法直接套用在 CentOS 5.x !所以,这样能够发现这些软件管理机制的问题是:

软件文件安装的环境必须与打包时的环境需求一致或至关;
须要知足软件的相依属性需求;
反安装时须要特别当心,最底层的软件不可先移除,不然可能形成整个系统的问题!

RPM 相关操做

  • 查询rpm包

(1)查询系统中安装的全部rpm包 #rpm –qa
(2)查询软件包是否安装  #rpm –q 软件包名称
(3)查询软件包信息   #rpm –qi 软件包名称
(4)查询软件包中的文件 #rpm –ql 软件包名称
(5)查询系统中文件所属的软件包#rpm –qf 文件全路径名
(6)查询rpm包文件中的信息#rpm –qp rpm包文件全路径

  • 安装rpm包

rpm –ivh rpm包全路径文件名

  • 删除rpm包

rpm –e rpm包名称

  • 升级rpm包

rpm –U rpm软件包全路径名

网络相关

基本的网络配置

一、主机名
二、ip地址
三、网关地址
四、DNS服务器地址

DNS

DNS客户配置文件 /etc/resolv.conf 该文件中指定系统所使用的DNS服务器的IP地址

网络相关命令

// 显示当前系统的主机名称
hostname

// 设置系统主机名
hostname 主机名称

ping

Ping [–c 发出的报文数 ]目的主机地址
Ping命令经过向被测试的目的主机地址发送ICMP报文并收取回应报文,来测试当前主机到目的主机的网络链接状态

nslookup
用于使用系统设定的DNS服务器解析域名,用该命令能够测试NDS服务器是否工做正常
Nslookup命令有交互方式查询和命令行方式查询

#nslookup
#nslookup 主机域名 | ip地址
nslookup
www.webmxx.com
相关文章
相关标签/搜索
本站公众号
   欢迎关注本站公众号,获取更多信息