学习笔记:Linux(尚硅谷)

介绍

  • 本文主要记录在学习尚硅谷的 Linux 课程时的一些笔记
  • 尚硅谷前端学科全套课程请点击这里进行下载,提取码:afyt

一、基础部分

1.学习内容

  • 基础 & 实操篇
    linux01.png

  • 定制篇
    linux02.png

2.学习方向

  • Linux 运维工程师:服务器的规划、调试优化、日常监控、故障处理、数据备份、日志分析

  • Linux 嵌入式工程师:掌握Linux下各种驱动程序开发、在嵌入式系统中进行程序开发

  • Linux 下开发项目:JavaEE、大数据、Python、PHP、C、C++

3.进阶之路

  • 主要有6个阶段:
    linux03.png

4.VM虚拟机相关知识

  • 桥接模式:Linux系统可以与其他系统通信,但会占用真实网络中的ip地址,而一个网段的ip地址是有限的,所以一般不使用该模式

  • NAT 模式:该模式会在真实主机上新建一个ip地址,然后在这个ip地址下划分子网给虚拟机中的Linux,这样子外部主机无法访问到Linux,但Linux可以使用主机真实ip代理访问其他主机

  • 装Linux系统时,自定义分区为:标准分区/boot :200M左右交换分区swap :该分区没有挂载点,一般为物理内存的1.5-2倍之间根分区/ :剩余所有空间

  • 共享文件夹会默认放在 centos 下的 /mnt/hgfs

5.目录结构

  • 在linux中,一切都是文件

  • / :根目录
    /bin :存放命令
    /boot :存放启动linux时的核心文件
    /dev :管理设备
    /etc :存放配置文件
    /home :普通用户对应的文件
    /lib :存放库文件
    /lost+found :系统非法关机后存放文件
    /media :外接设备
    /mnt :为了让用户临时挂载别的文件系统
    /opt :放置需要安装的软件
    /proc :有关内核的文件
    /sbin :存放系统管理员使用的系统管理程序
    /selinux :安全目录,类似于windows下的360
    /srv :存放服务启动后需要提取的数据
    /sys :linux2.6内核以后会生成该文件夹
    /tmp :存放临时文件
    /usr :用户安装的文件和应用程序
    /var :存放日志

6.远程登录

  • 使用 Xshell 和 Xftp 远程登录 Linux 系统

  • 实现远程登录时,需要 Linux 系统开启一个 sshd 的服务,该服务会监听22号端口。该服务一般是默认打开的,检查是否打开需要在终端输入 setup -> 系统服务 -> sshd -> *号代表已经打开

  • 注意:端口开的越多,安全性就越弱

7.用户管理

  • Linux的用户至少要属于一个组

(1).添加用户

  • useradd [选项] 用户名 :会自动创建和用户同名的家目录

  • useradd -d 指定目录 用户名 :创建用户并指定家目录

  • useradd -g 用户组 用户名 :创建用户并指定用户组(该组存在才可以指定)

(2).添加密码

  • passwd 用户名 :为该用户添加密码

(3).删除用户

  • userdel 用户名 :删除用户但保留家目录

  • userdel -r 用户名 :删除用户及家目录

(4).查询用户

  • id

(5).切换用户

  • su - 用户名

  • 高权限用户切换到低权限用户时,不需要密码,但权限会降低,使用 exit 可以退出当前用户退回到原来用户

(6).相关文件

  • /etc/passwd :用户信息文件(用户名:口令:用户标识号:组标识号:注释性描述:主目录:登录Shell)

  • /etc/shadow :用户密码文件(登录名:加密口令:最后一次修改时间:最小时间间隔:最大时间间隔:警告时间:不活动时间:失效时间:标志)

  • /etc/group :用户组配置文件(组名:口令:组标识号:组内用户列表)

8.用户组

(1).增加组

  • groupadd 组名

(2).删除组

  • groudel 组名

(3).修改组

  • usermod -g 用户组 用户名

二、指令部分

1.帮助类

(1).man

  • 作用:manual(手册),包含了linux中全部命令手册

  • man 命令 :退出按q即可

(2).help

  • 语法:help 指令

2.压缩类

(1).gzip/gunzip

  • 作用:前者为压缩文件,后者为解压缩文件

  • gzip 文件名 :会直接删除源文件

(2).zip/unzip

  • 作用:前者为压缩文件,后者为解压缩文件

  • zip 选项 文件名 存放路径 :选项如下:
    -r:递归压缩

  • unzip 选项 存放目录 压缩文件名 :选项如下:
    -d:指定解压后文件的存放目录

(3).tar

  • 作用:打包指令,文件后缀为 tar.gz

  • tar 选项 打包后的文件名 打包的内容 ,选项如下:
    -c:产生.tar打包文件
    -v:显示详细信息
    -f:指定压缩后的文件名
    -z:打包同时压缩
    -x:解包.tar文件

  • zcvf为压缩,zxvf为解压

  • 注意:指定解压到某个目录,需要在目录前面使用 -C 才可以成功

3.用户类

(1).id

  • 作用:查看一个用户的基本信息(用户,用户组,附加组id)

  • id :默认显示当前执行命令的用户的基本信息

  • id 用户名 :显示指定用户的基本信息

!如何验证信息是否正确

  • 验证用户信息通过文件 /etc/passwd

  • 验证用户组信息通过文件 /etc/group

(2).whoami

  • 作用:显示当前登陆的用户名,一般用于 shell 脚本,来获取当前登陆的用户名方便记录日志

  • whoami

4.系统类

(1).logout

  • 作用:注销当前用户,减少服务器开销

  • logout

  • 注意:该命令在图形化界面无效,只在命令行模式下有效

(2).reboot

  • 作用:重新启动计算机

  • reboot

  • reboot -w :模拟重启但是不重启(只写关机与开机的日志信息)

  • shutdown -r now :立即重启

