Linux


安装Linux

Linux 就是一个操作系统, 和大家熟悉的 Windows 一样。

所以我们要使用它,就需要先安装到电脑上。

你可以安装在一台单独的电脑上, 也可以安装在虚拟机里面。

虚拟机,就是在你的电脑上用软件模拟的电脑(是的,软件可以模拟硬件的运行环境, 比如你在电脑上玩过街机游戏吗?这些就是电脑软件模拟的街机硬件,运行街机游戏),这样你就可以在模拟的电脑里面 安装其他的操作系统, 比如Linux。

这样我们就在一个程序窗口里面运行另外一个操作系统了。

Windows操作系统有 Windows 7 、Windows 10、 Windows server 2016 等等众多的版本。

Linux 版本更多,比如 Ubuntu、RedHat、CentOS、Debian、Fedora等,这些都是Linux系统的不同发行版本.

服务器开发使用 CentOS 比较多,我们教程就以 Centos 为例讲解如何安装。

运行虚拟机软件的操作系统 我们称之为 host操作系统, 虚拟机 软件里面的操作系统称之为 guest操作系统

本文中的 host 操作系统是 Windows 10 , 而 guest 操作系统是 CentOS7

虚拟机安装 CentOS 分为两步

  • 创建虚拟机(就是虚拟电脑)
  • 在虚拟机上安装 CentOS 操作系统

在虚拟机安装CentOS,大家需要下载 CentOS的安装光盘镜像文件。

在国外下载比较慢,推荐到网易的镜像站点下载

点击这里访问网易镜像站点

linux系统怎么安装? - 知乎 (zhihu.com)

登录操作

Linux 是支持多用户的操作系统,什么叫多用户操作系统?

就是说,多个人都可以使用安装了Linux的同一台电脑。 其中有管理员用户(比如安装过程中就输入密码的那个root用户),普通用户。

不同的人有不同的权限,所以我们需要在Linux操作系统上创建多个账号给他们使用,对应不同的权限。

所以用户使用系统前必须先输入用户名密码登录,这样Linux才知道你是哪个用户。

Linux用户可以有如下两种登录方式:

  • Linux主机直接登录
  • 在另一台电脑远程登录

注销(退出Linux系统)

在每次使用完后,一定要进行注销(或者说退出),以防他人通过你的帐号进入系统。

在Linux提示符下,运行exit命令,即可退出本次登录

或直接按组合键 Ctrl+d

关机与重启

Linux主机的关机方法为:

root用户登录后,输入命令 poweroff 表示立即关机。

Linux主机的重启方法为:

root用户登录后,输入命令 reboot 表示立即关机。

文本编辑

命令模式

执行vi abc.txt 文件名 命令,就打开了vi去编辑文件abc.txt,默认进入的就是命令模式

在该模式下,不可以输入文字,那干什么呢?

那命令模式下面我们通常可以干什么呢?

首先就是移动光标

键盘h键 - 光标左移一个字符
键盘j键 - 光标下移一个字符
键盘k键 - 光标上移一个字符
键盘l键 - 光标右移一个字符

当然 也可以通过键盘 方向键 来移动光标位置。

另外还支持下面的按键操作

按0或^ - 光标移动到所在行的行首
按$    - 光标移动到所在行的行尾
输入gg - 把光标移到文件开始位置
输入G  - 把光标移到文件末尾
输入Ctrl + f  -  往下翻一页
输入Ctrl + b  -  往上翻一页

删除文字也是我们常做的操作

按x  - 删除光标所在字符
按dd - 删除光标所在行
按dw - 删除光标所在处到词尾的内容
按d$ - 删除光标所在处到行尾的内容

另外,还有下面这些操作

按yy – 复制光标所在的行
按p – 黏贴
按v,然后移动光标,可以选择内容,再按y复制选中的内容
按u – 撤销刚才所做的操作
按Ctrl+r – 重做被撤销当前所做的操作
按. – 重复刚才所做的操作

可能大家也发现了,上面说的命令模式下面的操作,都不可以直接输入文字到文件中。

要输入文字,就必须 切换到插入模式。

怎么切换到插入模式呢?

从命令模式进入插入模式的方式有:

按a-将在光标所在位置之后插入文本(append)
按i-将在光标所在位置之前插入文本(insert)
按o-将在光标所在行之后插入一新行

进入到插入模式,就可以输入文字了。

插入模式

插入模式是用来让 用户进行文件内容的输入的。

用户刚进入vi是命令模式, 想敲字符输入内容是不行的。必须进入插入模式,你才能输入字符。

在插入模式下,可以通过键盘方向键,来移动光标。

但是不能再 通过 ghjk 来移动光标了,因为现在你按这些按键就是输入对应的字符了。

在插入模式下,编辑文件的过程中,你经常需要切换回 命令模式,来删除字符、删除行,跳到上一页,到最后一行等等。

所以,我们使用vi,会非常频繁的在插入模式 和 命令模式之间切换, 大家要熟悉这种切换。

从插入模式切换到命令模式,就是输入按键 Esc,就是键盘左上角的那个按键。

底行模式

所谓 底行模式,就是在屏幕底部打开命令行,用来输入命令。

底行模式 主要是 输入命令 来 保存文件 或 退出vi程序、寻找字符串、列出行号等

注意:我们只能从命令模式进入底行模式。

所以,如果你现在是处于插入模式,必须先按Esc键进入命令模式后,再按冒号 / 进入底行模式。

底线模式常用操作有如下这些:

:wq 保存文件并退出

:q 不保存文件,并退出,如果文件做了修改,但有不想保存,需要用:q!

:q! 不保存文件,强制退出

:w 只保存文件,但是不退出vi,可以切换到输入模式下面继续编辑文件

:set nu 显示行号

/abc 在文件中查找abc字符。按 n 不停的往下查找,按 N 往上查找

:1,$s/string/replace/g 替换功能,把文件中的string,替换为replace 按Esc键,切换到命令模式

目录和文件操作

当前工作目录

我们在命令行里执行命令的时候,都有一个 当前目录(也叫工作目录) ,就是我们所在的目录。

当用户刚登录系统时,当前工作目录是用户的 home目录

root用户的home目录,是 /root

其他用户home目录,是在创建用户的时候 产生的,一般是 /home/用户名

比如你是用户 jn,home目录通常就是是 /home/jn。

当前目录下面的所有文件都可以直接访问, 假设当前目录 下面有个文件 a.txt。 要用vi编辑它,就可以直接执行vi a.txt

查看当前目录使用命令 pwd ,比如

[root@izbqz ~]# pwd
/root/package

改变当前目录用命令 cd

比如,

改变当前目录为package目录(这个动作也称之为进入到package目录), 就执行命令 cd package

