第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 代表第一到第九個參數,十以上的參數需要用大括號,如${10}
- $*:代表命令行中所有的參數,$*把所有的參數看成一個整體
- $@:代表命令行中所有的參數,不過該命令是把每個參數區分對待
- $#:代表命令行中所有參數的個數
- 快速入門
#!/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 嘗試刪除該文件解決。