(3).shutdown

  • 作用:关机(慎用)

  • shutdown -h now :立即关机

  • shutdown -h now "提示文字" :立即关机并带有提示性文字

  • shutdown -h 1 :1分钟后关机

  • shutdown -h 12:00 :12:00关机

  • shutdown -h 12:00 "提示文字" :12:00关机并带有提示性文字

  • 注意:在centos 7之前,取消关机计划需要使用 ctrl+c 命令;在centos7 及之后可以使用 shutdown -c 命令

(4).关机

  • shutdown -h now :正常关机

  • halt :关闭内存

  • poweroff :关闭电源

  • init 0 :以后版本不一定能用

(5).root

  • sudo passwd root :设置密码

  • su :切换root用户

(6).clear

  • 作用:用来清除终端中已经存在的命令和结果,快捷键为ctrl+L

  • clear

(7).hostname

  • 作用:操作服务器的主机名(读取,设置),这里设置的主机名是临时的,所以一般不使用该命令来设置主机名,只用作读取

  • hostname :输出完整的主机名

  • hostname -f :输出当前主机名的FQDN(全限定域名)

(8).uptime

  • 作用:输出计算机的持续在线时间

  • uptime

(9).uname

  • 作用:获取操作系统的相关信息

  • uname :获取操作系统的类型

  • uname -a :获取全部的系统信息(类型、全部的主机名、内核版本、发布时间、开源计划)

(10).sync

  • 作用:把内存的数据同步到磁盘

  • sync

  • 注意:当我们关机或者重启时,都应该执行以下这个命令,防止数据丢失

(11).free

  • 作用:查看内存使用情况,主要看第二行内容,swap 用于临时内存

  • free :以默认单位进行查看

  • free -m :以 mb 为单位进行查看

5.运行级别类

  • 开机的流程:开机 - BIOS - /boot - init进程1 - 运行级别 - 运行级对应的服务

  • 系统的运行级别配置文件在 /etc/inittab 目录下

  • 运行级别有如下:
    0:关机
    1:单用户
    2:多用户状态没有网络服务
    3:多用户状态有网络服务
    4:系统未使用保留给用户
    5:图形界面
    6:系统重启

  • 常用运行级别是3和5

  • 切换到指定运行级别的指令:init [012356]

  • 查看或修改默认级别:vi /etc/init.d

!引申:面试题之怎样找回root密码

  • 在开机进入引导时,按下回车键,进入一个代码界面,按e键进入后选择第二行(编辑内核)然后再按e键

  • 输入1按回车键再输入b进入单用户模式

  • 使用 passwd 指令进行修改密码

6.文件目录类

(0).vi & vim

  • 作用:文本编辑器

  • 三种常见模式:正常模式:使用命令进入后的界面插入模式(编辑模式):可以输入内容命令行模式:可以输入相关的命令

  • vim 文件的路径 :进入编辑器

!常用命令:

  • i、I、o、O、a、A、r、R :进入编辑模式

  • Esc :退出编辑模式或命令模式

  • :或/ :进入命令行模式

  • q :没有修改时直接退出

  • wq :保存并退出

  • !q :强制退出

!快捷键

  • p :粘贴

  • u :撤销

  • yy :拷贝当前行 5yy :拷贝当前行向下的5行

  • dd :删除当前行 5dd :删除当前行向下的5行

  • G :跳转到文档的最

  • 末行 gg :跳转到文档的首行

  • /关键字 :命令行下输入按回车可以查找,输入n就是查找下一个

  • :set nu :命令行下输入可以设置文件的行号 set nonu :取消文件的行号

  • 跳转到某一行:先设置行号,然后在正常模式下输入需要跳转的行号,然后按 shift+g

  • 其余快捷键可以查看菜鸟教程中的内容

!注释

  • 单行注释

1
#这个是单行注释
  • 多行注释

1
2
3
4
:<<!
A=100
echo $A
!

(1).ls

  • 作用:列出所有文件和文件夹

  • ls

  • ls 路径

  • ls 选项 路径
    ls -l 路径:以详细列表显示所有文件
    ls -la 路径:以详细列表显示所有文件和隐藏文件
    ls -lh 路径:以合适的大小显示所有文件

(2).pwd

  • 作用:打印当前工作目录

  • pwd

(3).cd

  • 作用:改变或切换当前工作目录

  • cd 路径

  • cd ~ :切换到当前用户的家目录

  • cd .. :切换到当前用户的上一级目录

(4).mkdir

  • 作用:创建目录

  • mkdir [选项] 路径

  • mkdir -p 路径 :进行多层目录的创建

  • mkdir 路径1 路径2 路径3 :同时创建多个目录

(5).touch

  • 作用:创建文件

  • touch 路径 :同上

  • touch 路径1 路径2 路径3 :同上

(6).cp

  • 作用:复制文件或文件夹

  • cp 复制前的路径 复制后的路径 :复制文件

  • cp 复制前的路径 复制后的路径 -r :复制文件夹包含文件,-r表示递归

  • \cp -r 路径 路径 :当目标目录下有相同文件,可以强制覆盖

(7).mv

  • 作用:移动、剪切文档到新的位置

  • mv 旧路径/文件名 新路径/原文件名 :移动但不重命名

  • mv 旧路径/文件名 新路径/新文件名 :移动并重命名

  • mv 旧路径/文件夹 新路径/原文件夹 :移动但不重命名,移动文件夹无需写-r

  • mv 旧路径/文件夹 新路径/新文件夹 :移动并重命名,移动文件夹无需写-r

(8).rm

  • 作用:删除文档

  • rm 选项 需要移除的路径
    rm -f 路径 :强制删除,不提示
    rm -rf 路径 :强制递归删除非空目录,不提示
    rm -f linux* :删除以linux开头的文件,星号为通配符

  • rm 路径1 路径2 路径3

(9).cat

  • 作用:打开文件(只能浏览)或者合并文件

  • cat 文件的路径 :直接打开一个文件,为了浏览方便,一般会在后面使用管道连接 —— | more

  • cat 待合并的文件路径1 待合并的路径2 > 合并之后的文件路径 :合并文件