改变当前路径到根目录 就执行命令 cd /

绝对路径与相对路径

Linux绝对路径和相对路径详解 (biancheng.net)

我们命令行要操作一个文件(或者目录),必须给出这个文件的路径。路径分为:

● 绝对路径: 绝对路径 开始于根目录,沿着目录层级,一直到达所期望的目录或文件。

比如下图

image

其 中的 photos(假设它是个目录) 的绝对路径 就是 /home/jono/photos

我们要进入到 photos这个目录,就执行命令 cd /home/jono/photos

● 相对路径:

相对路径相对的是 当前目录。

在使用相对路径的过程中, 经常用到一对特殊符号 . (点) 和 .. (两个点)。

符号 . 指的是当前目录,.. 指的是当前目录的父目录。

根据上面的图,假如当前目录为 jono ,如果要用相对路径切换到photos,就这样写 cd ./photos ,也可以直接写 cd photos

假如当前目录为 cory ,如果要用相对路径切换到 photos,就这样写 cd ../jono/photos 。其中 两个点 .. 表示上级目录。当然也可以使用绝对路径 cd /home/jono/photos

查看目录和文件

查看目录内容 或者某个文件的属性 使用命令 ls

ls 可能是用户最常使用的命令。通过它,我们可以知道目录里面包含的内容,也可以知道 文件和目录的 属性。

只要简单的输入 ls 就能看到 当前目录下所包含的文件和子目录列表。

除了当前工作目录以外,也可以指定要列出内容的目录,就像这样:

[root@iztqz ~]# ls /home/jn/
jn.txt  frontend

我们经常使用 ls 命令的“-l”选项,这样可以显示出更多的信息:

[jn@iztqz ~]$ ls -l
total 8
-rw-rw-r-- 1 jn jn   13 May 10 10:36 jn.txt
drwxrwxr-x 2 jn jn 4096 Apr 17 11:55 frontend

各个字段的含义如下:

-rw-r--r-- 文件的访问权限。第一个字符指明文件类型。在不同类型之间, 开头的“-”说明是一个普通文件,“d”表明是一个目录。其后三个字符是文件所有者的 访问权限,再其后的三个字符是文件所属组中成员的访问权限,最后三个字符是其他人的访问权限。这个字段的含义在后面用户权限那一章会详细讲解。

1 文件的硬链接数目。

jn 文件所有者的用户名。

jn 文件所属用户组的名字。

82 以字节数表示的文件大小。

May 10 10:36 上次修改文件的时间和日期。

jn.txt 文件名。

查看文本文件内容

查看文本文件的内容除了我们之前提到过的用vi编辑器外,对于比较短的文件, 可以直接用命令cat将文件的内容显示到屏幕上。

比如

[jn@izbp16hara3tw8kbagjotqz ~]$ cat jn.txt
jn testing

说明jn.txt 的文件内容就是 一行 jn jning

创建目录

mkdir 命令是用来创建目录的。

例如

mkdir jn1

会在当前目录下,创建一个名为”jn1”的目录,而

mkdir jn1 jn2 jn3

会创建三个目录,名为 jn1, jn2, jn3。

如果我们要创建好几层的目录,比如 /root/jn/python/lesson1,

直接这样写命令 mkdir /root/jn/python/lesson1

shell 会报错,因为系统中可能还 没有 /root/jn/python 这个目录。

一种方法是:我们 依次 创建 每一级目录, 像这样

mkdir /root/jn
mkdir /root/jn/python
mkdir /root/jn/python/lesson1

更简单的方法是,使用参数 -p

mkdir -p /root/jn/python/lesson1

删除文件和目录

rm 命令用来 删除 文件和目录。

rm 命令后面 直接加上要删除的文件,比如

rm file1 file2

当我们要删除目录的时候 ,需要加上 -r 选项,否则会报错,如下所示

$ rm dir1
rm: cannot remove 'dir1': Is a directory

要这样写

$ rm -r dir1

-r 参数 也可以详细的写成 –recursive 。 它表示要 递归地删除文件。 这意味着,如果要删除一个目录,而此目录 又包含子目录,那么子目录也会被删除。

通常 -r 和 -f 参数会一起使用。

-f 参数 也可以详细的写成–force 。 它表示忽视不存在的文件,不显示提示信息。

比如:

rm -rf file1 dir1 file2 dir2

如果文件 file1,或目录 dir1 不存在的话,rm 仍会继续执行,不会报错

执行 rm 操作 要非常小心, rm 不像Windows里面有回收站,一旦你用 rm 删除了一些东西,想再恢复是相当的麻烦的。

通配符

当前目录下有这样一些文件

jn1.txt  file1.jpg  file2.jpg  file3.jpg  
file5.jpg  hy2.jpg   hyjn.jpg  

我们要删除 其中 所有 以file开头, 扩展名为 .jpg 的文件,怎么办?

当然可以

rm -f file1.jpg  file2.jpg  file3.jpg file5.jpg

但是如果 这样的文件有上百个, 敲起来是非常麻烦的。

Linux 提供了一组特殊字符来匹配 文件名中的各部分内容。

这些特殊字符叫做 通配符

上面的例子,我们可以这样写

rm -f  file*.jpg
  • 匹配任意多个字符(包括零个或一个), 这样是不是,方便多了?

常用的通配符有下面:

* 匹配任意 多个 字符(包括零个或一个)

? 匹配任意 一个 字符(不包括零个)

[abcd] 匹配abcd中任意一个字符

下面是一些示例的用法

* 表示 所有文件(或目录)

jn* 表示 文件名以“jn”开头的文件(或目录)

jn*.py 表示 以”jn”开头,中间有任意多个字符,并以”.py”结尾的文件(或目录)

jn???? 表示 以“jn”开头,其后紧接着 4个字符 的文件(或目录)

[jnh]* 表示 文件名以”b”,“y”,或”h”开头的文件(或目录)

jn[0-9][0-9] 表示 以”jn”开头,并紧接着2个数字的文件(或目录)

很多 Linux命令,只要它们使用的参数是文件名,都可以使用通配符, 比如 ls、cp、rm、mv 等等

大家要注意:rm命令时,使用通配符特别要小心。

比如,你想删除一个目录中的所有 jpg 文件。你应该这样写 rm *.jpg

如果你不小心在 “*” 和 “.jpg” 之间多输入了一个空格,就像这样: rm * .jpg

这个 rm 命令会删除目录中的所有文件,还会提示没有文件叫做 “.jpg”。

复制文件和目录

cp 命令, 用来 复制文件或者目录。

假设 jn1 是一个文件,我们可以 这样

cp jn1 jn2

如果 jn2 这个文件 不存在, 上面的命令会创建一个新文件 jn2 ,并且把 jn1内容 拷贝到jn2中。

