《Linux私房菜》阅读笔记整理chapter 0计算机的五大单元 - 输入 输出 CPU内部的控制单元和算数逻辑单元 内存CPUcentral processing unit主要作用,管理和运算 (算数逻辑单元,控制单元) - 前者负责程序运算和逻辑判断 后者负责协调各个组件与各个单元之间的工作CPU的重点在与 运算和判断,这些数据来自于内存. 内存则从输入单元传输进来,CPU处理完毕之后先传递给内存,再从内存传输到输出单元目前主流的CPU是双核以上,原本的单核是指仅有一个运算单元,多核是指在一个CPU壳子里装了多个运算内核CPU 的性能对比1 内部的微指令集2 CPU的频率 – 每秒CPU的工作次数 这个数值越高 代表单位时间内可以做更多的事情比如某款CPU频率 3GHZ 则其每秒可进行 3 x 10的9次方 工作外频 倍频为了加速计算速度,CPU开发商就在CPU内部加上一个加速功能外频 : 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 unixchapter 1什么是Linuxlinux 就是一套操作系统计算机由一堆硬件设备组成,操作系统用户管理控制这些硬件资源(内核)不止如此,为了程序员可以更好的开发软件,操作系统还提供了一组系统调用接口Linux 提供了一个完整的操作系统中,最底层的硬件控制和资源管理的完整架构,这个是沿用Unix而来的,相当稳定且强大Linux distributionslinux 是操作系统最底层的内核以及其提供的内核管理工具,任何都可以获取源码并执行这个内核程序随着Linux使用者逐渐增多,可以在Linux上运行的软件也越来越多,Linux + 各种软件 就可以是一个相当完整的操作系统为了让用户可以接触到Linux,有人将 Linux 与可运行的软件集成起来,加上 一个可以让用户以光盘或者网络直接安装或者管理Linux系统,我们称这一整套 可完全安装的系统为 Linux distribution — 可完全安装套件常见的几个 Linux distributionred hat - 红帽子ubuntu – 无班图centosLinux distribution 使用的都是 www.kernel.org 中提供的Linux内核,各家使用的软件大同小异,最大的差别在于软件的安装模式查看当前是什么 distributionlsb_release -achapter 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看下第一行这里是个 DATE(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 .gitignoredrwxr-xr-x 2 zhengzaijiazai staff 68 4 25 11:32 distdrwxr-xr-xd 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 对于这个账户有什么权限, 能切换到此目录中吗answeruserA 具有 读的权限而进行目录切换是需要X的权限 所以不可以切换到此目录修改文件的属性、权限命令含义chgrp xxx filename改变文件所属用户组chown xxx filename改变文件所有者chmod xxx filename改变文件的权限chgrp (change group)要改的那个组必须在 /etc/group 中存在 否则会报错chgrp read.md groupBchown (change owner)要改的那个用户必须在 /etc/passwd 中有记录 否则会报错chown read.md userBchownchmod 改变权限使用分数使用分数也可以代表权限命令分数r4w2x1rwx 7rw- 6r-x 5使用符号类型有三种身份,就用 u g o 代表三种身份的权限身份字符用户u用户组g其他人o所有身份a命令含义+增加-减去=设置比如 需要设置一个文件的权限为 -rwxr-xr-x则u 为rwx g/o 为 r-xchmod 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、m4、make、man、mcopy、ncftp、 newaliases、nslookup passwd、quota、smb、wget等绝对路径与相对路径绝对路径由根目录开始写起的文件名或者目录相对路径相对于当前路径~ 代表当前用户的家目录 或者 使用cd 回车 也可以进入/ 代表根目录chapter 7 目录相关特殊的目录标志含义.本层目录..上一层目录-前一个工作目录Q: 请问在Linux的根目录,有没有上层目录 (..) 的存在A:用普通用户身份看下用root身份看一下操作文件与目录命令含义cd切换目录 change directorypwd显示当前目录mkdir创建新目录rmdir删除空目录cp复制mv移动重命名文件与目录创建目录 mkdirmkdir 只能一层一层的创建目录, 如何一次性创建多层目录 – 借助 -p 参数mkdir -p webpack/w1-code/dist删除目录rmdir config只能删除一个空目录如果要强制删除一个非空目录及它下面的全部rm -r node_modules查看目录ls -a // 显示全部,连同隐藏的文件mv// 将某一个文件移动到文件夹中mv mian.js newdir// 重命名文件夹mv oldDir newdircp 复制复制文件需要有 r (可读) 权限// 复制index 文件到 当前位置cp ./config/index.js .默认条件中,cp的源文件与目的文件权限不同,目的文件的所有者是命令操作者本身查阅文件内容file 查询文件类型判断文件是二进制文件?数据文件?which查询命令所在的文件which ifconfigwhich 默认查找的是 PATH 内的目录cat (Concatenate 连续)命令含义cat查看内容cat -n查看内容 显示行号cat -b查看内容 显示行号 【空白部分不算行号】nl 添加行号打印nl 可以将输出的内容自动加上行号 默认结果与cat -n有点类似nl [-bnw] filename-b 命令含义a空行也添加行号t空行不添加行号-n 命令含义ln行号在左侧显示rn行号在右侧显示 不加0rz行号在右侧显示 加0nl index.jsnl -b a index.js 空行也添加行号more前面提到的nl cat 是一次性将所有内容展示到命令行 more 则是 有翻页功能more index.js-n 命令含义空格向下翻一页enter 或者 向下键向下滚动一行q退出显示查找功能按下 / 然后输入 要查找的字符 [但是没有发现有任何高亮提示]lessless 的用法要比more 增加了向上翻页功能less index.js查找功能按下 / 然后输入 要查找的字符 [向下查询]按下 ? 然后输入 要查找的字符 [向上查询]选择数据 head tailhead 从前面开始展示选取数据展示几行head [-n number] filenamenumber 表示展示几行 默认展示前10行tail 从后面开始展示tail [-n number] filenamenumber 表示展示几行 默认展示最后10行获取第 100 到 120 行cat filename | head -n 120 | tail -n +100从 100 行开始 显示 50行cat filename | tail -n +100 | head -n 50tail -n +100:从100行开始显示,显示100行以后的文件的权限预设 umask当新建一个文件时,它的默认权限和umask有关系umask是用来指定当前用户在新建目录或文件时的权限预设值,具体来说,umask值只是一个掩码,它从创建文件时的默认权限中掩去对应位置的权限0022 以数字形式表示权限可以看到这里有四组权限,第一组是特殊权限使用的,我们平时只需要后面三个就可以了u=rwx 以符号类型表示权限在默认权限的属性,文件和目录是不同的用户创建一般文件,则默认取消可执行权限,即666(rw-rw-rw-)用户创建目录文件,由于x与是否可以进入此目录有关,因此默认开放所有权限,即777(rwxrwxrwx)Q: 假设用户的umask是 003 则当其新建一个文件或者文件夹 的权限是什么A: 也就是去掉的权限是 other的 写 w 与 x文件 rw-rw-r–文件夹 rwxrxwr–设置 umaskumask 002查询文件 findfind [指定路径] [指定条件] [指定动作]默认会查找当前目录及子目录,把查找结果输出到屏幕上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 不同,默认能够随意运行的命令也不同(如root与vbird)PATH是可以修改的chapter 8 磁盘和文件管理EXT2Linux最传统的磁盘文件系统(filesystem)使用的是EXT2磁盘分区指的是告诉操作系统 这个磁盘在此分割槽可以存取的区域是由 A 磁柱到 B 磁柱之间的区块如此一来操作系统就能够知道他可以在所指定的区块内进行文件数据的读/写/搜寻等动作了。 也就是说,磁盘分区意即指定分割槽的启始与结束磁柱文件系统磁盘在做分区之后还需要格式化,这是因为每种操作系统所配置的文件属性/权限并不相同, 为了存放这些文件所需的数据,因此就需要将分区进行格式化,以成为操作系统能够利用的文件系统格式文件系统的运行这与操作系统的文件数据有关。较新的操作系统的文件数据除了文件实际内容外, 通常含有非常多的属性例如 Linux 操作系统的文件权限(rwx)与文件属性(拥有者、群组、时间参数等)。 文件系统通常会将这两部份的数据分别存放在不同的区块,权限与属性放置到 inode 中,至于实际数据则放置到 data block 区块中另外,还有一个超级区块 (superblock) 会记录整个文件系统的整体信息,包括 inode 与 block 的总量、使用量、剩余量等属性含义inode记录文件的属性,一个文件占用一个inode,同时记录此文件的数据所在的 block 号码block实际记录文件的内容,若文件太大时,会占用多个 blocksuperblock记录此 filesystem 的整体信息,包括inode/block的总量、使用量、剩余量, 以及文件系统的格式与相关信息等inodeinode 的内容在记录文件的权限与相关属性,至于 block 区块则是在记录文件的实际内容而文件系统一开始就将 inode 与 block 规划好了,除非重新格式化,否则 inode 与 block 固定后就不再变动Ext2 文件系统在格式化的时候基本上是区分为多个区块群组 (block group) 的,每个区块群组都有独立的 inode/block/superblock 系统blockdata block 是用来放置文件内容数据地方,在 Ext2 文件系统中所支持的 block 大小有 1K, 2K 及 4K 三种而已。在格式化时 block 的大小就固定了1 原则上,block 的大小与数量在格式化完就不能够再改变了(除非重新格式化)2 每个 block 内最多只能够放置一个文件的数据3 承上,如果文件大于 block 的大小,则一个文件会占用多个 block 数量4 承上,若文件小于 block ,则该 block 的剩余容量就不能够再被使用了(磁盘空间会浪费)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 主要读取的数据几乎都是针对一整个文件系统,因此读取的范围主要是在 Superblock 内的信息, 所以这个命令显示结果的速度非常的快速du与 df 不一样的是,du 这个命令其实会直接到文件系统内去搜寻所有的文件数据在默认的情况下,容量的输出是以 KB 来设计的, 如果你想要知道目录占了多少 MB ,那么就使用 -m 这个参数即可连接文件hard id_link新建一个文件名 链接到 某个inode 号码symbolic linkSymbolic link 就是在创建一个独立的文件,而这个文件会让数据的读取指向他 link 的那个文件的文件名ln [-sf] 源文件 目标文件// 不添加参数就是 hard link// 添加参数 -s 就是 symbolic link// f 如果目标文件存在 则先删除后再创建chapter 10 vim 编辑器vi 文本编辑器 vim 程序开发工具vivi 共分为三种模式,分别是『一般模式』、『编辑模式』与『指令列命令模式』一般模式以 vi 打开一个档案就直接进入一般模式了(这是默认的模式)编辑模式一般模式当中, 按下『i, I, o, O, a, A, r, R』等任何一个字母之后会进入编辑模式指令列命令模式一般模式当中,输入『 : / ? 』三个中的任何一个按钮,就可以将光标移动到最底下那一行chapter 11 bashshell需要计算机输出音乐,这个过程需要什么支持呢1 硬件需要你的硬件有声卡芯片2 内核管理需要操作系统的内核可以支持这个芯片组 还有芯片的驱动程序3 应用程序需要用户输入播放声音的指令以上三点是一个简单的输出声音的步骤。就是用户需要输出一个命令,硬件才会执行这个命令来工作。而硬件如何知道你所执行的命令呢,那就是内核的控制工作了我们需要通过shell将输入的命令与内核进行通信,这样内核就可以控制硬件来工作操作系统是一组软件,这组软件在控制硬件与管理系统的活动监测。如果这组软件能被用户随意操作会导致系统崩溃。所以不能让用户随意去使用。因此产生了一种在操作系统上的应用程序->shell其实shell的功能只是提供用户操作系统的一个接口,因此这个shell需要可以调用其他软件。简而言之,只要能够操作应用程序的接口,都叫做shellLinux的shellLinux有多种shell, 可以看下 /etc/shells各家的shell功能差不多,但是在某些语法执行方面不同。Linux默认使用的是 bash为什么我们系统上合法的 shell 要写入 /etc/shells 这个文件啊? 这是因为系统某些服务在运行过程中,会去检查使用者能够使用的 shells ,而这些 shell 的查询就是藉由 /etc/shells 这个文件我这个使用者什么时候可以取得 shell 来工作呢?还有, 我这个使用者默认会取得哪一个 shell ?当我登陆的时候,系统就会给我一个 shell 让我来工作了。 而这个登陆取得的 shell 就记录在 /etc/passwd 这个文件内bashbash 的几个优点1 命令记忆功能『上下键』可以追溯命令~/.bash_history 记录的是前一次登陆以前所运行过的命令, 而至于这一次登陆所运行的命令都被缓存在内存中,当你成功的注销系统后,该命令记忆才会记录到 .bash_history 当中2 命令与文件补全功能tab 键3 命名别名设置功能查询 alias设置 alias lm=‘ls -al’4 作业控制,前台,后台控制5 程序脚本当登录到Linux后,会依据/etc/passwd 文件的设置来给一个shell(默认bash) 然后就可以依据上面的命令操作 shelltype内部命令:由 bash 内置的命令外部命令:来字外部的命令,非 bash 内置查询一个命令是外部的还是bash内置的呢? – type可以看到 cd 这个命令是bash的内置命令shell 的变量功能Linux是多用户,多任务的环境,每个人在登录之后都会有一个bash。显示当前使用的shell,可以输入:echo $SHELL影响bash环境变量的操作那么由于在 Linux System 下面,所有的线程都是需要一个运行码, 『真正以 shell 来跟 Linux 沟通,是在正确的登陆 Linux 之后』这个时候你就有一个 bash 的运行程序,也才可以真正的经由 bash 来跟系统沟通而在进入 shell 之前,也正如同上面提到的,由于系统需要一些变量来提供他数据的存取 (或者是一些环境的配置参数值, 例如是否要显示彩色等等的) ,所以就有一些所谓的『环境变量』 需要来读入系统中了!这些环境变量例如 PATH、HOME、MAIL、SHELL 等等读取变量变量在显示的时候,前面必须带着 $ 符号echo $PATHecho ${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 workdirQ: 设置一个 变量代表 工作目录在父进程中定义的变量是无法在子进程中使用的,比如你定义了这个变量,然后再重新发开一个进程,是读不到这个变量的不过通过export将此变量设置为环境变量就可以使用了比如,定义变量 TRYPATH=/HOME/EORK写一个脚本echo $TRYPATH, 123然后在当前进程中执行 sh test.sh控制台无输出如果 export TRYPATH=/HOME/EORK就有信息输出了环境变量的功能查询当前有哪些环境变量,可以使用两个命令 env exportenv查询到目前shell环境下所有的环境变量setshell不只是有环境变量,还有各种自定义的变量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的那个记忆块导入自己的环境变量块中ulimitLinux 主机里面同时登陆了十个人,这十个人不知怎么搞的, 同时开启了 100 个文件,每个文件的大小约 10MBytes ,请问一下, 我的 Linux 主机的内存要有多大才够? 1010010 = 10000 MBytes = 10GBytes … 内存占用量很大,所以可以限制这个大小bash 可以限制用户的某些系统资源,比如文件打开数量,可用的CPU时间,可用内存总量等 ,这些通过 ulimit 进行设置参数解析含义unlimited无限制0无限制history查看历史命令historyhistory 10history -w // 写入 ~./bash_history历史命令的读取与记录是这样的:以 bash 登陆 Linux 主机之后,系统会主动的由家目录的 ~/.bash_history 读取以前曾经下过的命令,那么 /.bash_history 会记录几笔数据呢?这就与你 bash 的 HISTFILESIZE 这个变量配置值有关了!假设我这次登陆主机后,共下达过 100 次命令,『等我注销时, 系统就会将 1011100 这总共 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 /.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 命令运行的时候有输出的数据会出现! 那么如果这群数据必需要经过几道手续之后才能得到我们所想要的格式,应该如何来配置?grepuniq 去重wc 统计chapter 13 shell script就是在 shell 上运行的 script 脚本开发以 #!/bin/bash 开头 用以声明文件内语法使用bash语法条件判断if [ 条件判断式 ]; then 当条件判断式成立时,可以进行的命令工作内容;fi <==将 if 反过来写,就成为 fi 啦!结束 if 之意!如何运行sh base.shbash base.sh/bin/bash base.sh/bin/sh base.shsource x.shsource 可以回传变量// 定义变量 export 到全局export TRYPATH=‘trypath’// 定义 test.sh 内容为 // echo $TRYPATH// TRYPATH=‘changepath’sh test.sh // -> trypathecho $TRYPATH // -> trypath// 使用source执行source test.sh // trypathecho $TRYPATH // -> changepath也就是 source 可以修改父进程的变量chapter 14 账号管理与权限设置账号与用户组登陆 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]:[组员列表]看下这三者的关系有效用户组(effective group)与初始用户组(initial group)每个使用者在他的 /etc/passwd 里面的第四栏有所谓的 GID,就是『初始群组 (initial group) 』。也就是说,当用户一登陆系统,立刻就拥有这个群组的相关权限但是一个用户可以被加入到多个用户组去,比如 USERA 可以同时属于 group1 (初始用户组) 与 group2 (手动添加)那么当这个用户在新建一个文件的时候,新文件所属组是哪一个这个取决于当时的有效用户组查询当前用户所属的用户组groups第一个输出的群组即为 有效用户组 (effective group) 了以这个用户身份去新建一个文件,则文件的用户组就是这个 有效用户组有效群组的切换newgrp newGrooup但是使用newgrp 是有限制的,那就是你想要切换的群组必须是你已经有支持的群组,也就是说,只要我的用户有支持的群组就是能够切换成为有效群组账号管理用户相关// 新增一个用户usersadd newName// 删除一个用户userdel newNameCentOS 系统主要会帮我们处理几个项目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 usertestroot 忘记密码安全模式?? 太复杂了关于处理密码echo 123456 | passwd –stdin testuser2直接变更密码,不需要重复确认关闭/打开 某一个用户密码// 使用户密码失效passwd -S xxx// 使用户密码解锁passwd -u xxx用户的身份切换susu 需要新用户的密码 (如果原来的是root 切换到哪一个都不需要密码 )原本的变量不会改变, 比如PATH变量 mail 变量 还会是之前用户的// 使用 - 可以处理这个问题su -exit退出 第二个 用户状态 恢复到原始用户环境sudosudo 切换需要自己的密码,有时候还不需要sudo 可以让你以其他用户的身份运行命令 (通常是使用 root 的身份来运行命令), 只有在 /etc/sudoers 中的用户 才可以执行此命令将用户添加到 /etc/sudoersvisudo添加角色用户功能id查询某人或者自己的uid/gid等信息id// uid=1006(g1) gid=1007(girls) 组=1007(girls)id g2// uid=1007(g2) gid=1007(girls) 组=1007(girls)w / who当前谁登陆在系统上chapter16 例行性工作 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这两个文件限制了谁有权利去调用 at1 /etc/at.allow写在这个文件中的使用者才能使用 at ,没有在这个文件中的使用者则不能使用 at (即使没有写在 at.deny 当中)2 如果 /etc/at.allow 不存在,就寻找 /etc/at.deny 这个文件 凡是被写入的都不能使用at了(没有被写的就可以使用)3 如果两个文件都不存在,那么只有 root 可以使用 at 这个命令查询当前机器中有多少 at 的工作调度atq删除某一个工作调度atrm [jobnumber]batchbatch 就是另一种 at, 但是batch会在 CPU 工作负载 低于 0.8 的时候,才进行你所下达的工作任务CPU 工作负载如果某一个程序他需要一直使用 CPU 的运算功能,那么此时 CPU 的使用率可能到达 100% 但是 CPU 的工作负载则是趋近1,因为 CPU 仅负责一个工作如果同时运行2个这样的程序 CPU 的使用率还是 100% ,但是工作负载则变成 2crontab用户的设置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系统层级的crontabcrontab -e 是对于用户的,如果是系统的例行性任务,就需要另外处理了需要编辑 /etc/crontab 这个文件了cron 这个服务的最低侦测限制是『分钟』,所以『 cron 会每分钟去读取一次 /etc/crontab 与 /var/spool/cron 里面的数据内容 』,因此,只要编辑完 /etc/crontab 这个文件,并且将他储存之后,那么 cron 的配置就自动运行手动重启crond服务/etc/init.d/crond restartMAILTO当 /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这个就是一直在前台启动,我们可以将这个放在后台处理node index.js &添加的这个 & 会将命令放到后台处理,此时bash会输出一个 工作号码 1 和 PID 90328查询目前在后台的工作jobs参数含义l除了列出 job number 与命令串之外,同时列出 PID 的号码r仅列出正在背景 run 的工作s仅列出正在背景当中暂停 (stop) 的工作可以看到有一个 + - 号展示代表最近被放到背景的工作号码 - 代表最近最后第二个被放置到背景中的工作号码 而超过最后第三个以后的工作,就不会有 +/- 符号存在了后台工作拿到前台处理 fg (foreground)fg // 默认将 + 的工作取出来fg- // 取出来 - 的工作fg %工作号码 // 取出来这个工作号码的对应工作管理工作 killkill -signal %jobnumbersignal参数含义1重新读取一次参数的配置档 (类似 reload)2代表与由键盘输入 [ctrl]-c 同样的动作9立刻强制删除一个工作15以正常的程序方式终止一项工作。与 -9 是不一样的进程管理为什么需要进程管理1 Linux 系统是个很忙碌的系统,那么当整个系统资源快要被使用光时, 您是否能够找出最耗系统的那个程序,然后删除该程序,让系统恢复正常呢2 此外,如果由於某个程序写的不好,导致产生一个有问题的程序在内存当中,您又该如何找出他,然后将他移除呢?3 如果同时有五六项工作在您的系统当中运行,但其中有一项工作才是最重要的, 该如何让那一项重要的工作被最优先运行呢查看进程ps命令含义ps -l查询只和自己bash相关的进程ps aux当前内存所有进程ps 是静态的结果输出 是某一个时间点的进程状态toptop 可以监测整个系统的进程工作状态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 软件的按键如何查找最消耗CPU的进程使用 top 然后 按P进程管理其实是透过给予该程序一个信号 (signal) 去告知该程序如何操作查询所有的可用的singalkill -l常用的一些 信号数值名称含义1SIGHUP启动被终止的程序,可让该 PID 重新读取自己的配置档,类似重新启动killall -singal 命令名称根据进程名称删除此进程比如我们通过 node index.js & 启动这个服务到后台那么删除就可以是 killall -9 node要删除某个程序,我们可以使用 PID 或者是启动该程序的命令名称,而如果要删除某个服务呢?呵呵!最简单的方法就是利用 killall , 因为他可以将系统当中所有以某个命令名称启动的程序全部删除。进程的优先级Linux 给予程序一个所谓的『优先运行序 (priority, PRI)』, 这个 PRI 值越低代表越优先的意思之前我们查看一个进程 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新执行的命令处理nicenice [-n 数字] commandnice -n 5 vi数字范围在 -20 - 19renice已经存在的进程nice重新调整线程查看系统资源free 查看内存占用free [-b|-k|-m|-g] [-t]选项与参数-b :直接输入 free 时,显示的单位是 Kbytes,我们可以使用 b(bytes), m(Mbytes) k(Kbytes), 及 g(Gbytes) 来显示单位-t :在输出的最终结果,显示实体内存与 swap 的总量Mem 那一行显示的是实体内存的量, Swap 则是虚拟内存的量。 total 是总量, used 是已被使用的量, free 则是剩余可用的量。 后面的 shared/buffers/cached 则是在已被使用的量当中,用来作为缓冲及缓存的量。Linux 测试用主机是很平凡的,根本没有什么工作, 但是实体内存是几乎被用光不过,至少有 132MB 用在缓冲记忆 (buffers) 工作, 287MB 则用在缓存 (cached) 工作,也就是说,系统是『很有效率的将所有的内存用光』, 目的是为了让系统的存取效能加速很多朋友都会问到这个问题『我的系统明明很轻松,为何内存会被用光光?』被用光是正常的!而需要注意的反而是 swap 的量一般来说, swap 最好不要被使用,尤其 swap 最好不要被使用超过 20% 以上, 如果您发现 swap 的用量超过 20% ,那么,最好还是买实体内存系统会使用到 swap , 绝对是因为实体内存不足了才会这样做的 Linux 系统为了要加速系统效能,所以会将最常使用到的或者是最近使用到的文件数据缓存 (cache) 下来, 这样未来系统要使用该文件时,就直接由内存中搜寻取出,而不需要重新读取硬盘,速度上面当然就加快了! 因此,实体内存被用光是正常的uname:查阅系统与核心相关资讯uptime:观察系统启动时间与工作负载netstartnetstart -tlnp特殊文件和程序chapter 18 系统服务系统为了某些功能必须要提供一些服务 (不论是系统本身还是网络方面),这个服务就称为 service但是 service 的总是需要程序的运行吧!达成这个 service 的程序我们就称呼他为 daemon举例来说,达成循环型例行性工作排程服务 (service) 的程序为 crond 这个 daemonchapter23 软件安装Linux 开发商先在固定的硬件平台与操作系统平台上面将需要安装或升级的软件编译好, 然后将这个软件的所有相关文件打包成为一个特殊格式的文件,在这个软件文件内还包含了预先侦测系统与相依软件的脚本, 并提供记载该软件提供的所有文件资讯等。最终将这个软件文件发布。用户端取得这个文件后,只要透过特定的命令来安装, 那么该软件文件就会依照内部的脚本来侦测相依的前驱软件是否存在,若安装的环境符合需求,那就会开始安装, 安装完成后还会将该软件的资讯写入软件管理机制中,以达成未来可以进行升级、移除等动作目前Linux常用的两大安装方式为 dpkg rpm不论 dpkg/rpm 这些机制或多或少都会有软件属性相依的问题,那该如何解决呢?其实前面不是谈到过每个软件文件都有提供相依属性的检查吗?那么如果我们将相依属性的数据做成列表, 等到实际软件安装时,若发生有相依属性的软件状况时,管理机制自动去取得其依赖来同时安装, 就解决了属性相依的问题目前新的 Linux 开发商都有提供这样的『线上升级』机制,透过这个机制, 原版光盘就只有第一次安装时需要用到而已,其他时候只要有网络,你就能够取得原本开发商所提供的任何软件了CentOS 系统嘛!所以说:使用的软件管理机制为 RPM 机制,而用来作为线上升级的方式则为 yumrpmRPM是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软件包全路径名网络相关基本的网络配置1、主机名2、ip地址3、网关地址4、DNS服务器地址DNSDNS客户配置文件 /etc/resolv.conf 该文件中指定系统所使用的DNS服务器的IP地址网络相关命令// 显示当前系统的主机名称hostname// 设置系统主机名hostname 主机名称pingPing [–c 发出的报文数 ]目的主机地址Ping命令通过向被测试的目的主机地址发送ICMP报文并收取回应报文,来测试当前主机到目的主机的网络连接状态nslookup用于使用系统设定的DNS服务器解析域名,用该命令可以测试NDS服务器是否工作正常Nslookup命令有交互方式查询和命令行方式查询#nslookup#nslookup 主机域名 | ip地址nslookupwww.webmxx.com]# type -a echoecho is aliased to `echo -n’echo is a shell builtinecho is /bin/echo可以看到先找alias在内置命令 最后PATHbash的登录信息这些都可以进行配置的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_login 用户登陆时 bash会读取这个文件。通常把登陆就要执行的指令放在这以 non-login shell 方式/.bash_profile 存在,那么其他两个文件不论有无存在,都不会被读取。 如果 /.bash_profile 是个人的bash配置文件,存在每位用户的$HOME/.bash_profile 不存在才会去读取 /.profile/.bash_login,而前两者都不存在才会读取 /.bash_login/.profile 的意思在 login shell 的 bash 环境中,所读取的个人偏好配置文件其实主要有三个,依序分别是:/.bash_profile