(10).more

  • 作用:以全屏的方式按页显示文本文件的内容

  • more 要查看的文件

  • enter:一行一行的翻空格:一页一页的翻
    Ctrl+b:上一页
    Ctrl+f:下一页
    q:退出

(11).less

  • 作用:分屏查看文件内容,以较少的内容输出

  • less 要查看的文件

  • enter:一行一行的翻空格:一页一页的翻
    Ctrl+b:上一页
    Ctrl+f:下一页
    q:退出

(12).> & >>

  • 作用:可以重定向文件或者新建文件

  • > :输出重定向,覆盖输出,会覆盖原先文件内容

  • >> :追加,追加输出,不会覆盖,会在文件末尾继续添加

  • 基本语法:ls -l > a.txt:将前面的输出内容覆盖写入到a.txt文件cat /etc/profile >> a.txt:将固定文件内容追加输出到a.txt
    echo "Hello,world!" > a.txt:将固定语句覆盖写入到a.txt

(13).echo

  • 作用:输出内容到控制台

  • echo $PATH :输出环境变量到控制台

  • echo "Hello"

(14).head

  • 作用:查看一个文件的前n行

  • head 需要查看文件的路径 :默认显示前10行

  • head -n 需要查看文件的路径 :查看一个文件的前n行

(15).tail

  • 作用:查看文件末n行或者动态变化

  • tail 需要查看文件的路径 :默认显示末10行

  • tail -n 需要查看文件的路径 :查看一个文件的末n行

  • tail -f 文件的路径 :查看文件动态变化,常用!

(16).ln

  • 作用:软链接指令,主要存放了链接其他文件的路径

  • ln -s 原文件或目录 软链接名字

  • rm -rf 软链接名字:删除软链接,后面加斜杠会删除原文件内容!

(17).history

  • 作用:查看已经执行过的历史命令,也可以执行历史命令

  • history

  • !数字 :直接执行历史编号的命令

(18).wc

  • 作用:统计文件内容信息(行数、单词数、字节数)

  • wc -lwc 需要统计的文件路径

(19).du

  • 作用:查看目录的真实大小

  • du -sh 路径 :-s表示只显示汇总的大小,-h表示以较高可读性的形式进行显示

7.时间日期类

(1).date

  • 作用:进行时间日期等相应的读取和设置

  • date :显示当前时间

  • date +%Fdate "+%Y-%m-%d":显示年月日,如:2019-01-02

  • date "+%F %T"date "+%Y-%m-%d %H:%M:%S" :显示年月日时分秒,如:2018-12-28 23:40:16(引号表示让年月日与时分秒成为不可分割的整体)

  • data -d "-1 day" "+%Y-%m-%d %H:%M:%S" :获取之前或者之后(+1)的某个时间(年月日)

  • date -s 字符串时间 :设置系统当前时间,!重点!

(2).cal

  • 作用:进行日历相应的操作

  • cal -1 :直接输出当前月份的日历

  • cal -3 :输出上一个月,当月和下一个月的日历

  • cal -y 2018 :输出一年的日历

8.搜索查找类

(1).find

  • 作用:用于查找文件,从指定目录向下递归地遍历查找(参数有55个)

  • find 路径范围 选项 选项的值 ,选项有:
    -name :按照文档名称进行搜索(支持模糊搜索)
    -user :按照文档用户名进行搜索
    -size :按照文档大小进行搜索,后面跟+20M(大于20M)
    -type :按照文档的类型进行搜索(-为文件,这里使用f来替换;d表示文件夹)

  • 注意:尽量不要在根目录下进行查找

(2).locate

  • 作用:可以快速定位文件路径,其无需遍历整个文件系统,查询速度比较快

  • 由于 locate 指令基于数据库进行查询,所以第一次运行前,必须使用 updatedb 指令创建其的数据库

  • locate 文件名

(3).grep 与 |

  • 作用:管道一般可以用于 “过滤,特殊,扩展处理”

  • 注意:不能单独使用,必须配合其他命令使用,主要起辅助作用

  • grep 选项 查找内容 源文件 :选项如下:
    -n:显示匹配行及行号
    -i:忽略字母大小写

  • ls / | grep y :过滤功能

  • ls / l wc -l :统计某个目录下的文档总个数

9.工作常用类

  • 统计/home文件夹下文件的个数:ls -l /home | grep "^-" | wc -l

  • 统计/home文件夹下目录的个数:ls -l /home | grep "^d" | wc -l

  • 统计/home文件夹下文件的个数,包括子文件里的:ls -lR /home | grep "^-" | wc -l

  • 统计文件夹下目录的个数,包括子文件夹里的:ls -lR /home | grep "^d" | wc -l

  • 以树状显示目录结构:tree (如果没有该命令可以使用yum进行安装)

三、实操部分

1.组管理和权限管理

(1).查看文件所有者/所在组

  • ls -ahl

(2).修改文件所有者

  • chown 用户名 文件名 :改变文件的所有者

  • chown newowner:newgroup 文件名 :改变文件的所有者和所有组

  • chown -R tom kkk/ :将 kkk 目录下的所有的文件(子目录及其下边的文件),递归的将所有者改成tom

(3).修改文件所在组

  • chgrp 组名 文件名

(4).修改用户所在组

  • usermod -g 组名 用户名

  • usermod -d 目录名 用户名 :改变该用户登录的初始目录

(5).权限介绍

  • 使用 ls -l 可以查看权限

  • 文件的类型:- 为普通文件、d 为目录、l 为软链接、c 为字符设备、b 为块文件

  • 文件所有者(所在组、其他组)权限:r 为读权限(4)、w 为写权限(2)、x 为执行权限(1) 、- 为没有权限

(6).修改权限

  • u:所有者;g:所有组;o:其他人;a:所有人

  • chmod u=rwx,g=rw,o=x 文件目录名chmod 751 文件目录名

  • chmod 0+w 文件目录名

  • chmod a-x 文件目录名

2.crond任务调度

