第16章 Linux 之 JavaEE 定制篇-搭建 JavaEE 环境
如果需要在 Linux 下进行JavaEE 的开发,我们需要安装如下软件
- JDK
- Tomcat
- ideaIU
- MySQL
- 安装 JDK
- mkdir /opt/jdk
- 通过 Xftp 6上传 JDK 安装包(jdk-8u261-linux-x64.tar.gz)到 /opt/jdk
- cd /opt/jdk
- 使用 tar -zxvf jdk-8u261-linux-x64.tar.gz 命令解压 JDK 安装包
- mkdir /usr/local/java
- mv jdk1.8.0_261/ /usr/local/java
- 使用 echo $PATH 命令查看当前的环境变量,没有JDK
- 通过编辑 /etc/profile 文件配置 JDK 环境变量
- 增加命令 export JAVA_HOME=/usr/local/java/jdk1.8.0_261
- 增加命令 export PATH=$JAVA_HOME/bin:$PATH
- 其中,第二条命令的 $PATH 是之前的环境变量,一定要写上。否则,一些常用指令将无法使用。
- 通过 source /etc/profile 命令让新的环境变量生效
- 再次使用 echo $PATH 命令查看当前的环境变量,JDK 环境变量添加成功
- 通过运行 Java 程序测试是否安装成功
- 安装 Tomcat
- mkdir /opt/tomcat
- 通过 Xftp 6上传 Tomcat 安装包(apache-tomcat-8.5.59.tar.gz)到 /opt/tomcat
- cd /opt/tomcat
- 使用 tar -zxvf apache-tomcat-8.5.59.tar.gz 命令解压 Tomcat 安装包
- cd apache-tomcat-8.5.59/
- cd /bin
- ./startup.sh
- 使用 firewall-cmd --permanent --add-port=8080/tcp 命令打开8080端口
- 使用 firewall-cmd --reload 命令更新端口状态
- 使用 firewall-cmd --query-port=8080/tcp 命令查看端口是否打开
- 通过浏览器访问 IP地址:8080 来查看是否安装成功
- 安装 ideaIU 2020
- mkdir /opt/idea
- 通过 Xftp 6上传 ideaIU 安装包(ideaIU-2020.2.3.tar.gz)到 /opt/idea
- cd /opt/idea
- 使用 tar -zxvf ideaIU-2020.2.3.tar.gz 命令解压 ideaIU 安装包
- cd idea-IU-202.7660.26/
- cd /bin
- 在有图形化界面的终端上运行 ./idea.sh
- 图形化界面下,按个人需要安装即可
- 点击新建项目,ideaIU 会自动配置系统中已有的 JDK
- 通过编写 Java 程序来查看是否安装成功
- 安装 MySQL 5.7
- mkdir /opt/mysql
- 通过 Xftp 6上传 MySQL 安装包(mysql-5.7.26-1.el7.x86_64.rpm-bundle.tar)到 /opt/mysql
- cd /opt/mysql
- 使用 tar -xvf mysql-5.7.26-1.el7.x86_64.rpm-bundle.tar 命令解压 MySQL 安装包
- CentOS 7.6自带的 MySQL 类数据库是 mariadb,会和 MySQL 冲突,要先删除
- 使用 rpm -qa | grep mari 命令查看 mariadb 相关安装包
- 分别运行 rpm -e --nodeps mariadb-libs 以及 rpm -e --nodeps marisa 命令删除
- 再次使用 rpm -qa | grep mari 命令查询 mariadb 相关安装包,已删除干净
- 开始真正安装 MySQL,依次按顺序运行以下命令
- rpm -ivh mysql-community-common-5.7.26-1.el7.x86_64.rpm
- rpm -ivh mysql-community-libs-5.7.26-1.el7.x86_64.rpm
- rpm -ivh mysql-community-client-5.7.26-1.el7.x86_64.rpm
- rpm -ivh mysql-community-server-5.7.26-1.el7.x86_64.rpm
- 运行 systemctl start mysqld.service 命令,启动 MySQL
- 设置 root 用户密码
- MySQL 自动给 root 用户设置随机密码,通过 grep password /var/log/mysqld.log 来查看当前密码
- 运行 mysql -u root -p 命令登录 root 用户,输入上面 root 用户当前密码,登录进入 MySQL 命令行
- 对于个人开发环境,如果设置较简单的 root 用户密码,在 MySQL 命令行运行 set global validate_password_policy=0; 将密码策略修改为0,即弱口令(默认情况为1)。对于生产环境,要设置复杂的 root 用户密码。
- 修改 root 用户密码命令格式:set password for 用户名@localhost = password('新密码'); 比如在 MySQL 命令行里运行 set password for root@localhost = password('12345678');
- 继续在 MySQL 命令行里输入 flush privileges; 使密码设置生效
- 在 MySQL 命令行里输入 quit 退出
- 用修改后的 root 用户密码登入 MySQL 查看是否修改成功
第17章 Linux 之大数据定制篇-Shell 编程
- 为什么要学习 Shell 编程
- Linux 运维工程师在进行服务器集群管理时,需要编写 Shell 程序来进行服务器管理。
- 对于 JavaEE 和 Python 程序员来说,工作的需要,会要求你编写一些 Shell 脚本进行程序或者是服务器的维护,比如编写一个定时备份数据库的脚本。
- 对于大数据程序员来说,需要编写 Shell 程序来管理集群。
- Shell 是什么
Shell 是一个命令行解释器,它为用户提供了一个向 Linux 内核发送请求以便运行程序的界面系统级程序,用户可以用 Shell 来启动、挂起、停止甚至是编写一些程序。
- Shell 脚本的执行方式
- 脚本格式要求
- 脚本以#!/bin/bash 开头
- 脚本需要有可执行权限
- 脚本的常用执行方式
- 给要执行的脚本文件,添加可执行权限
- 直接用 sh 脚本文件名 命令执行,不用赋予脚本可执行权限
- Shell 变量介绍
- Linux 中 Shell 的变量分为系统变量和用户自定义变量。
- 系统变量:$HOME、$PWD、$SHELL、$USER 等等,比如:echo $HOME 等等。
- 显示当前 Shell 中所有变量:set
- Shell 变量定义
- 定义变量:变量=值 (注意等号两侧没有空格)
- 撤销变量:unset 变量
- 声明静态变量:readonly 变量。注意:该变量不能 unset
- 定义变量的规则
- 变量名称可以由字母、数字和下划线组成,但是不能以数字开头。
- 等号两侧不能有空格
- 变量名称一般习惯为大写,这是一个规范,遵守即可
- 将命令的返回值赋给变量
- A=`date`,通过反引号,运行里面的命令,并把结果返回给变量 A
- A=$(date)等于反引号的作用
- 变量名称一般习惯为大写,这是一个规范,遵守即可
- Shell 变量快速入门
#!/bin/bash #案例1:定义变量 A A=100 #输出变量需要加上$ echo A=$A echo "A=$A" #案例2:撤销变量 A unset A echo "A=$A" #案例3:声明静态的变量 B=2,不能 unset readonly B=2 echo "B=$B" #执行 unset B 命令,会报错 #案例 4:将指令返回的结果赋给变量 C=`date` D=$(date) echo "C=$C" echo "D=$D"
- 设置环境变量
- 基本语法
- export 变量名=变量值:将 Shell 变量输出为环境变量
- source 配置文件:让修改后的配置文件立即生效
- echo $变量名:查询环境变量的值
- 快速入门
#通过编辑 /etc/profile 文件配置 JDK 环境变量,要增加以下命令 export JAVA_HOME=/usr/local/java/jdk1.8.0_261 export PATH=$JAVA_HOME/bin:$PATH #保存退出 /etc/profile 文件后,执行 source /etc/profile 命令使修改后的配置文件生效
- Shell 脚本多行注释
:<<! 需要注释的第一行内容 需要注释的第二行内容 !
- 位置参数变量
当我们执行一个 Shell 脚本时,如果希望获取到命令行的参数信息,就可以使用到位置参数变量,比如 ./myshell.sh 100 200 , 这个就是一个执行 shell 的命令行,可以在 myshell 脚本中获取到参数信息。
- 基本语法
- $n:n 为数字,$0 代表命令本身,$1-$9 代表第一到第九个参数,十以上的参数需要用大括号,如$
- $*:代表命令行中所有的参数,$*把所有的参数看成一个整体
- $@:代表命令行中所有的参数,不过该命令是把每个参数区分对待
- $#:代表命令行中所有参数的个数
- 快速入门
#!/bin/bash echo "0=$0 1=$1 2=$2" echo "命令行所有传入的参数=$*" echo "$@" echo "参数的个数=$#"
- 预定义变量
Shell 设计者事先已经定义好的变量,可以直接在 Shell 脚本中使用
- 基本语法
- $$:当前进程的进程号
- $!:后台运行的最后一个进程的进程号
- $?:最后一次执行的命令的返回状态。如果这个变量的值为 0,证明上一个命令正确执行;如果这个变量的值为非 0(具体是哪个数,由命令自己来决定),则证明上一个命令执行不正确
- 快速入门
#!/bin/bash echo "当前进程号=$$" #后台方式运行 myShell.sh ./myShell.sh & echo "最后的的进程号=$!" echo "执行的值=$?"
- 运算符
在 Shell 中进行各种运算操作。
- 基本语法
- $((运算式))\或$[运算式]
- 或 `expr m + n` 注意 expr 运算符间要有空格
- expr \*,/, % 分别代表乘,除,取余
- 快速入门
#!/bin/bash #案例1:计算(2+3)X4 的值 #使用第一种方式 RES1=$(((2+3)*4)) echo "res1=$RES1" #使用第二种方式 RES2=$[(2+3)*4] echo "res2=$RES2" #使用第三种方式 TEMP=`expr 2 + 3` RES3=`expr $TEMP \* 4` echo "temp=$TEMP" echo "res3=$RES3" echo "执行的值=$?" #案例2:请求出命令行的两个参数[整数]的和 SUM=$[$1+$2] echo "sum=$SUM"
- 条件判断
- 判断语句
[ condition ](注意 condition 前后要有空格),非空返回 true,可使用$?验证(0 为 true,>1 为 false)- 常用判断条件
- 字符串比较
选项 含义 = 字符串是否相等
- 两个整数的比较
选项 含义 -lt 小于 -le 小于等于 -eq 等于 -gt 大于 -ge 大于等于 -ne 不等于
- 按照文件权限进行判断
选项 含义 -r 有读的权限 -w 有写的权限 -x 有执行的权限
- 按照文件类型进行判断
选项 含义 -f 文件存在并且是一个常规的文件 -e 文件存在 -d 文件存在并是一个目录
- 快速入门
#!/bin/bash #案例1:“ok”是否等于“ok” #判断语句:是否 = if [ "ok" = "ok" ] then echo "equal" fi #案例2:23是否大于等于22 #判断语句:使用 -ge if [ 23 -ge 22 ] then echo "大于" fi #案例3:/root/shcode/aaa.txt 目录中的文件是否存在 #判断语句:使用 -f if [ -f /root/shcode/aaa.txt ] then echo "存在" fi #其他案例 if [ edu ] then echo "hello, edu" fi
- if 判断
- 基本语法
if [ 条件判断式 ] then 程序 fi
或者
if [ 条件判断式 ] then 程序 elif [ 条件判断式 ] then 程序 fi
- 注意事项
[ 条件判断式 ]中括号和条件判断式之间必须有空格,if 与 [ 之间也有空格- 快速入门
#!/bin/bash #案例:编写一个 Shell 程序,如果输入的参数,大于等于60,则输出“及格了”,如果小于60,则输出 “不及格” if [ $1 -ge 60 ] then echo "及格了" elif [ $1 -lt 60 ] then echo "不及格" fi
- case 语句
- 基本语法
case $变量名 in "值 1") 如果变量的值等于值 1,则执行程序 1 ;; "值 2") 如果变量的值等于值 2,则执行程序 2 ;; 省略其他分支 *) 如果变量的值都不是以上的值,则执行此程序 ;; esac
- 快速入门
#!/bin/bash #案例:当命令行参数是1时,输出“周一”,是2时,就输出“周二”,其它情况输出“other” case $1 in "1") echo "周一" ;; "2") echo "周二" ;; *) echo "other" ;; esac
- for 语句
- 基本语法1
for 变量 in 值1 值2 值3 ... do 程序 done
- 快速入门
#!/bin/bash #案例:打印命令行输入的参数【可以看出$*和$@的区别】 #注意 $* 是把输入的参数,当作一个整体,所以只会输出一行 for i in "$*" do echo "num is $i" done #使用 $@ 是把输入的参数,分别对待,所以有几个参数,就会输出几行 for j in "$@" do echo "num is $j" done
- 基本语法2
for (( 初始值;循环控制条件;变量变化 )) do 程序 done
- 快速入门
#!/bin/bash #案例:从1加到100的值输出显示 #定义一个变量 SUM SUM=0 for (( i=1;i<=100;i++ )) do SUM=$[$SUM+i] done echo "总和SUM=$SUM"
- while 语句
- 基本语法
while [ 条件判断式 ] do 程序 done
- 注意事项
[ 条件判断式 ]中括号和条件判断式之间必须有空格,while 与 [ 之间也有空格- 快速入门
#!/bin/bash #案例:从命令行输入一个数 n,统计从 1+...+ n 的值 SUM=0 i=0 while [ $i -le $1 ] do SUM=$[$i+$SUM] i=$[$i+1] done echo "总和SUM=$SUM"
- read 读取控制台输入
- 基本语法
read [选项] [参数]- 选项
-p:指定读取值时的提示符;
-t:指定读取值时等待的时间(秒),如果没有在指定的时间内输入,就不再等待了。- 参数
变量:指定读取值的变量名- 快速入门
#!/bin/bash #案例1:读取控制台输入一个 NUM1 值 read -p "请输入一个数NUM1=" NUM1 echo "您输入数NUM1=$NUM1" #案例2:读取控制台输入一个 NUM2 值,在 10 秒内输入 read -t 10 -p "请输入一个数NUM2=" NUM2 echo "您输入数NUM2=$NUM2"
- 系统函数
- basename 基本语法
- basename [pathname] [suffix]:返回完整路径最后 / 的部分,常用于获取文件名。
- basename [string] [suffix]:会删掉所有的前缀包括最后一个(‘/’)字符,然后将字符串显示出来。
- 选项:
suffix 为后缀,如果 suffix 被指定了,basename 会将 pathname 或 string 中的 suffix 去掉。- dirname 基本语法
- 功能:返回完整路径最后 / 的前面的部分,常用于返回路径部分。
- dirname 文件绝对路径:从给定的包含绝对路径的文件名中去除文件名(非目录的部分),然后返回剩下的路径(目录的部分)。
- 快速入门
- 案例1:请返回 /home/aaa/test.txt 的 test.txt 部分
basename /home/aaa/test.txt- 案例2:请返回 /home/aaa/test.txt 的 /home/aaa 部分
dirname /home/aaa/test.txt
- 自定义函数
- 基本语法
[ function ] funname[()] { Action; [return int;] }
调用直接写函数名:funname [值]
- 快速入门
#!/bin/bash #案例1:计算输入两个参数的和(动态获取),getSum #定义函数 getSum function getSum() { SUM=$[$NUM1+$NUM2] echo "和是=$SUM" } #输入两个值 read -p "请输入一个数NUM1=" NUM1 read -p "请输入一个数NUM2=" NUM2 #调用自定义函数 getSum $NUM1 $NUM2
- Shell 编程综合案例
- 需求分析
- 每天凌晨2:10,备份数据库 hspedu 到 /data/backup/db
- 备份开始和备份结束能够给出相应的提示信息
- 备份后的文件要求以备份时间为文件名,并打包成 .tar.gz 的形式,比如:2018-03-12_230201.tar.gz
- 在备份的同时,检查是否有 10 天前备份的数据库文件,如果有就将其删除。
- 编写一个 Shell 脚本。
- 思路分析
- 代码实现
#!/bin/bash #完成数据库的定时备份 #备份的路径 BACKUP=/data/backup/db #当前的时间作为文件名 DATETIME=$(date +%Y-%m-%d_%H%M%S) #可以输出变量调试 #echo ${DATETIME} echo "======================开始备份==========================" echo "========备份的路径为 $BACKUP/$DATETIME.tar.gz ==========" #数据库地址 HOST=localhost #数据库用户名 DB_USER=root #数据库密码 DB_PW=root #备份数据库名 DATABASE=hspedu #创建备份的文件夹 #如果该备份的文件夹有则使用,没有就重新创建一个。 #-p:表示递归创建目录,或者说创建多级目录。 [ ! -d "${BACKUP}/${DATETIME}"] && mkdir -p "${BACKUP}/${DATETIME}" #执行 MySQL 备份数据库的指令 mysqldump -u${DB_USER} -p${DB_PW} --host=${HOST} ${DATABASE} | gzip > ${BACKUP}/${DATETIME}/$DATETIME.sql.gz #将文件处理成 tar.gz cd ${BACKUP} tar -zcvf $DATETIME.tar.gz ${DATETIME} # 删除对应的备份目录 rm -rf ${BACKUP}/${DATETIME} #删除10天前的备份文件 find ${BACKUP} -atime +10 -name "*.tar.gz" -exec rm -rf {} \; echo "=====================备份文件成功========================="
运行 crontab -e 指令,增加下面命令(结尾光标要停留在 h 上),用于定时调用上面的 Shell 脚本。
10 2 * * * /usr/sbin/mysql_db_backup.sh
第18章 Linux 之 Python 定制篇-Python 开发平台 Ubuntu
- Ubuntu 的介绍
- Ubuntu(乌班图)是一个以桌面应用为主的开源 GNU/Linux 操作系统,Ubuntu 是基于 GNU/Linux,支持 x86、amd64(即 x64)和 ppc 架构,由全球化的专业开发团队(Canonical Ltd) 打造的。
- 专业的 Python 开发者一般会选择 Ubuntu 这款 Linux 系统作为生产平台。
- Ubuntu 和 Centos 都是基于 GNU/Linux 内核的,因此基本使用和 Centos 是几乎一样的,它们的各种指令可以通用。在学习和使用 Ubuntu 的过程中,会发现各种操作指令在前面学习 CentOS 都使用过,只是界面和预安装的软件有所差别。
- Ubuntu 下载地址:http://cn.ubuntu.com/download/
- 设置 Ubuntu 支持中文
默认安装的 Ubuntu 中只有英文语言,因此是不能显示汉字的。要正确显示汉字,需要安装中文语言包。
- 安装中文支持步骤
- 单击左侧图标栏打开 System Settings(系统设置)菜单,点击打开 Language Support(语言支持)选项卡。
- 点击 Install / Remove Languages,在弹出的选项卡中下拉找到 Chinese(Simplified),即中文简体, 在后面的选项框中打勾。然后点击 Apply Changes 提交,系统会自动联网下载中文语言包(保证 Ubuntu 是联网的)。
- 这时“汉语(中国)”在最后一位因为当前第一位是“English”,所以默认显示都是英文。我们如果希望默认显示用中文,则应该将“汉语(中国)”设置为第一位。设置方法是拖动,鼠标单击“汉语(中国)”,当底色变化(表示选中了)后,按住鼠标左键不松手,向上拖动放置到第一位。
- 设置后不会即刻生效,需要下一次登录时才会生效。
- Ubuntu 的 root 用户
- 介绍
安装 Ubuntu 成功后,都是普通用户权限,并没有最高 root 权限,如果需要使用 root 权限的时候, 通常都会在命令前面加上 sudo 。有的时候感觉很麻烦。
一般使用 su 命令来直接切换到 root 用户的,但是如果没有给 root 设置初始密码,就会抛出 su: Authentication failure 这样的问题。所以,我们只要给 root 用户设置一个初始密码就好了。- 给 root 用户设置密码并使用
- 输入 sudo passwd 命令,设置 root 用户密码。
- 设置 root 密码成功后,执行 su root 命令,并输入刚才设置的 root 密码,就可以切换成 root 用户。提示符 $ 代表普通用户,提示符 # 代表 root 用户。
- 输入 exit 命令,退出 root 用户并返回普通用户。
- Ubuntu 下开发 Python
- 说明
安装好 Ubuntu 后,默认就已经安装好 Python 的开发环境 Python2.7 和 Python3.5。- 在 Ubuntu 下开发一个 Python 程序
- 编写 hello.py 文件
- 执行 python3 hello.py 命令运行文件
第19章 Linux 之 Python 定制篇-APT 软件管理和远程登录
- APT 介绍
APT 是 Advanced Packaging Tool 的简称,是一款安装包管理工具。在 Ubuntu 下,我们可以使用 apt 命令可用于软件包的安装、删除、清理等,类似于 Windows 中的软件管理工具。
- Ubuntu 软件操作的相关命令
sudo apt-get update 更新源
sudo apt-get install package 安装包
sudo apt-get remove package 删除包
sudo apt-cache show package 获取包的相关信息,如说明、大小、版本等
sudo apt-get -f install 修复安装
sudo apt-get upgrade 更新已安装的包
sudo apt-get source package 下载该包的源代码
- 更新 Ubuntu 软件下载地址
- 寻找国内镜像源
https://mirrors.tuna.tsinghua.edu.cn/
所谓的镜像源:可以理解为提供下载软件的地方,比如 Android 手机上可以下载软件的安卓市场;iOS 手机上可以下载软件的 AppStore- 备份 Ubuntu 默认的源地址
sudo cp /etc/apt/sources.list /etc/apt/sources.list.backup- 更新源服务器列表
- cd /etc/apt/v
- echo '' > sources.list 清空 sources.list 文件内容
- 复制镜像网站地址,拷贝到 sources.list 中
- sudo apt-get update 更新源地址
- Ubuntu 安装、卸载软件
- 使用 apt 完成安装和卸载 Vim 软件,并查询 Vim 软件的信息
- sudo apt-get install vim
- sudo apt-get remove vim
- sudo apt-cache show vim
- 远程登录 Ubuntu
- SSH 介绍
- SSH 为 Secure Shell 的缩写,由 IETF 的网络工作小组(Network Working Group)所制定;SSH 为建立在应用层和传输层基础上的安全协议。
- SSH 是目前较可靠,专为远程登录会话和其他网络服务提供安全性的协议。常用于远程登录,以及用户之间进行资料拷贝。几乎所有 UNIX/Linux 平台,都可运行 SSH。
- 使用 SSH 服务,需要安装相应的服务器和客户端。客户端和服务器的关系:如果,A 机器想被 B 机器远程控制,那么,A 机器需要安装 SSH 服务器,B 机器需要安装 SSH 客户端。
- 和 CentOS 不同,Ubuntu 默认没有安装 SSHD 服务(使用 netstat 指令查看:apt install net-tools)。因此,我们不能进行远程登录。
- 安装 SSH 和启用
- sudo apt-get install openssh-server
执行上面指令后,在当前这台 Linux 上就安装了 SSH 服务端和客户端。- service sshd restart
执行上面的指令,就启动了 sshd 服务。监听端口为22。- 从一台 Linux 系统远程登陆另一台 Linux 系统
在创建服务器集群时,会用到该技术。
- 两台 Linux 系统都要安装 openssh-server
- 基本语法:ssh 用户名@IP 比如 ssh root@192.168.188.131
- 可以使用 exit 或者 logout 命令退出当前账户
- 使用 ssh 访问,如访问出现错误。可查看是否有该文件 ~/.ssh/known_ssh 尝试删除该文件解决。