From 8be7405860a6757ce6ca4c7347bc279aaa215c00 Mon Sep 17 00:00:00 2001 From: CyC2018 <1029579233@qq.com> Date: Sat, 16 Jun 2018 13:09:44 +0800 Subject: [PATCH] auto commit --- notes/Linux.md | 107 +++++++++--------- pics/b8081c84-62c4-4019-b3ee-4bd0e443d647.jpg | Bin 0 -> 18432 bytes 2 files changed, 56 insertions(+), 51 deletions(-) create mode 100644 pics/b8081c84-62c4-4019-b3ee-4bd0e443d647.jpg diff --git a/notes/Linux.md b/notes/Linux.md index 130bffc8..3aefdb35 100644 --- a/notes/Linux.md +++ b/notes/Linux.md @@ -63,7 +63,7 @@ * [wait()](#wait) * [waitpid()](#waitpid) * [孤儿进程](#孤儿进程) - * [僵死进程](#僵死进程) + * [僵尸进程](#僵尸进程) * [参考资料](#参考资料) @@ -380,19 +380,19 @@ ext3/ext4 文件系统引入了日志功能,可以利用日志来修复文件 使用 ls 查看一个文件时,会显示一个文件的信息,例如 `drwxr-xr-x. 3 root root 17 May 6 00:14 .config`,对这个信息的解释如下: -- drwxr-xr-x:文件类型以及权限,第 1 位为文件类型字段,后 9 位为文件权限字段。 -- 3:链接数; -- root:文件拥有者; -- root:所属群组; -- 17:文件大小; -- May 6 00:14:文件最后被修改的时间; -- .config:文件名。 +- drwxr-xr-x:文件类型以及权限,第 1 位为文件类型字段,后 9 位为文件权限字段 +- 3:链接数 +- root:文件拥有者 +- root:所属群组 +- 17:文件大小 +- May 6 00:14:文件最后被修改的时间 +- .config:文件名 常见的文件类型及其含义有: -- d:目录; -- -:文件; -- l:链接文件; +- d:目录 +- -:文件 +- l:链接文件 9 位的文件权限字段中,每 3 个为一组,共 3 组,每一组分别代表对文件拥有者、所属群组以及其它人的文件权限。一组权限中的 3 位分别为 r、w、x 权限,表示可读、可写、可执行。 @@ -435,7 +435,7 @@ cd [相对路径或绝对路径] ### 4. rmdir -删除目录,必须为空。 +删除目录,目录必须为空。 ```html rmdir [-p] 目录名称 @@ -499,7 +499,7 @@ cp [-adfilprsu] source destination # chmod [-R] xyz dirname/filename ``` -范例:将 .bashrc 文件的权限修改为 -rwxr-xr--。 +示例:将 .bashrc 文件的权限修改为 -rwxr-xr--。 ```html # chmod 754 .bashrc @@ -518,7 +518,7 @@ cp [-adfilprsu] source destination - =:设定权限 ``` -范例:为 .bashrc 文件的所有用户添加写权限。 +示例:为 .bashrc 文件的所有用户添加写权限。 ```html # chmod a+w .bashrc @@ -545,9 +545,11 @@ cp [-adfilprsu] source destination -f :如果目标文件存在时,先删除目标文件 ``` +

+ ### 1. 实体链接 -它和普通文件类似,实体链接文件的 inode 都指向源文件所在的 block 上,也就是说读取文件直接从源文件的 block 上读取。 +在目录下创建一个条目,记录着文件名与 inode 编号,这个 inode 就是源文件的 inode。 删除任意一个条目,文件还是存在,只要引用数量不为 0。 @@ -857,7 +859,9 @@ $ find /home -name .bashrc > list 2>&1 # 八、管线指令 -管线是将一个命令的标准输出作为另一个命令的标准输入,在数据需要经过多个步骤的处理之后才能得到我们想要的内容时就可以使用管线。在命令之间使用 | 分隔各个管线命令。 +管线是将一个命令的标准输出作为另一个命令的标准输入,在数据需要经过多个步骤的处理之后才能得到我们想要的内容时就可以使用管线。 + +在命令之间使用 | 分隔各个管线命令。 ```bash $ ls -al /etc | less @@ -874,7 +878,7 @@ $ cut -c :以字符为单位取出区间 ``` -范例 1:last 将显示的登入者的信息,要求仅显示用户名。 +示例 1:last 显示登入者的信息,取出用户名。 ```html $ last @@ -885,7 +889,7 @@ root pts/1 192.168.201.254 Thu Feb 5 22:37 - 23:53 (01:16) $ last | cut -d ' ' -f 1 ``` -范例 2:将 export 输出的讯息,取得第 12 字符以后的所有字符串。 +示例 2:将 export 输出的讯息,取出第 12 字符以后的所有字符串。 ```html $ export @@ -914,7 +918,7 @@ $ sort [-fbMnrtuk] [file or stdin] -k :指定排序的区间 ``` -范例:/etc/passwd 文件内容以 : 来分隔,要求以第三列进行排序。 +示例:/etc/passwd 文件内容以 : 来分隔,要求以第三列进行排序。 ```html $ cat /etc/passwd | sort -t ':' -k 3 @@ -932,7 +936,7 @@ $ uniq [-ic] -c :进行计数 ``` -范例:取得每个人的登录总次数 +示例:取得每个人的登录总次数 ```html $ last | cut -d ' ' -f 1 | sort | uniq -c @@ -961,7 +965,7 @@ $ tr [-ds] SET1 ... -d : 删除行中 SET1 这个字符串 ``` -范例,将 last 输出的信息所有小写转换为大写。 +示例,将 last 输出的信息所有小写转换为大写。 ```html $ last | tr '[a-z]' '[A-Z]' @@ -1013,7 +1017,7 @@ $ split [-bl] file PREFIX ## grep -使用正则表示式把匹配的行提取出来。 +g/re/p(globally search a regular expression and print),使用正则表示式进行全局查找并打印。 ```html $ grep [-acinv] [--color=auto] 搜寻字符串 filename @@ -1024,7 +1028,7 @@ $ grep [-acinv] [--color=auto] 搜寻字符串 filename --color=auto :找到的关键字加颜色显示 ``` -范例:把含有 the 字符串的行提取出来(注意默认会有 --color=auto 选项,因此以下内容在 Linux 中有颜色显示 the 字符串) +示例:把含有 the 字符串的行提取出来(注意默认会有 --color=auto 选项,因此以下内容在 Linux 中有颜色显示 the 字符串) ```html $ grep -n 'the' regular_express.txt @@ -1056,15 +1060,11 @@ $ printf '%10s %5i %5i %5i %8.2f \n' $(cat printf.txt) ## awk -可以根据字段的某些条件进行匹配,例如匹配字段小于某个值的那一行数据。 - -```html -$ awk '条件类型 1 {动作 1} 条件类型 2 {动作 2} ...' filename -``` +是由 Alfred Aho,Peter Weinberger, 和 Brian Kernighan 创造,awk 这个名字就是这三个创始人名字的首字母。 awk 每次处理一行,处理的最小单位是字段,每个字段的命名方式为:\$n,n 为字段号,从 1 开始,\$0 表示一整行。 -范例 1:取出登录用户的用户名和 ip +示例 1:取出登录用户的用户名和 ip ```html $ last -n 5 @@ -1077,15 +1077,30 @@ dmtsai tty1 Fri May 29 11:55 - 12:11 (00:15) $ last -n 5 | awk '{print $1 "\t" $3} ``` +可以根据字段的某些条件进行匹配,例如匹配字段小于某个值的那一行数据。 + +```html +$ awk '条件类型 1 {动作 1} 条件类型 2 {动作 2} ...' filename +``` + +示例 2:/etc/passwd 文件第三个字段为 UID,对 UID 小于 10 的数据进行处理。 + +```text +$ cat /etc/passwd | awk 'BEGIN {FS=":"} $3 < 10 {print $1 "\t " $3}' +root 0 +bin 1 +daemon 2 +``` + awk 变量: | 变量名称 | 代表意义 | -| -- | -- | +| :--: | -- | | NF | 每一行拥有的字段总数 | | NR | 目前所处理的是第几行数据 | | FS | 目前的分隔字符,默认是空格键 | -范例 2:输出正在处理的行号,并显示每一行有多少字段 +示例 3:输出正在处理的行号,并显示每一行有多少字段 ```html $ last -n 5 | awk '{print $1 "\t lines: " NR "\t columns: " NF}' @@ -1096,17 +1111,6 @@ dmtsai lines: 4 columns: 10 dmtsai lines: 5 columns: 9 ``` -可以使用条件,其中等于使用 ==。 - -范例 3:/etc/passwd 文件第三个字段为 UID,对 UID 小于 10 的数据进行处理。 - -```text -$ cat /etc/passwd | awk 'BEGIN {FS=":"} $3 < 10 {print $1 "\t " $3}' -root 0 -bin 1 -daemon 2 -``` - # 十、进程管理 ## 查看进程 @@ -1172,8 +1176,8 @@ daemon 2 | R | running or runnable (on run queue) | | D | uninterruptible sleep (usually I/O) | | S | interruptible sleep (waiting for an event to complete) | -| Z | defunct/zombie, terminated but not reaped by its parent | -| T | stopped, either by a job control signal or because it is being traced | +| Z | zombie (terminated but not reaped by its parent) | +| T | stopped (either by a job control signal or because it is being traced) | ## SIGCHLD @@ -1196,9 +1200,9 @@ pid_t wait(int *status) 父进程调用 wait() 会一直阻塞,直到收到一个子进程退出的 SIGCHLD 信号,之后 wait() 函数会销毁子进程并返回。 -如果成功,返回被收集的子进程的进程 ID;如果调用进程没有子进程,调用就会失败,此时返回 - 1,同时 errno 被置为 ECHILD。 +如果成功,返回被收集的子进程的进程 ID;如果调用进程没有子进程,调用就会失败,此时返回 -1,同时 errno 被置为 ECHILD。 -参数 status 用来保存被收集进程退出时的一些状态,如果我们对这个子进程是如何死掉的毫不在意,只想把这个僵死进程消灭掉,以设定这个参数为 NULL: +参数 status 用来保存被收集的子进程退出时的一些状态,如果我们对这个子进程是如何死掉的毫不在意,只想把这个子进程消灭掉,可以设置这个参数为 NULL: ```c pid = wait(NULL); @@ -1224,21 +1228,22 @@ options 参数主要有 WNOHANG 和 WUNTRACED 两个选项,WNOHANG 可以使 w 由于孤儿进程会被 init 进程收养,所以孤儿进程不会对系统造成危害。 -## 僵死进程 +## 僵尸进程 -一个子进程的进程描述符在子进程退出时不会释放,只有当父进程通过 wait() 或 waitpid() 获取了子进程信息后才会释放。如果子进程退出,而父进程并没有调用 wait() 或 waitpid(),那么子进程的进程描述符仍然保存在系统中,这种进程称之为僵死进程。 +一个子进程的进程描述符在子进程退出时不会释放,只有当父进程通过 wait() 或 waitpid() 获取了子进程信息后才会释放。如果子进程退出,而父进程并没有调用 wait() 或 waitpid(),那么子进程的进程描述符仍然保存在系统中,这种进程称之为僵尸进程。 -僵死进程通过 ps 命令显示出来的状态为 Z。 +僵尸进程通过 ps 命令显示出来的状态为 Z(zombie)。 -系统所能使用的进程号是有限的,如果大量的产生僵死进程,将因为没有可用的进程号而导致系统不能产生新的进程。 +系统所能使用的进程号是有限的,如果大量的产生僵尸进程,将因为没有可用的进程号而导致系统不能产生新的进程。 -要消灭系统中大量的僵死进程,只需要将其父进程杀死,此时所有的僵死进程就会变成孤儿进程,从而被 init 所收养,这样 init 就会释放所有的僵死进程所占有的资源,从而结束僵死进程。 +要消灭系统中大量的僵尸进程,只需要将其父进程杀死,此时所有的僵尸进程就会变成孤儿进程,从而被 init 所收养,这样 init 就会释放所有的僵死进程所占有的资源,从而结束僵尸进程。 # 参考资料 - 鸟哥. 鸟 哥 的 Linux 私 房 菜 基 础 篇 第 三 版[J]. 2009. - [Linux 平台上的软件包管理](https://www.ibm.com/developerworks/cn/linux/l-cn-rpmdpkg/index.html) - [Linux 之守护进程、僵死进程与孤儿进程](http://liubigbin.github.io/2016/03/11/Linux-%E4%B9%8B%E5%AE%88%E6%8A%A4%E8%BF%9B%E7%A8%8B%E3%80%81%E5%83%B5%E6%AD%BB%E8%BF%9B%E7%A8%8B%E4%B8%8E%E5%AD%A4%E5%84%BF%E8%BF%9B%E7%A8%8B/) +- [What is the difference between a symbolic link and a hard link?](https://stackoverflow.com/questions/185899/what-is-the-difference-between-a-symbolic-link-and-a-hard-link) - [Linux process states](https://idea.popcount.org/2012-12-11-linux-process-states/) - [GUID Partition Table](https://en.wikipedia.org/wiki/GUID_Partition_Table) - [详解 wait 和 waitpid 函数](https://blog.csdn.net/kevinhg/article/details/7001719) diff --git a/pics/b8081c84-62c4-4019-b3ee-4bd0e443d647.jpg b/pics/b8081c84-62c4-4019-b3ee-4bd0e443d647.jpg new file mode 100644 index 0000000000000000000000000000000000000000..58fb0a056e0899de307462a684ce4d4f9a8db7a9 GIT binary patch literal 18432 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 literal 0 HcmV?d00001