(1).基础

  • 作用:crontab 进行定时任务的设置

  • crontab 选项 ,选项如下:
    -e:编辑 crontab 定时任务
    -l:查询 crontab 任务
    -r:删除当前用户所有的 crontab 任务

  • service cround restart :重启任务调度

  • 简单的任务,可以不用写脚本,直接在 crontab 中直接编写即可;复杂任务,需要使用 shell 脚本编写

(2).步骤

  1. crontab -e

  2. */1 * * * * ls -l /etc >> /tmp/to.txt

  3. 当程序退出后就生效

(3).占位符说明

  • 如下图:
    linux06.png

(4).特殊符号说明

  • 如下图:
    linux07.png

(5).特定时间执行任务案例

  • 如下图:
    linux08.png

3.磁盘管理

(1).分区

  • mbr分区:最多支持四个主分区系统只能装在主分区扩展分区要占一个主分区
    mbr最大只支持2TB,但拥有最好的兼容性

  • gpt分区:支持无限多个主分区最大支持18EB的大容量
    win7 64位以后支持gpt

  • Linux中无论有几个分区,分给哪一目录使用,它归根结底就只有一个根目录,一个独立且唯一的文件结构,Linux中每个分区都是用来组成整个文件系统的一部分

  • Linux采用了一种“载入”的处理方法,它的整个文件系统中包含了一整套的文件和目录,且将一个分区和一个目录联系起来
    mount:挂载
    umount:卸载

  • 使用 lsblk (老师不离开首字母)命令查看系统的分区和挂载的情况(加-f选项也可以)

(2).硬盘

  • Linux硬盘分为 IDE 硬盘和 SCSI 硬盘,目前基本上是 SCSI 硬盘

  • 对于 IDE 硬盘,驱动器标识符为 hdx~
    hd:指该硬盘为 IDE 硬盘
    x:为盘号(a为基本盘,b为基本从属盘,c为辅助主盘,d为辅助从属盘)
    ~:为分区,1-4表示为主分区或扩展分区,从5开始表示逻辑分区

  • 对于 SCSI 硬盘,驱动器标识符为 sdx~
    sd:指该硬盘为 SCSI 硬盘
    x:为盘号(a为基本盘,b为基本从属盘,c为辅助主盘,d为辅助从属盘)
    ~:为分区,1-4表示为主分区或扩展分区,从5开始表示逻辑分区

(3).挂载案例——增加一块硬盘

1).虚拟机添加硬盘

  • 在虚拟机菜单中,选择设置,然后添加硬盘,下一步,修改磁盘大小,重启系统

2).分区

  • 使用分区命令 fdisk /dev/sdb ,分区时有如下命令:
    m:显示命令列表
    p:显示磁盘分区,同 fdisk -l
    n:新增分区
    d:删除分区
    w:写入并退出

  • 开始分区后输入n来新增分区,然后选择p,分区类型为主分区即1。两次回车默认剩余全部空间。最后输入w写入分区并退出,若不保存退出输入q

3).格式化

  • 使用 mkfs -t ext4 /dev/sdb1 命令来执行,其中ext4为分区类型

  • 注意:这里的分区类型可能需要视不同版本或不同系统而定

4).挂载

  • 挂载可以使一个分区与一个目录联系起来

  • 命令为:mount 设备名称 挂载目录。例如:mount /dev/sdb1 /home/newdisk

  • 卸载命令为:umount 设备名称/挂载目录

  • 注意:这部分的挂载在系统重启以后会失效,所以需要使用下一步永久挂载

5).设置可以自动挂载

  • 修改 /etc/fstab 文件可实现挂载

  • 将最上边有UUID部分的复制一行以后进行修改,第一部分修改为设备名称,第二部分为挂载目录,第三部分为分区类型,第四部分为默认,第五部分按00即可

  • 添加完成后,执行 mount -a 即刻生效

(4).df

  • df :直接查看磁盘空间

  • df -h :查询系统整体磁盘使用情况

  • du -ach --max-depth=1 /目录 :查询指定目录的磁盘占用情况,默认为当前目录
    -s:指定目录占用大小汇总
    -h:带计量单位
    -a:含文件
    -c:列出明细的同时,增加汇总值
    –max-depth=1:子目录深度

4.网络配置与管理

(1).查看网络IP和网关

  • 查看虚拟网络编辑器:虚拟机编辑菜单-虚拟网络编辑器-VMnet8

  • 在这里还可以修改虚拟机的ip地址

  • 查看网关:虚拟机编辑菜单-虚拟网络编辑器-VMnet8-NAT设置

(2).自动获取IP

  • Linux系统中:系统-首选项-网络连接-点击相应网卡-编辑-自动连接

  • 然后重启一下即可

  • 缺点:每次自动获取的IP地址可能不一样,服务器上不适用

(3).修改配置文件指定IP

  • 编辑 /etc/sysconfig/network-scripts/ifcfg-eth0 文件,对于最后是网关文件可能不一定是0

  • 设置为静态获取ip,并配置IP、网关、DNS,如下图:
    linux09.png

  • 重启网络服务:service network restart

(4).netstat

  • 作用:查看网络的连接状态

  • netstat -tnlp
    -t表示只列出tcp协议的连接
    -n表示将字母组合转化成ip地址,将协议转换成端口号
    -l表示过滤出"state"列中其值为 LISTEN 的连接
    -p表示显示发起连接的pid和进程名称

(5).ifconfig

  • 作用:操作网卡的相关的指令

  • ifconfig ;获取网卡信息

5.进程管理

(1).基础

  • 在 Linux 中,每个执行的程序都称为一个进程,且分配一个 ID 号

  • 一个进程 ——> 一个父进程一个父进程 ——> 多个子进程

  • 进程分为前台进程和后台进程(又称守护进程)

(2).ps

  • 作用:查看服务器的进程信息

  • 注意:使用该命令至少会出现一个进程,因为自身命令也算一次进程

!命令1:

  • ps -aux ,选项如下:
    -a:显示当前终端的所有进程信息
    -u:以用户的格式显示进程信息
    -x:显示后台进程运行的参数

  • 为了查看方便,这里建议与 more 指令一起使用,即 ps -aux | more

  • 关于每一列的含义,如下图:
    linux10.png