如果 jn2 已经存在了, 上面的命令会直接把 jn1内容 拷贝到jn2中, 就是说会覆盖jn2 原来的内容。

如果我们要拷贝的是一个目录, 则 需要加上 -r 选项

比如

cp -r  frontend frontend2

指定 -r 或者 –recursive 会递归地复制目录及目录中的内容。就是说,如果 frontend 里面有好多级子目录和文件,全部都会被拷贝过去。

可以拷贝 文件或者目录到 另外一个目录中,比如

cp -r file1 dir1 dir2 就是复制文件 file1 和 目录dir1 到目录 dir2中。目录 dir2 必须存在。

再比如 cp dir1/* dir2 这里使用通配符,可以把目录 dir1 中的所有文件都 复制到目录 dir2 中。 dir2 必须已经存在。

移动文件目录、重命名文件目录

mv 命令可以 移动 文件或者目录, 也可以 重命名 文件或者目录

mv 使用方法与 cp 很相像。

假设 jn1 是一个文件,我们可以 这样

mv jn1 jn2

如果 jn2 这个文件 不存在, 上面的命令会 把文件 jn1 改名为 jn2 ,并且把 jn1内容 拷贝到jn2中。

如果 jn2 已经存在了, 上面的命令会把文件 jn1 改名为 jn2, 等于删除了原来的 jn2。

假设 dir1 是一个目录,我们可以执行

mv  dir1 dir2

如果目录 dir2 不存在,就会把 dir1目录 改名为 dir2。

如果目录 dir2 存在,就会把 dir1(及它的内容)到目录 dir2。

假设 jn1 是一个文件,dir1 是一个目录,我们可以执行

mv  jn1 dir1 dir2

这样写的话, 如果目录 dir2 必须存在,就会 移动文件 jn1 和 目录 dir1(及它的内容)到目录 dir2。

在文件中查找字符串

在 Linux 操作过程中,经常需要在一个文本文件中 查询包含特定关键字的那些行的信息。

比如,我们需要在 日志文件 django.log 中查看所有包含了 Error 关键字的行。

当然,我们可以使用vi打开这个文件,然后再底行模式输入 /Error 查看。

更快捷的方式,就是直接 使用 grep命令

比如

$ grep Error django.log
1130_15:57:28 Internal Server Error: /api/cust/pages
    raise ExpiredSignatureError('Signature has expired')
jwt.exceptions.ExpiredSignatureError: Signature has expired
1130_16:00:20 Internal Server Error: /api/cust/pages
    raise ExpiredSignatureError('Signature has expired')
jwt.exceptions.ExpiredSignatureError: Signature has expired
1130_16:08:38 Internal Server Error: /api/cust/pages
    raise ExpiredSignatureError('Signature has expired')
jwt.exceptions.ExpiredSignatureError: Signature has expired

如果你想同时显示 各行的行号,可以加上参数 -n

比如

$ grep Error django.log -n
1:1130_15:57:28 Internal Server Error: /api/cust/pages
18:    raise ExpiredSignatureError('Signature has expired')
19:jwt.exceptions.ExpiredSignatureError: Signature has expired
20:1130_16:00:20 Internal Server Error: /api/cust/pages
37:    raise ExpiredSignatureError('Signature has expired')
38:jwt.exceptions.ExpiredSignatureError: Signature has expired
39:1130_16:08:38 Internal Server Error: /api/cust/pages
56:    raise ExpiredSignatureError('Signature has expired')
57:jwt.exceptions.ExpiredSignatureError: Signature has expired

如果你要查找的不仅仅是Error 这样的 一个单词,而是一段句子,比如 要找 Internal Server Error

就需要使用双引号,这样写

$ grep "Internal Server Error" django.log -n
1:1130_15:57:28 Internal Server Error: /api/cust/pages
20:1130_16:00:20 Internal Server Error: /api/cust/pages
39:1130_16:08:38 Internal Server Error: /api/cust/pages
58:1130_16:09:16 Internal Server Error: /api/cust/pages

用户管理和文件权限

用户和用户组

Linux系统是一个 多用户 的操作系统,任何一个用户,要使用系统,都必须使用Linux账号登陆系统。

Linux账号是向系统管理员申请创建的。

系统管理员可以为不同用户的账号分配不同的权限,从而控制他们对系统资源的访问。

Linux系统中,每个用户账号 都对应一个 用户 ID。

用户ID 就是一个数字,因为计算机处理数字更加方便。

用户的 ID 与账号的信息就存储在文件 /etc/passwd 当中。

另外 每个用户都属于一个 用户组 ,每个用户组对应一个 GroupID

系统管理员可以对一个用户组中的所有用户进行统一管理,比如分配权限等。

用户组 ID 的信息就存储在文件 /etc/group 当中

root用户

Linux 系统有个特殊的用户 root 。 该使用该用户账号的 就是 系统管理员。root用户是系统安装好就有的,具有系统中最高的权限。

有的LINUX服务器创建好后root无密码

添加用户

Linux系统中创建用户,可以使用命令 useradd

比如:

[root@localhost ~]# useradd jn

这样

  • 就添加了一个用户jn

    使用命令 cat /etc/passwd 查看文件内容,你会发现在/etc/passwd文件末尾中新增了一行数据,如下所示

    jn❌1000:1000::/home/jn:/bin/bash
    

    /etc/passwd文件每行对应一个用户的信息。 一行中的字段用”:“隔开。每个字段的含义分别是

    用户名
    登录密码 
    用户ID 
    用户Group ID
    描述信息
    用户的home目录
    该用户缺省shell
    
  • 该命令,同时也为该用户创建了一个用户组, 组名就叫 jn 。你会发现在 /etc/group 文件末尾中新增一行数据,如下所示

    jn❌1000:
    

    当然,你可以创建用户的时候,就加入一个指定的组,而不是新建一个组,
    比如 useradd -g root jn ,就在创建jnjn用户的同时,把它加入到 root 这个用户组里面了。

  • 另外还为该用户创建了一个 home目录(这里就是 /home/jn), 该目录作为jn用户登录后使用的主目录,该目录属于jn用户所有。

    useradd可以使用 -d 参数指定该用户使用的 home目录

设置密码

添加用户后,还得用户设置密码。使用命令 passwd

# passwd jn
Changing password for user jn.
New password:
Retype new password:
passwd: all authentication tokens updated successfully.

passwd命令不仅仅可以给新建用户设置密码,也可以给老用户修改密码。

但是,只有root用户才可以给其他用户设置密码,普通用户只能修改自己的密码。

删除用户

使用命令 userdel

比如

[root@bogon ~]# userdel jn

用户间切换

假如说,你是系统管理员, 正使用root账号操作。

现在你需要以jn账号进行一些操作, 可以从root用户切换到jn账号,

切换账号使用命令 su

比如 su - jn

注意,其中有一个符号 - , 切换命令中使用这个符号,表示要重新创建用户环境,就像使用jn账号重新登陆一样

也可以不要符号 -,比如 su jn ,这样就会使用当前的用户root的环境(保留现有的环境变量),切换到新用户jn

如果现有用户不是root 用户,切换到其他用户账号,需要输入密码, 如果是root用户则不需要输入密码。

添加用户组

增加一个新的用户组使用 groupadd 命令。

比如:

groupadd jnusers

此命令向系统中增加了一个新组jnusers。

删除用户组

如果要删除一个已有的用户组,使用 groupdel 命令

比如

groupdel jnusers

此命令从系统中删除组jnusers。

改变用户所属组

如果要将一个用户从组1改到组2,需要root用户使用 usermod 命令,其格式如下:

例如:

usermod –g g1 jn

此命令将用户jn转移至g1用户组中

usermod –G g2,g3 jn

此命令将用户jn同时添加到g2,g3两个用户组中

Linux 文件访问权限

Linux文件的访问有三种权限: 读(用字母r表示)、写(用字母w表示)、执行(用字母x表示)

某个用户 对于一个 文件

有读权限,表示该用户可以读取文件的内容,

有写权限,表示该用户可以修改文件内容,

有执行权限, 表示该用户可以运行该文件(当然该文件应该是可执行文件)

而 这三种权限 对目录,含义又不一样。

某个用户 对于一个 目录

有读权限,表示该用户可以查看该目录里面的内容,

有写权限,表示该用户可以在该目录里面 创建 和删除 文件,

有执行权限, 表示该用户可以使用 cd命令,进入该目录

对 某个文件或者目录,Linux系统需要说明 三种类型的用户 ,分别具有怎样的权限

这三种类型分别是:

  • 文件的所有者,英文叫 owner , 也就是 该文件的 创建者
  • 文件所有者在的用户组里面的用户 ,英文叫 grouper,
  • 其他用户 (非owner和非grouper)

Linux系统需要为每个文件和目录,指定这个三种类型的用户,具有什么r、w、x里面的哪些权限

文件存取权限的显示 可以通过”ls -l”命令显示,如:

$ ls -l file1

显示如下:

$ ls -l mysql57-community.rpm
-rwxr-xr--. 1 root root 9224 Sep 12  2016 mysql57-community.rpm

其中:

  • 第2-4字符”rwx”表示此文件所有者root 对此文件的操作权限是为”可读、可写、可执行”,
  • 第5-7字符”r-x” 表示此工作组root内的用户对此文件的操作权限是”可读、不可写、可执行”,
  • 第8-10字符”r–” 表示其他用户对此文件的操作权限是”可读、不可写、不可执行”

修改文件访问权限

文件的所有者或者root用户可以修改文件的访问权限

用chmod命令修改文件的存取权限,chmod命令的格式如下:

chmod  [who][op][permission]  file...

who项表示用户类型,它的内容为以下一项或多项:

u    拥有者(user --- owner)
g    与拥有者同一组的用户(group)
o    其他人(other)
a    所有人(all)

op项表示动作:

+    表示要加上permission指定的权利
-    表示要取消permission指定的权利

permission项为存取权限,它的内容为以下一项或多项:

r    表示可读
w    表示可写
x    表示可执行

比如:

chmod u+w file1 ,该命令添加了 拥有者对file1文件的写权限

chmod u-x file1 ,该命令去掉了 拥有者对file1文件的执行权限

chmod ug+rwx file1 ,该命令添加了 拥有者和同组用户 对file1文件的 读、写、执行权限

chmod a+rwx file1,该命令添加了 所有人 对file1文件的 读、写、执行权限

改变文件所有者及文件所在组

chown将指定文件的拥有者改为指定的用户或组。

该命令的参数中,用户可以是用户名或者用户ID;组可以是组名或者组ID。文件是以空格分开的要改变权限的文件列表,支持通配符。

系统管理员经常使用chown命令,在将文件拷贝到另一个用户的名录下之后,让用户拥有使用该文件的权限.

注意:必须是有root权限的用户才能改变文件所有者。

改变文件所有者的命令格式如下:

chown [选项]... [所有者][:[组]] 文件...

例如:

chown jn test1 ,就把文件test1的所有者变更为用户jn

chown jn:jn test1 ,就把文件test1的所有者变更为用户jn,所属组变为jn

chown -R jn dir1 ,就把目录dir1以及下面所有的子目录和文件的所有者变更为用户jn

也可以用命令chgrp改变文件所有者组,格式如下:

chgrp [选项] [组] [文件]

注意:必须是有root权限的用户才能改变文件组别的归属{: .notice–info}

比如:

chgrp jn test1 , 就把文件test1的用户组变更为组jn

进程管理

进程的概念

Linux系统中,进程也有PID。

在Linux中,你正在运行的交互式命令行程序 Shell, 它就是一个进程。

我们可以用命令 ps 查看进程信息的命令。

[jn@localhost ~]$ ps
  PID TTY          TIME    CMD
 4786 pts/0    00:00:00   bash

如上所示,当前bash shell的 进程 PID 为 4786

进程的创建与查看

Linux中,一个进程A里面可以创建出一个新的进程B,进程A就叫做进程B的 父进程 (parent process)。

进程B叫做进程A的子进程(child process)。

最典型的例子,我们在shell中运行的程序(命令),都是shell进程创建的,所以shell进程就是他们的父进程。

Linux中,主要是通过ps命令来查看进程信息的,我们运行命令ps -f ,结果如下所示

[jn@localhost ~]$ ps -f
UID        PID  PPID  C STIME     TTY      TIME    CMD
jn        4786  1780  0 06:45     pts/0    00:00:00  -bash
jn        1865  4786  0 06:55     pts/0    00:00:00   ps –f

其中 PPID这一列就是该进程的父进程的PID。

我们可以看出 ps 命令对应的进程的父进程PID为4786,正是bash进程的PID。

下面列举了常用的 ps命令 的例子:

ps 显示和当前终端有关的进程信息

ps -u jn 显示jn用户所创建的进程信息

ps -f 详细显示每个进程信息

ps -e 显示所有正在运行的进程信息

ps -ef 显示当前系统所有的进程

ps –ef|grep python 查找python进程

进程的前台、后台转换

Linux终端通过Shell程序来接收用户输入的命令,并且执行命令。

我们在Shell里正在执行的,和用户进行人机交互的进程叫 前台进程 (foreground process)

前台进程可以接收键盘输入并将结果显示在显示器上。

用户敲入什么命令,shell就会启动对应的程序,运行在 前台

比如,大家可以用vi 编写一个 下面的Python程序到 Linux主机上,代码文件名可以为t1.py

while True:    
    info = raw_input("please input something:")
    print("you input:%s\n\n" % info)

然后使用命令 python t1.py 运行。

可以发现及时这个 python 程序变成了前台进程,接收用户的输入。

有些程序运行时,并不需要和用户进行交互,也就是说,不需要用户输入什么内容。 比如一个日志分析程序,一个定时清理磁盘文件的程序。

比如,下面这样的一个Python程序 t2.py:

import time

while True:    
    print("execute a task ...")
    time.sleep(2)
    print("done, wait for an hour to proceed...")
    time.sleep(3600)

我们可以执行命令 python t2.py 运行它

这样的程序,运行期间,如果在前台执行,我们只能等待它结束,不然我们没法执行下个程序。

但是既然不需要用户输入信息,在前台执行,没有太大意义,我们应该要让它在 后台 执行。

要让它在后台运行,启动时只需在命令行的最后加上“&”符号。

比如 python t2.py &

后台运行的进程我们叫后台进程(background process),或者后台任务 ,它不直接和用户进行交互的进程。用户一般是感觉不到后台进程程序的运行。

当在后台运行命令时,有时需要其输出重定向输出到一个文件中去,以便以后检查。

比如 在后台运行find命令,在当前目录及其子目路下查找文件名为 jn 的文件。

$ find . -name jn -print > log.txt &
4762

nohup

我们可以执行命令的时候,使用 & 结尾使进程在后台运行。

但是如果终端关闭,那么程序也会被关闭,因为shell会发送SIGHUP信号给这些进程。进程接收的该信号,如果没有特别的处理,缺省就会结束运行

为了避免这种情况,那么我们就可以使用 nohup 这个命令。

比如我们有个test.sh 需要在后台运行,并且希望在后台能够一直运行,即使关闭了终端,也不退出。那么就使用nohup:

nohup /root/test.sh &

进程的终止

进程一般有两种终止方式。

  • 自行终止

有的进程执行完一段任务后,就自行退出了。

比如上面的ps命令,它执行完查看进程信息的任务后,就会结束。

也有的不是自动退出,而是用户操作它,让它退出。 比如 我们在Shell进程中运行exit命令后,该Shell进程就会退出。

也有的是异常退出,比如程序有个bug(比如代码里面有除以0的指令),该程序无法执行下去,也会终止。

  • 被强行杀死

有的进程一直不结束,如果用户觉得该进程应该被强行结束了,该怎么办呢?

对于一个前台进程,要结束它,我们只需要按组合键: Ctrl + C

对于一个后台运行的进程 ,如果用户觉得该进程应该被强行结束,可以使用 kill -9 命令强行杀死该进程。

比如上面的 python t2.py 命令运行的进程。 我们可以先用ps命令查出它的进程PID,

[jn@localhost ~]$ ps -f
UID        PID  PPID  C STIME TTY       TIME     CMD
jn       2281  1780  0 06:45 pts/0    00:00:00 -bash
jn       1442  2281  0 07:19 pts/0    00:00:00 python pt.py
jn       1911  2281  1 07:20 pts/0    00:00:00 ps -f

如上所示的python进程PID为 1442,我们再执行命令 kill -9 1442。 这样就强行停止了该进程。

要注意的是, 上面所示的进程启动它的用户为jn,那么只能是用户jn或者root用户才能杀死该进程

环境变量

Shell是个特殊的进程,因为我们通过它来执行命令,启动其他的进程的。所以它是很多进程的父进程。

Shell 这个父进程有很多特性会影响到我们执行命令,其中非常重要的一个就是 环境变量

环境变量 设置了 进程运行的环境信息。

Linux 的环境变量具有继承性,即:子进程 会继承父进程 的环境变量。

我们可以用命令printenv来查看当前shell的环境变量。

  • 环境变量PATH

我们可以看到环境变量有很多,通常我们最关注的一个就是环境变量是其中的 PATH

因为PATH 决定了当我们敲入命令的时候,到哪里去找这个命令对应的可执行程序。

用命令 echo $PATH 来查看环境变量PATH的值,比如

[jn@localhost ~]$ echo $PATH
/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/jn/bin

当我敲入命令ps后,shell就会 依次 到下面的路径去寻找ps命令对应的可执行文件 /usr/local/bin -> /bin -> /usr/bin -> /usr/local/sbin -> /usr/sbin -> /sbin -> /home/jn/bin

  • 在环境变量PATH里面添加一个新的路径

方法一:执行命令 export PATH

比如:

export PATH=/test:$PATH

再次查看环境变量PATH的值,结果如下

[jn@localhost ~]$ echo $PATH
/test:/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/jn/bin

说明添加PATH成功。

但是这种方式生效时临时的。再次登录的时候,PATH里面就又没有这个环境变量了。

需要一直生效,可以使用方法二。

方式二:写入到shell启动文件中

所谓shell启动文件(Startup Files)是指Shell启动时 会 自动加载执行 的文件。

既然这些文件会自动被shell加载执行,通常我们可以在里面放入一些 例行 执行的命令,比如设置一些环境变量。

bash Shell启动文件有好几个,比如 /etc/profile (所有用户共享), ~/.bash_profile , ~/.bash_login , and ~/.profile

具体细节参考这个文档

通常建议把某个用户 独有的 设置环境变量的 命令,放到用户家目录下面的 .bash_profile 文件中。

可以在文件的结尾加入一行

export PATH=/test:$PATH

好了,下次登录的时候,PATH里面就会多出/test;

如果要对当前的shell就立即生效,可以执行命令 source .bash_profile

重定向和管道

stdin/stdout/stderr 与 重定向

Linux进程在启动后,通常就会打开3个文件句柄,标准输入文件(stdin),标准输出文件(stdout)和 标准错误文件(stderr)。

Linux进程,要从用户那里读入输入的信息,就是从stdin文件里面读取信息,要 输出 信息 给用户看 都是 输出到 stdout, 要 输出 错误提示 给用户看 都是 输出到 stderr。

而缺省情况下这三个文件stdin、stdout、stderr 都指向 —— 终端设备。

也就是说:

Linux进程从stdin里面读取信息其实就是从终端设备(比如终端模拟程序Putty)读取信息;

Linux进程写入信息到stdout或者stderr,其实就是打印到终端设备上。

如下图所示

image

比如,运行下面的Python程序,要读入信息,就是从终端读入,因为stdin指向终端设备

input("please input info:")

再比如:下面的命令echo输出给用户看的,就是输入到终端上,因为stdout指向终端设备

[root@bogon ~]# echo "hello jn"
hello jn

Stdout、Stderr重定向

如果我们在Shell中输入命令的时候,使用 > 符号, 就可以将输入信息输出到其他文件(包括设备文件)中去。比如

ps > out

运行后,我们会发现out文件里面出现了ps的输入信息,而Putty终端窗口里面则没有任何内容打印出来了。

这个 > 就是 stdout 重定向符号, 它表示 stdout 不是指向 终端设备了,而是 重定向到 out 文件。 所以stdout 指向了 out 文件, 输入的信息就到 out 文件了。 终端屏幕上就没有信息了。

这时对应的示意图如下

image

而Stderr的重定向符号 是 2> 。 注意 2 和 > 之间不能有空格。

比如我们执行下面的命令,其中hhhh是个不存在的文件

ps hhhh 2> err 

我们就会发现putty屏幕上没有任何信息,而文件 err里面则有。

如果我们要,同时重定向stdout和stderr到同一个文件both中,命令写法如下:

command &> both

如果我们要,重定向stdout到out文件,并重定向stderr到err文件,命令写法如下:

command > out 2>err

stdin重定向

我们也可以在命令中,将 标准输入stdin 重定向,使用符号 <

用 vi 创建一个 Python 2 代码文件 add.py ,其内容如下

for i in xrange(3):
    data=raw_input()
    print ('%s+1=%s' % (data,int(data)+1))

该程序从stdin 读取一个数字后,显示其加1后的结果。

再创建一个文件 add.dat内容如下(注意3后面有个空行)

1
2
3

执行如下命令

[jn@localhost ~]$ python add.py < add.dat
1+1=2
2+1=3
3+1=4

看到了吗?不需要我们从终端输入数字,该程序直接从文件 add.dat中读取数据并执行操作了。

这个 < 就是 stdin 重定向符号, 它表示 stdin 不是指向 终端设备了,而是 重定向到 add.dat 文件。 所以 stdin 指向了 add.dat 文件, 程序就从add.dat 文件读入信息 了。

这时该进程对应示意图如下:

image

管道

上面我们曾经学习过grep命令,这个命令可以从文件中过滤出 包含指定字符串模式 的行。

比如我们有个文件file1,里面有的行包含了mike 这个词。如果我们想把所有包含mike的行都找出来。 可以执行命令 grep mike file1

当grep命令中没有文件参数的时候比如 grep mike, 它就会等待我们在标准输入(一般是putty终端设备)中输入一行行的内容,进行实时的过滤

在Linux操作过程中,我们经常需要 将一个命令的输出的内容,给另一个命令作为输入的内容 进行处理。

比如,我们想查出进程号是 6536 的进程的信息。

我们用ps -ef 可以显示出所有的进程信息,但是这里面的内容太多了,我想过滤出其中包含 6536 字符串的行。

当然可以 用重定向符号 ps –ef > info.txt , 然后再使用grep从 info.txt中过滤 grep 6536 info.txt

但是这样比较麻烦,我们可以使用 管道操作符

我们看 这个命令 ps –ef | grep 6536

注意其中的 竖线 | , 这个就是管道操作符,它起的作用就是

● 将 前面的 ps –ef 命令的stdout(本来是输出到终端设备的) 重定向到一个 临时管道设备里面,

● 同时 将后一个命令 grep 6536 的stdin重定向到这个临时的管道设备。

那么这时会发生什么事情呢?ps –ef 命令的结果直接被 命令 grep 6536 过滤出来了。

这个过程可以用如下示意图表示

image

网络管理

查看网络接口IP地址

查看所有网络接口的IP地址,可以使用命令 ip addr

例如:

[root@localhost ~]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 08:00:27:b2:95:a6 brd ff:ff:ff:ff:ff:ff
    inet 192.168.10.199/24 brd 192.168.10.255 scope global noprefixroute dynamic enp0s3
       valid_lft 80268sec preferred_lft 80268sec
    inet6 fe80::56e2:2975:7aea:744a/64 scope link noprefixroute
       valid_lft forever preferred_lft forever

上面显示了 两个网络接口 lo 和 enp0s3。其中 lo 是环回接口,我们关注的应该是 enp0s3 这个接口。

上面命令的结果显示:enp0s3 这个接口 的 IPv4 地址是 192.168.10.199

CentOS 6 以前的版本,通常显示的接口名为 eth0 这样的格式, CentOS 7 显示的是 enp0s3 格式

启用、禁用网络接口

启用和禁用网络接口,要使用root用户执行

● 启用网络接口

使用命令 ifup,比如下面的命令就是启用网络接口 enp0s3

ifup enp0s3

● 禁用网络接口

使用命令 ifdown,比如下面的命令就是禁用网络接口 enp0s3

ifdown enp0s3

ping 检测网络连通性

我们经常需要检查到一个主机是否网络通畅,这时应该使用 ping 命令

例如:

$ ping 192.168.100.1
PING 192.168.100.1 (192.168.100.1) 56(84) jntes of data.
64 jntes from 192.168.100.1: icmp_seq=1 ttl=64 time=0.158 ms
64 jntes from 192.168.100.1: icmp_seq=2 ttl=64 time=0.228 ms
64 jntes from 192.168.100.1: icmp_seq=3 ttl=64 time=0.281 ms

上面的结果就表示 本机 和 IP 为192.168.100.1 的设备(可能是计算机也可能是路由器)之间的网络是通畅的。

可以按ctrl+C终止 测试。

netstat 查看网络状态

netstat - 查看各种与网络相关的状态信息,包括:网络的连接、状态、接口的统计信息、路由表、端口的监听情况

常用参数:

-a (all)显示所有选项,默认不显示LISTEN相关

-t (tcp)仅显示tcp相关选项

-u (udp)仅显示udp相关选项

-n 不显示端口协议名,显示端口数字

-l 只显示 Listen (监听) 的状态端口

-p 显示建立相关链接的进程PID

-r 显示路由信息,路由表

Netstat 最常用的地方就是查看网络连接情况,比如查看22端口上的tcp网络连接情况

使用命令 netstat -anp|grep 22 |grep tcp

[root@localhost ~]# netstat -anp |grep 22 |grep tcp
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      977/sshd
tcp        0     52 192.168.10.199:22       192.168.10.92:63911     ESTABLISHED 2011/sshd: root@pts
tcp6       0      0 :::22                   :::*                    LISTEN      977/sshd

如果你执行netstat命令,系统提示找不到该命令, 可以先执行 yum install net-tools 安装一下 {: .notice–info}

ssh(secure shell)登录远程机器

在Linux下,也可以远程登录其他Linux主机,只需要运行ssh命令即可。

命令的格式如下

ssh  用户名@IP地址或机器域名

比如,你要 使用 user1 账号 远程登录 192.168.1.12 这台Linux机器,执行下面的命令

[jn@localhost ~]$ ssh user1@192.168.1.12

一般首次登录某个主机的时候,会出现如下提示:

The authenticity of host '192.168.1.12 (192.168.1.12)' can't be established.
RSA key fingerprint is cf:2c:22:d1:e8:4e:f3:16:43:09:9c:c6:fe:fc:9a:22.
Are you sure you want to continue connecting (yes/no)?

这是因为该远程机器没有被认证过(可能会有‘中间人’攻击的安全隐患),让你确认一下。这里如果是局域网里面的机器,一般安全没有什么问题,输入yes并回车即可。

接下来,会提示输入对应用户的密码,你输入正确的密码即可登录。

scp 拷贝文件

在Linux上,可以直接使用scp命令 和远程Linux主机 进行文件的拷贝。

scp是secure copy的缩写,意为文件安全拷贝,它可以将远程Linux系统上的文件拷贝到本地计算机,也可以将本地计算机上的文件拷贝到远程Linux系统上。

比如:

我们已经登录到主机A上面,要将 /home/jn1 目录下面的文件abc.txt,拷贝到主机B的/home/jn2目录下面,主机B的IP地址为:192.168.1.12

我们要拷贝到 B主机, 必须要有B主机的用户账号, 假如B主机的账号是 jn2,应该这样写

scp /home/jn1/abc.txt jn2@192.168.1.12:/home/jn2

接下来,会提示用户输入用户jn2的密码,输入正确密码后,进行拷贝操作。

如果,我们要 在主机A上面,将主机B上面的文件/home/jn2/123.txt 拷贝到主机A的/tmp/下面:

scp jn2@192.168.1.12:/home/jn2/123.txt /tmp/

wget下载

Linux中,要从网络下载文件,可以使用 wget。

wget就是一个下载文件的命令行工具。

例如:

wget https://mirrors.aliyun.com/centos/timestamp.txt

防火墙

FirewallD

在CentOS 7 上, FirewallD 是 缺省的防火墙服务程序。

● 开放端口

如果我们允许 任何 地址的 机器访问 本机的 TCP 协议 3306 端口,应该这样执行命令

# firewall-cmd --permanent --add-port=3306/tcp 
# firewall-cmd --reload

第一行命令 在 配置文件中,设置打开端口3306

第二行命令将 配置文件的设置 重新加载,使配置立即生效。

可以执行如下命令检查 当前的 防火墙设置

# firewall-cmd --list-ports
3306/tcp

我们甚至可以 开放 一定范围内的 所以端口,如下

# firewall-cmd --permanent --add-port=200-300/tcp

就打开了 200 到 300 所有的 tcp 端口。

● 关闭端口

要关闭 端口,执行下面的命令

# firewall-cmd --permanent --remove-port=3306/tcp 
# firewall-cmd --reload

常用命令

启动、重启、关闭服务

Linux上有些软件程序是以服务的形式安装的,比如 ssh 服务、 MySQL服务、 防火墙 服务等。

这些 软件 的启动、重启、关闭 要使用特殊的命令

在centos 7 系统上,使用命令 systemctl 来 启动、重启、关闭 服务。

比如,

要查看 MySQL服务 mysqld状态, 执行命令 systemctl status mysqld

要启动 MySQL服务 mysqld, 执行命令 systemctl start mysqld

要重启 MySQL服务 mysqld, 执行命令 systemctl restart mysqld

要关闭 MySQL服务 mysqld, 执行命令 systemctl stop mysqld

打包与压缩

打包

Linux下打包的最常用命令是tar 命令,可将多个文件、目录打包到一个文件中。

  • tar 命令打包

下面是使用tar命令打包的操作演示:

在当前工作目录下面创建3个文件,使用下列命令:

touch  123.txt  456.txt  789.txt

将这3个文件放到一个文件包files.tar,使用下列命令:

tar  cvf  files.tar  123.txt   456.txt  789.txt

也可以使用通配符,如 *.txt,这样的格式代表以txt结尾的文件

tar  cvf  files1.tar   *.txt  

tar命令同样可以打包目录,假设 当前目录下 jn是一个子目录,jn.txt是一个文件

tar cvf jn.tar  ./jn  jn.txt

这个命令就把目录 jn 和 文件 jn.txt 都 打包到 文件 jn.tar 中了。

  • tar 命令解包

要 将 上面创建的 files1.tar 解压到当前目录,使用下列命令:

tar  xvf   files.tar 
  • 查看tar 包内容

如果只是想查看 上面创建的 files1.tar 内容,使用下列命令:

tar  tvf   files.tar 
  • 往tar 包中添加文件

如果想 在 files1.tar中 添加 新文件 newfile,使用下列命令:

tar  rvf  files.tar  newfile

注意:tar命令只是把文件、目录打包到一个文件中。 并不会压缩文件 {: .notice–info}

压缩

  • gzip 压缩 和解压

gzip命令用于文件的压缩与解压缩,压缩后的文件名后缀为“.gz”

比如

要 压缩文件abc.txt ,执行命令

gzip abc.txt

这样就产生了一个名为 abc.txt.gz 的压缩后的文件

要 解压文件abc.txt.gz,执行命令

gzip -d abc.txt.gz
  • gzip 和 tar 的联合使用

tar工具与gzip工具联合使用,实现打包并压缩、解压缩并解包功能

假设 在当前目录有如下3个文件 touch 111.txt 222.txt 333.txt

我们要,打包并压缩这3个文件,放到压缩包文件 jn.tar.gz里面,使用下面命令:

tar zcvf   jn.tar.gz   *.txt 

解压缩并解包,使用下面命令:

tar zxvf  jn.tar.gz 

● bzip2、zip 压缩、解压

bzip2 和 zip 也是常见的压缩解压工具, 使用方法和 gzip 类似

如下

---------------------------------------------
.bz2
解压1:bzip2 -d FileName.bz2
解压2:bunzip2 FileName.bz2
压缩: bzip2 -z FileName
.tar.bz2
解压:tar jxvf FileName.tar.bz2
压缩:tar jcvf FileName.tar.bz2 DirName
---------------------------------------------
.zip
解压:unzip FileName.zip
压缩:zip -r FileName.zip DirName
---------------------------------------------

注意:如果你的Linux上没有安装 bzip2、zip、unzip,可以执行命令 yum install bzip2 zip unzip 来安装

安装软件包

在 CentOS上,安装软件通常有如下几种方式

下载源代码包,编译安装

这种源代码包,通常都是放在以 tar.gz tar.bz2 为扩展名的压缩包中。

源代码包里面的大都是 c语言代码文件,需要编译后才能安装。

我们 以python3.6 为例,讲解一下,如何安装。

  • 执行下面的命令,安装Python3.6必需的库

    yum install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel

  • 下载 python3 源代码包

    执行命令 wget https://www.python.org/ftp/python/3.6.8/Python-3.6.8.tgz

  • 解压代码包

    执行命令 tar zxf Python-3.6.8.tgz

  • 安装编译器gcc

    如果你的Linux上还没有安装gcc编译器,执行命令 yum install gcc 安装

  • 配置、编译、安装

    先进入到解压后的python代码目录

    cd Python-3.6.8 
    

    依次执行下面的2个命令进行配置和编译、安装

    ./configure ; 
    make && make install
    

下载rpm包,使用rpm工具安装

CentOS上也经常使用rpm 命令安装软包。

当我们有rpm软件包,就可以使用rpm命令安装

  • 安装

使用命令

rpm -ivh rpm软件包名

比如, rpm -ivh software-1.2.3-1.i386.rpm

  • 卸载

使用命令

rpm -e 软件名 

不过要注意的是,后面使用的是软件名,而不是软件包名。

例如,要安装software-1.2.3-1.i386.rpm这个包时,应执行:

rpm -ivh software-1.2.3-1.i386.rpm 

而当卸载时,则应执行:

rpm -e software

YUM安装

YUM 是 在Fedora、RedHat、SUSE、CentOS中最常见也是最方便的一种安装方式。

能够从指定的服务器自动下载RPM包并且安装,可以自动处理依赖性关系,并且一次安装所有依赖的软件包,无须繁琐地一次次下载、安装

yum命令用法

  • yum install package1 安装指定的安装包package1
  • yum list 显示所有已经安装和可以安装的程序包
  • yum list installed 显示所有已经安装的程序包
  • yum list package1 显示指定程序包安装情况package1
  • yum remove package1 删除程序包package1

top 查看系统进程的动态运行情况

执行top命令可以查看 当前系统中,运行的进程的信息,比如

[root@localhost ~]# top

top - 14:01:00 up 15:52,  2 users,  load average: 0.00, 0.01, 0.05
Tasks:  97 total,   1 running,  96 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.0 us,  0.0 sy,  0.0 ni, 99.7 id,  0.0 wa,  0.0 hi,  0.3 si,  0.0 st
KiB Mem :  2895572 total,  2507692 free,   118824 used,   269056 buff/cache
KiB Swap:  3145724 total,  3145724 free,        0 used.  2598756 avail Mem

  PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND
 2041 root      20   0       0      0      0 S  0.3  0.0   0:03.60 kworker/0:3
    1 root      20   0  127960   6580   4104 S  0.0  0.2   0:01.91 systemd
    2 root      20   0       0      0      0 S  0.0  0.0   0:00.01 kthreadd
    3 root      20   0       0      0      0 S  0.0  0.0   0:00.29 ksoftirqd/0
    5 root       0 -20       0      0      0 S  0.0  0.0   0:00.00 kworker/0:0H
    6 root      20   0       0      0      0 S  0.0  0.0   0:00.05 kworker/u2:0
    7 root      rt   0       0      0      0 S  0.0  0.0   0:00.00 migration/0
    8 root      20   0       0      0      0 S  0.0  0.0   0:00.00 rcu_bh
    9 root      20   0       0      0      0 S  0.0  0.0   0:01.94 rcu_sched
   10 root       0 -20       0      0      0 S  0.0  0.0   0:00.00 lru-add-dra+
   11 root      rt   0       0      0      0 S  0.0  0.0   0:00.48 watchdog/0
   13 root      20   0       0      0      0 S  0.0  0.0   0:00.00 kdevtmpfs
   14 root       0 -20       0      0      0 S  0.0  0.0   0:00.00 netns
   15 root      20   0       0      0      0 S  0.0  0.0   0:00.01 khungtaskd
   16 root       0 -20       0      0      0 S  0.0  0.0   0:00.00 writeback
   17 root       0 -20       0      0      0 S  0.0  0.0   0:00.00 kintegrityd
   18 root       0 -20       0      0      0 S  0.0  0.0   0:00.00 bioset

● CPU 整体负载

在这行显示了 CPU 整体负载

Cpu(s):  0.0 us,  0.0 sy,  0.0 ni, 99.7 id,  0.0 wa,  0.0 hi,  0.3 si,  0.0 st

● 各个CPU 的负载(按键盘1,可以在整体cpu和所有cpu之间切换)

Cpu0  :  0.3%us,  0.3%sy,  0.0%ni, 97.7%id,  1.3%wa,  0.0%hi,  0.3%si,  0.0%st
Cpu1  :  0.0%us,  0.0%sy,  0.0%ni,100.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu2  :  0.0%us,  0.3%sy,  0.0%ni, 99.7%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu3  :  0.0%us,  0.0%sy,  0.0%ni,100.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
  • 进程的CPU占用

缺省情况下,进程列表里就是按CPU占用率来排序的。

如果不是,可以按快捷键大写的P要求top按照CPU占用率来排序。(按b,再按x可以显示当前排序列)

  • 整体内存使用量
KiB Mem :  2895572 total,  2507692 free,   118824 used,   269056 buff/cache
KiB Swap:  3145724 total,  3145724 free,        0 used.  2598756 avail Mem

注意:上面显示 2507692 free,并非只有 2507692 的内存可用。

因为 buffer 和 cache 部分的内存都是临时缓存用了, 其实也是可用的内存

实际可用的内存大概是 free + buffers + cached

  • 各个进程对内存的占用(RES)

按快捷键大写的 M 可以 对进程列表按照内存使用率来排序

查看系统内存使用情况

free命令可以显示Linux系统中空闲的、已用的物理内存及swap内存,及被内核使用的buffer。

[root@localhost ~]# free -m
              total        used        free      shared  buff/cache   available
Mem:           2827         115        2449           8         262        2538
Swap:          3071           0        3071

查看设置系统时间

date 可以用来显示或设定系统的日期与时间。

  • 显示当前日期和时间
[jn@localhost ~]$ date
Mon Nov 7  23:25:05 PST 2018
  • 设定日期
# date -s 20161109
  • 设定时间
# date -s 21:05:50

查看系统版本

  • 执行命令 uname –a 查看系统内核版本信息
[root@localhost ~]# uname -a
Linux bogon 3.10.0-862.el7.x86_64 #1 SMP Fri Apr 20 16:44:24 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux

其中3.10.0 为Linux内核的版本。

  • 执行命令 cat /etc/redhat-release 查看Linux系统版本信息
[root@localhost ~]# cat /etc/redhat-release
CentOS Linux release 7.5.1804 (Core)

其中,显示Linux发行版本为 CentOS Linux 7.5.1804 版本


文章作者: 姜楠
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 姜楠 !
  目录