!命令2:

  • ps -ef :主要用来查看父进程
    -e:列出全部的进程
    -f:显示全部的列(显示全字段)

  • 进程的主要参数如下图:
    linux04.png

  • 注意:如果一个程序的父级进程找不到,则为僵尸进程(STAT为Z),需要进行处理

!进阶(100%使用)

  • 基础方法会查看所有的进程,然后在实际中并不需要,所以可以用管道进行过滤

  • ps -ef | grep 进程名字ps -aux | grep 进程名字

(3).kill

  • 作用:用于杀死进程(当遇到僵尸进程或者需要关闭进程的时候)

  • kill 选项 进程id(pid) :通过进程号杀死进程常用选项:-9表示强迫进程立即停止

  • killall 进程名称 :通过进程名称杀死进程,也支持通配符,在系统因负载过大而变得很慢时很有用

!案例演示:

  • 踢出非法登录用户:

1
2
ps -aux | grep sshd		//查看非法登录用户的PID
kill 4010 //踢出非法用户
  • 终止远程服务 sshd,在适当的时候再次重启 sshd 服务

1
2
3
ps -aux | grep sshd
kill 2221 //杀掉第一个sshd服务,此时所有的用户都不可以从sshd上进行连接
service sshd start //重启sshd服务,此时所有用户可以进行sshd连接
  • 终止多个 gedit 编辑器

1
killall gedit
  • 强制杀掉一个终端,终端对应一个 bash

1
2
ps -aux | gerp bash
kill -9 4147 //因为系统会忽略杀掉终端命令,所以只能强制杀

(4).pstree

  • 作用:用树状来查看进程信息

  • pstree 选项,常用选项如下:
    -p:显示进程的PID
    -u:显示进程的所属用户

(5).Service

  • 服务本质就是进程,但是是运行在后台的,通常都会监听某个端口,等待其他程序的请求,因此又称为守护进程

  • 作用:控制一些软件的服务启动/停止/重启/重载/状态

  • service 服务名 start/stop/restart/reload/status

  • 注意:在 Centos7.0 以后不再使用 service 命令,而是使用 systemctl 命令

  • 注意:使用该命令执行以后会立即生效,但重启失效

!案例分析

  • 查看当前防火墙状况

1
2
service iptables status
centos7下:systemctl status firewalld

!检测端口号是否被监听

  • 在 Windows 端使用 Telnet客户端来检测

  • 需要先在 程序和功能-启用或关闭Windows功能-Telnet 打钩

  • 然后在 cmd 命令行中输入以下命令:

1
2
3
telnet ip地址 端口号
如:
telnet 192.168.2.142 22

!查看服务名

  • 使用 setup 命令->系统服务

  • ls -l /etc/init.d/ 查看

(6).chkconfig

  • 作用:可以给各个运行级别设置自启动/关闭

  • chkconfig --list :查看全部服务

  • chkconfig --list | grep xxxchkconfig 服务名 --list :查看具体某一个服务

  • chkconfig --level 运行级别 服务名 on/off :设置某个服务的运行级别自启动

(7).top(动态监控进程)

  • 作用:查看服务器的进程占的资源,且会自动更新

  • top :进入命令,动态显示
    u :回车后输入用户名查看该用户下的进程
    k :回车后输入进程ID号可以终止指定的进程
    M :将结果按照内存(MER)从高到低进行排列
    N :将结果按照PID排序
    P :将结果按照CPU从高到低进行排列
    1 :当服务器拥有多个cpu的时候,使用1来切换是否展示显示cpu的详细信息q:退出命令

  • 详细信息如下图:
    linux11.png

  • 进程所占资源如下图:
    linux05.png

  • top 选项 ,具体选项如下:
    -d 10:指定10秒刷新一次
    -i:不显示任何闲置或者僵死进程
    -p:通过指定监控进程ID来仅仅监控某个进程的状态

  • 计算一个进程实际使用的内存 = 常驻内存 - 共享内存

(8).netstat(监控网络状态)

  • 作用:查看系统网络情况

  • netstat -anp ,选项如下:
    -an:按一定顺序排列输出
    -p:显示哪个进程在调用

6.RPM包管理

  • rpm 选项 选项如下:
    -qa:查询所安装的所有软件包
    -q 软件包名:查询软件包是否安装
    -qa | grep 软件包名:查询软件包是否安装
    -qi 软件包名:查询软件包信息
    -ql 软件包名:查询软件包中的文件
    -qf 文件全路径名:查询文件所属的软件包

  • rpm -e 软件包名 :删除该软件包

  • rpm -e -nodeps 软件包名 :强制删除某软件包

  • rpm -ivh RPM包全路径名称 :安装某软件包
    -i:安装
    -v:提示
    -h:进度条

  • 安装时候需要先挂载安装系统的ISO文件,然后去 /media/Packages 下找到包,将其复制到 /opt/ 中,再进行安装

7.yum包管理

  • yum 是一个 Shell 前端软件包管理器,基于 RPM包管理,可以从指定的服务器自动下载 RPM包并进行安装,还可以自动处理依赖关系

  • yum list | grep xx :查询软件列表中是否有这个软件

  • yum install xxx :下载并安装

四、JavaEE定制部分

1.准备文件

  • 在 Linux 上开发 Java 程序需要安装以下4个软件:jdk、tomcat、eclipse、MySQL

  • 下载好以后使用 Xftp 上传到服务器的 /opt/ 目录下

2.安装 jdk

  • 将 jdk 安装包解压到 /opt/ 目录下

  • 配置环境变量 vim /etc/profile ,在最后一行添加如下内容

1
2
3
JAVA_HOME=/opt/jdk1.7.0_79		//解压后的文件夹名
PATH=/opt/jdk1.7.0_79/bin:$PATH //后面一定要加上原始PATH
export JAVA_HOME PATH //输出变量,使环境变量生效
  • 使用 source /etc/profile 命令来使环境变量生效,也可以直接注销重新登录

3.安装 Tomcat

  • 将 Tomcat 安装包解压到 /opt/ 目录下

  • 切入到解压后文件夹的 /bin 目录

  • 执行 ./startup.sh 命令来运行 Tomcat

  • 在服务器的浏览器中输入 http://localhost:8080 来检测是否成功启用 Tomcat

  • 但是本地电脑却无法访问是因为防火墙没有让8080端口通过,所以可以修改 /etc/sysconfig/iptables 文件来让8080端口通过,将其中含有22端口的一行复制并粘贴修改为8080,然后使用 service iptables restart 来重启防火墙就可以了

4.安装 Eclipse

  • 将 Eclipse 安装包解压到 /opt/ 目录下

  • 进入解压后的文件夹,使用 ./eclipse 命令启动 eclipse,注意配置jre与Tomcat

5.安装 MySQL

(1).卸载旧版本

  • 使用 rpm -qa | grep mysql 命令检查是否安装有 MySQL Server

  • 如果有的话通过 rpm -e mysql-libsrpm -e --nodeps mysql-libs 命令来卸载掉

(2).安装编译代码需要的包

  • 使用 yum -y install make gcc-c++ cmake bison-devel ncurses-devel 命令来安装编译代码需要的包

  • 将 MySQL 安装包解压到 /opt/ 目录下

  • 进入解压后的文件夹后输入以下命令

1
cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DMYSQL_DATADIR=/usr/local/mysql/data -DSYSCONFDIR=/etc -DWITH_MYISAM_STORAGE_ENGINE=1 -DWITH_INNOBASE_STORAGE_ENGINE=1 -DWITH_MEMORY_STORAGE_ENGINE=1 -DWITH_READLINE=1 -DMYSQL_UNIX_ADDR=/var/lib/mysql/mysql.sock -DMYSQL_TCP_PORT=3306 -DENABLED_LOCAL_INFILE=1 -DWITH_PARTITION_STORAGE_ENGINE=1 -DEXTRA_CHARSETS=all -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci
  • 使用 make && make install 命令编译并安装

6.配置 MySQL

  • 使用下面的命令查看是否有 mysql 用户及用户组

1
2
cat /etc/passwd 查看用户列表
cat /etc/group 查看用户组列表
  • 如果没有的话就创建

1
2
groupadd mysql
useradd -g mysql mysql
  • 修改 /usr/local/mysql 权限

1
chown -R mysql:mysql /usr/local/mysql
  • 初始化配置,进入安装路径(再执行下面的指令),执行初始化配置脚本,创建系统自带的数据库和表

1
2
cd /usr/local/mysql
scripts/mysql_install_db --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data --user=mysql
  • 注:在启动 MySQL 服务时,会按照一定次序搜索 my.cnf,先在 /etc 目录下找,找不到则会搜索 $basedir/my.cnf ,在本例中就是 /usr/local/mysql/my.cnf,这是新版 MySQL 的配置文件的默认位置!

注意:

  • 在 CentOS 6.8 版操作系统的最小安装完成后,在 /etc 目录下会存在一个 my.cnf,需要将此文件更名为其他的名字,如:/etc/my.cnf.bak,否则,该文件会干扰源码安装的 MySQL 的正确配置,造成无法启动

  • 因此,需要修改名称,防止干扰:

1
mv /etc/my.cnf /etc/my.cnf.bak

7.启动 MySQL

  • 添加服务,拷贝服务脚本到 init.d 目录,并设置开机启动,在 /usr/local/mysql 下执行以下命令:

1
2
3
cp support-files/mysql.server /etc/init.d/mysql
chkconfig mysql on
service mysql start
  • 执行下面的命令修改 root 密码,也可以将该路径增添到 PATH 路径中(即在冒号后面再添加路径和冒号

1
2
3
cd /usr/local/mysql/bin
./mysql -u root -p //第一次进入没有密码,直接回车
SET PASSWORD = PASSWORD('root'); //单引号中是需要修改为的密码
  • 重新进入以后就可以执行数据库相关操作

1
2
3
4
5
6
7
8
show databases;
create database testDB;
use testDB;
create table user(id int,name varchar(32));
insert into user values(1,'cat');
insert into user values(2,'dog');
select * from user;
quit
  • 备份 MySQL 的指令为:

1
mysqldump -u用户名 -p密码 --host=主机名 数据库名 > /backup/db/xxx.sql

五、大数据定制部分

1.Shell 简介

  • Shell 是一个命令行解释器,为用户提供了一个向 Linux 内核发送请求以便运行程序的界面系统级程序,用户可以用 Shell 来启动、挂起、停止甚至是编写一些程序

  • 脚本格式要求:
    1.脚本中以 #!/bin/bash 开头
    2.脚本是个以 .sh 为后缀名的文件
    3.脚本需要有可执行权限(一般来说)

  • 内容编写格式:

1
2
3
4
5
6
7
8
9
10
#! /bin/sh
#指定脚本的解析器,必须在第一行指定
#注释用井号来表示
echo #后面什么都不加时打印空行
echo "后面加字符串会打印字符串"
echo "" #打印空行
/bin/pwd
echo
echo "abc."
/bin/ls

2.Shell 执行方式

(1).赋予权限执行

  • 给已经写好的脚本赋予所有者的执行权限

1
2
3
chmod 744 myShell.sh

chmod u+x myShell.sh
  • 相对路径执行

1
./myShell.sh
  • 绝对路径执行

1
/root/shell/myShell.sh

(2).不赋予权限执行

  • 相对路径执行

1
sh ./myShell.sh
  • 绝对路径执行

1
sh /root/shell/myShell.sh

3.变量

  • 变量变量分为:系统变量(环境变量)用户自定义变量(本地变量)

(1).系统变量

  • 有:$PATH$PWD$SHELL$USER

  • 所有系统变量都是键值对的格式,系统变量查看命令:

1
2
3
echo $PATH
或者:
env | grep $PATH
  • 显示当前 Shell 中所有的变量:set

(2).用户自定义变量

  • 定义变量:变量=值

  • 撤销变量:unset 变量

  • 声明静态变量:readonly 变量 ,但是静态变量不能使用撤销操作

1
2
3
4
5
6
7
8
A=100			//声明普通变量
echo "A=$A" //打印变量A,后面必须使用 `$` 符号
unset A //撤销变量A
echo "A=$A"
readonly B=99 //声明静态变量
echo "B=$B" //打印变量B,后面必须使用 `$` 符号
unset B //撤销变量B,出错
echo "B=$B"
  • 定义变量的规则:
    可以由字母、数字和下划线组成,但是不能以数字开头等号两侧不能有空格变量名称一般习惯大写

(3).将命令的返回值赋值给变量

  • 使用反引号,将命令写入反引号中来然后赋值给变量

1
2
A=`ls -l`
echo $A
  • 使用括号,将命令写入括号中来然后赋值给变量

1
2
B=$(date)
echo "$B"

(4).设置环境变量

  • 在配置文件 /etc/profile 中使用如下语法来将 Shell 变量输出为环境变量

1
2
TOMCAT_HOME=/opt/tomcat
export TOMCAT_HOME
  • 使用如下命令让修改后的配置信息立即生效

1
source /etc/profile
  • 在 Shell 脚本中查询环境变量的值

1
echo $TOMCAT_HOME

4.位置变量参数

当执行 Shell 脚本时,如果希望获取到命令行的参数信息,就可以使用到位置参数变量

(1).语法

  • $n :n为数字,$0 代表命令本身,$1-$9 代表1-9个参数,10以上的参数需要 ${10} 这样使用

  • $* :这个变量代表命令行中的所有的参数,而 $* 把所有的参数看成一个整体

  • $@ :这个变量也代表命令行中的所有的参数,不过 $@ 把每个参数区分对待

  • $# :这个变量代表命令行中所有参数的个数

(2).案例

1
2
3
4
5
#!/bin/bash
echo "$0 $1 $2"
echo "$*"
echo "$@"
echo "$#"
  • 执行 ./positionPara.sh 30 60 命令,得到结果如下:

1
2
3
4
./positionPara.sh 30 60
30 60
30 60
2

5.预定义变量

即事先定义好的变量,可直接在 Shell 中使用

(1).语法

  • $$ :当前进程的进程号

  • $! :后台运行的最后一个进程的进程号

  • $? :最后一次执行的命令的返回状态如果这个变量的值为0,则上一个命令正确执行如果这个变量的值为非0(具体有命令自己决定),则上一个命令未正确执行

(2).案例

  • 在脚本中简单实用一下预定义变量

1
2
3
4
5
6
#!/bin/bash
echo "当前的进程号=$$"
#以后台的方式运行 myShell.sh
./myShell.sh &
echo "最后的进程号=$!"
echo "执行得值=$?"
  • 执行后的结果如下:

1
2
3
4
当前的进程号=28088
最后的进程号=28089
执行得值=0
[root@hadoop1 shell]# /opt/tomcat
  • 因为这里后台运行了一个脚本,所以需要使用 ctrl+c 来暂停

6.运算符

(1).基本语法

  • $((运算式))$[运算式]

  • expr 语法,注意这里的运算符之间要有空格求和:expr m + n求差:expr m - n求乘:expr \*求除:expr /求余:expr %

(2).案例

  • 求(2+3)*4的值

1
2
3
4
5
6
7
8
9
10
#括号法
RESULT1=$(((2+3)*4))
echo "result1=$RESULT1"
#中括号法
RESULT2=$[(2+3)*4]
echo "result2=$RESULT2"
#分步法,需要将第一步的值使用反引号引起以后传给TEMP
TEMP=`expr 2 + 3`
RESULT3=`expr $TEMP \* 4`
echo "result3=$RESULT3"
  • 求命令行里的两个参数的和

1
2
3
#命令行中传入10和8求和
RESULT4=$[$1+$2]
echo "result4=$RESULT4"

7.流程控制语句

(1).条件判断语法

  • [ 判断内容 ] ,在判断内容前后各有一个空格

  • 该条件判断为非空时返回 true,为空时返回 false

  • 也可以使用 $? 来验证,0为 true,1为 false

(2).常用判断条件

  • 两个字符串的比较
    [ "ok" = "ok" ]

  • 两个整数的比较:
    [ 0 -lt 0 ] :小于
    [ 0 -le 0 ] :小于等于
    [ 0 -eq 0 ] :等于
    [ 0 -gt 0 ] :大于
    [ 0 -ge 0 ] :大于等于
    [ 0 -ne 0 ] :不等于

  • 按照文件权限进行判断:
    [ -r 文件名 ] :有读的权限
    [ -w 文件名 ] :有写的权限
    [ -x 文件名 ] :有执行的权限

  • 按照文件类型进行判断:
    [ -f 文件名 ] :文件存在并且是一个常规的文件
    [ -e 文件名 ] :文件存在
    [ -d 文件名 ] :文件存在并是一个目录

(3).if 判断语句

  • 推荐语法如下:

1
2
3
4
5
6
7
if [ 条件判断式 ]
then
程序语句
elif [ 条件判断式 ]
then
程序语句
fi
  • 不推荐语法如下:

1
2
3
if [ 条件判断式 ];then
程序语句
fi
  • 编写一个Shell程序,如果输入的参数大于等于60输出“ggg及格了”;小于60输出“不及格”

1
2
3
4
5
6
7
if [ $1 -ge 60 ]
then
echo "及格了"
elif [ $1 -lt 60 ]
then
echo "不及格"
fi

(4).case 判断语句

  • 语法如下:

1
2
3
4
5
6
7
8
9
10
11
case $变量名 in
"值1")
满足则执行该程序语句
;;
"值2")
满足则执行该程序语句
;;
*)
以上都不满足则执行该程序语句
;;
esac
  • 当命令行参数是1时,输出周一;是2时,输出周二;其余输出other

1
2
3
4
5
6
7
8
9
10
11
case $1 in
"1")
echo "周一"
;;
"2")
echo "周二"
;;
*)
echo "other"
;;
esac

(5).for 循环语句

  • 语法1如下:

1
2
3
4
for 变量 in "值1 值2 值3···"
do
程序
done
  • 语法2如下:

1
2
3
4
for ((初始值;循环控制条件;变量变化))
do
程序
done

a).案例

  • 打印命令行输入的参数

1
2
3
4
5
6
7
8
9
10
#将参数作为一个整体输出
for i in "$*"
do
echo "the number is $i"
done
#将参数分别输出
for j in "$@"
do
echo "the number is $j"
done
  • 从1加到100的值输出显示

1
2
3
4
5
6
SUM=0
for ((i=1;i<=100;i++))
do
SUM=$[SUM+i]
done
echo "sum=$SUM"

(6).while 循环语句

  • 语法如下:

1
2
3
4
while [ 条件判断式 ]
do
程序
done
  • 从命令行中输入一个数n,统计从1+··+n的值是多少

1
2
3
4
5
6
7
8
SUM=0
i=0
while [ $i -le $1 ]
do
SUM=$[$SUM+$i]
i=$[$i+1]
done
echo "sum=$SUM"

8.读取控制台输入

  • 使用 read 命令可以读取控制台的输入

  • read 选项 参数 ,选项如下:
    -p:指定读取值时的提示符
    -t:指定读取值时的等待的时间(秒),如果没有在指定的时间内输入,就不等待了参数:指定读取值的变量名

  • 读取控制台输入两个num值,另一个在10秒内输入

1
2
3
4
read -p "请输入数字1:" NUM1
echo "你输入的数字1是:$NUM1"
read -t 10 -p "请输入数字2:" NUM2
echo "你输入的数字2是:$NUM2"

9.函数

  • shell编程和其他编程语言一样,有系统函数,也可以自定义函数

(1).系统函数

a).basename

  • 作用:返回完整路径最后/的部分,常用于获取文件名

  • 语法:
    basename [pathname] [suffix]
    basename [string] [suffix]

  • 如果上面指定了 suffix ,那么就不会显示文件后缀名;不指定则会显示

1
2
3
4
[root@hadoop1 ~]# basename /home/test.txt
test.txt
[root@hadoop1 ~]# basename /home/test.txt .txt
test

b).dirname

  • 作用:返回完整路径最后/的前面的部分,常用于返回路径部分

  • 语法:
    dirname 文件的绝对路径

  • 从给定的包含绝对路径的文件名中去除文件名,然后返回剩下的路径

1
2
[root@hadoop1 ~]# dirname /home/aaa/test.txt
/home/aaa

(2).自定义函数

  • 基本语法(中括号中代表可选的):

1
2
3
4
5
[function] 函数名[()]
{
程序语句;
[return int;]
}
  • 调用时直接写 函数名 值

  • 案例:

1
2
3
4
5
6
7
8
9
10
11
#计算输入两个参数的和
function getSum()
{
SUM=$[$n1+$n2];
echo "这两个数的和是:$SUM";
}
#从控制台输入两个数字
read -p "请输入第一个数字:" n1
read -p "请输入第二个数字:" n2
#调用函数
getSum $n1 $n2

10.综合案例之定期备份数据库

(1).需求分析

  • 每天凌晨2:10分备份数据库 testDB 到 /data/backup/db

  • 备份开始和备份结束时能够给出相应的提示信息

  • 备份后的文件要求以备份时间为文件名,并打包成 .tar.gz 的形式,比如:2020_08_22_190501.tar.gz

  • 在备份的同时,检查是否有10天前备份的数据库文件,如果有就将其删除

(2).思路分析

  • 第一点可以使用 crond 来实现

  • 第二点在 shell 脚本中输出提示信息即可

  • 第三点可以先使用一个临时文件夹来存放 .gz 文件,然后最后进行打包成 .tar.gz 文件并删除临时文件

  • 第四点需要使用固定指令来删除10天前数据库文件

  • 将 shell 脚本放在 /usr/sbin 目录下,将备份文件放置在 /data/backup/db

(3).代码实现

  • shell 脚本代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#!/bin/bash
#完成数据库的备份
#定义备份的路径
BACKUP=/data/backup/db
#使用当前时间作为文件名
DATETIME=$(date +%Y_%m_%d_%H%M%S)
#测试文件名是否准确
#echo "$DATETIME"
#也可以用中括号包起来
#echo ${DATETIME}
echo "============开始备份============"
echo "== 备份路径为 $BACKUP =="
#定义数据库的主机
HOST=localhost
#定义数据库的用户名与密码
DB_USER=root
DB_PWD=root
#定义备份数据库名
DATABASE=testDB
#创建备份的路径,如果路径存在则直接使用,不过不存在就创建
if [ ! -d "$BACKUP/$DATETIME" ]
then
mkdir -p "$BACKUP/$DATETIME"
fi
#执行mysql备份数据库的指令
mysqldump -u${DB_USER} -p${DB_PWD} --host=$HOST $DATABASE | gzip > $BACKUP/$DATETIME/$DATETIME.sql.gz
#打包备份文件
cd $BACKUP
tar -zcvf $DATETIME.tar.gz $DATETIME
#删除临时目录
rm -rf $BACKUP/$DATETIME
#删除10天前的备份文件
find $BACKUP -mtime +10 -name "*.tar.gz" -exec rm -rf {} \;
echo "============备份成功============"
  • cront 代码如下:

1
10 2 * * * /usr/sbin/mysql_db_backup.sh

问题解决

1.“/etc/profile” is read-only

使用sudo、使用su、修改文件权限

2.-bash: vim: command not found

使用sudo yum -y install vim*安装

3./bin/bash: q: command not found

退出时使用了错误的!q而不是q!

4.-bash: wget: command not found

使用yum -y install wget安装

5.gzip: stdin: not in gzip format

这个压缩包没有用gzip格式压缩,所以不用加z指令就可以了,即 tar -xvf 压缩包

6.安装python3提示configure: error: no acceptable C compiler found in $PATH

没有安装gcc编译器,使用yum install gcc -y安装即可