動手學 VPS 架站:使用 CentOS 7 + Nginx + PHP-FPM + MariaDB (4) - shell 指令 (續)

LNMP

接續前一篇,繼續介紹套件管理及其他常用的指令。

2.3.6 YUM 套件管理

在 Linux 中,管理軟體的安裝或移除可以使用 RPM (Red Hat/Fedora/CentOS) 或 DPKG (Debian/Ubuntu),很方便但有一個缺點,就是因為軟體相依性的關係,原本你只想安裝 A 軟體,但是由於它相依其他 B、C、D 等等軟體,而必須先安裝 B、C、D,而 B、C、D 當中也可能相依其他軟體,造成安裝軟體的行為變得很繁鎖。

YUM (Red Hat/Fedora/CentOS) 或 APT (Debian/Ubuntu) 是一個套件管理程式,它可以幫你解決軟體安裝時相依性的問題,每個軟體都有自己的相依軟體清單,套件管理指令可以藉由這個清單,自動幫你完成軟體的安裝,包含升級及移除等功能。YUM 也可以更新 Linux 系統的核心。

YUM 指令是怎麼取得軟體的呢?首先會有一台 YUM 伺服器,當軟體釋出的時候,會將其放到 YUM 伺服器上,這樣當你搜尋的時候才找得到。某些軟體會放在 EPEL (Extra Packages for Enterprise Linux) 額外套件庫中,此 EPEL 由 Fedora 群組建立、維護及管理,可以提供 Fedora、RHEL (Red Hat Enterprise Linux) 及 CentOS 等作業系統使用,有時候你必須安裝 EPEL 才能找到你想安裝的軟體。

搜尋套件

yum search 關鍵字
# 關鍵字可以是概略的名稱,yum 會找出所有相關的套件,例如
yum search php70w
# 或是套件的描述
yum search PHP scripting language

查詢套件資訊

yum info 完整套件名稱
# 必須輸入完整套件名稱,否則會找不到,例如
yum info php70w

# 列出所有可以更新的套件資訊
yum info updates

# 列出所有已安裝的套件資訊
yum info installed

套件清單

# 列出伺服器上所有可以安裝的套件
yum list
# 通常不會這麼用,因為套件太多了,可以用關鍵字加上萬用字元來過濾
yum list php7*

# 只列出本機上已安裝,但是可以升級的套件
yum list updates 
# 和 yum info updates 不同的是,它不會顯示詳細資料

# 只列出本機上已安裝的套件
yum list installed
# 一樣不會顯示詳細資料,只有套件名稱

安裝套件

yum install 完整套件名稱
# 套件名稱後的 .x86_64 可省略,它是表示此套件為 64 位元版本
# .i386 是 32 位元版本
# .noarch 表示沒有硬體上的限制

更新套件

yum update 完整套件名稱
# 如果不輸入完整套件名稱,表示要更新所有可以更新的套件

升級套件

yum upgrade 完整套件名稱
# 如果不輸入完整套件名稱,表示要升級所有可以升級的套件

yum upgrade 
# 等同於 
yum update --obsoletes

升級套件更新套件的功能差不多,唯一的差別在於 upgrade 會將過時的套件移除並且安裝新版本,而 update 不會,過時的版本通常指主版本號的版次,例如從第 1.x 版換到第 2.x 版。有時候新版本可能無法正常在你目前的工作環境中執行,這時候就要考慮使用 update 來保留舊版本的套件,而不要強制升級到最新版本。

移除套件

yum remove 套件完整名稱

自動回答詢問

在安裝、更新或移除套件時,yum 可能會詢問你 yes/no,如果你不想浪費這些停頓的時間,你可以透過 -y 選項來預設以 yes 回答,例如:

yum install -y php70w
yum update -y php70w
yum remove -y php70w

檢查有哪些套件可以更新

yum check-update
# 等同於
yum list updates

清除快取檔案

# 清除快取資料
yum clean
# 清除全部的快取,包含以下全部
yum clean all
# 只清除套件快取
yum clean packages
# 只清除 header 快取
yum clean headers
# 只清除 oldheader 快取
yum claen oldheaders

在你安裝套件時,yum 會暫存該套件相關的資料 (可能在 /var/cache/yum 目錄),你可以選擇性地清除它們來釋放磁碟空間。

 

2.3.7 服務的啟動及停止

早期的服務啟動指令是直接呼叫該服務然後帶入參數,例如:

/etc/init.d/httpd start

但是這樣要記住每個服務的位置並輸入其路徑頗為麻煩,後來改用 service 指令:

service httpd start

現在最新的方式是使用 systmectl 指令,把服務名稱放在最後面:

systemctl start httpd   # 啟動
systemctl stop httpd    # 停止
systemctl restart httpd # 重新啟動
systemctl status httpd  # 狀態

之後我們會用這個方式來控制服務的啟動等動作。



2.3.8 其他指令

which 指令

尋找執行檔 (指令) 所在位置,它只會尋找 $PATH 這個變數中所設定的目錄下的指令。

which php
# 顯示結果 /usr/bin/php

echo 指令

用來輸出字串或變數。

echo "Hello"
# 輸出 Hello

echo $HOME
# 輸出 /home/vagrant

# 單引號和雙引號的差別在於變數是否視為字串
echo "My name is $USER"
# 輸出 My name is vagrant

echo 'My name is $USER'
# 輸出 My name is $USER
你如果會寫 PHP,概念是一樣的。

資料流重導向

在 Linux 中,有標準輸入、輸出及錯誤輸出三種資料流向:

  • 標準輸入 (stdin):代號 0 ,符號 < 或 <<
  • 標準輸出 (stdout):代號 1 ,符號 > 或 >>
  • 標準錯誤輸出 (stderr):代號 2 ,符號 2> 或 2>>
# 列出目錄中的檔案清單,並「輸出」到螢幕
ls

# 列出目錄中的檔案清單,並「重導向輸出」到檔案
ls > filelist.txt
# 執行後,會多出一個 filelist.txt 檔案,
# 但是螢幕不會顯示任何內容

# 一般使用者無法讀取 secure 檔
cat /var/log/secure
# 所以會出現以下錯誤
cat: /var/log/secure: Permission denied
# 我們可以「重導向這個錯誤」到檔案中
cat /var/log/secure 2> err.txt
# 現在多出一個 err.txt 的檔案,內容和原本出現在螢幕中的訊息一樣

# 原本由鍵盤輸入改由檔案輸入
cat > bashrc.txt < ~/.bashrc
# 將會得到一個 bashrc.txt 檔案,內容和 .bashrc 一模一樣
# cat > bashrc.txt 這段指令可以讓我們從鍵盤輸入文字,
# 但是我們藉由「輸入重導向」將檔案內容導入

# > 和 >> 的差別是一個會從頭輸出(即覆蓋原內容),一個是接在原內容後面
ls -l > filelist.txt
ls -m > filelist.txt
# 最後只有 ls -m 的內容存在
ls -l > filelist.txt
ls -m >> filelist.txt
# ls -m 的結果會接在 ls -l 後面

Linux 有個特殊的檔案 /dev/null 可以把它視為黑洞,任何丟給它的資料都會消失:

# 把權限不足的錯誤訊息丟到黑洞
cat /var/log/secure 2> /dev/null

你也可以把原本的標準輸出導向標準錯誤輸出:

# 「標準輸出」導向「標準錯誤輸出」
echo "Hello" 1>&2
# 反過來也可以
echo "Hello" 2>&1

管線指令 (pipe)

管線指令可以讓你將多組指令串接在一起一次執行,每一組指令的結果 (輸出) 會是下一組指令的資料來源 (輸入);只有可以接收 standard input (STDIN) 的指令才可用於管線指令中,例如 less, more, head, tail 等。

yum list php* | less
# 列出 php 開頭的套件太多了,可以輸出給 less 來翻頁查

grep 指令

以行為單位找出需要的資料,搜尋字串可以使用正規表示式 (Regular Expression) 來表示。

# 找出無效的登入使用者名稱
sudo cat /var/log/secure | grep -i 'Invalid user'

可以使用選項:

  • -i:忽略大小寫
  • -n:輸出行號
  • -v:反向選擇

last 指令

查詢誰登入過主機。

# 預設會顯示當月的全部資料,如果太多可以加上數量限制
last
last -5

lastlog 指令

顯示系統中所有帳號「最後一次」登入主機的時間;這個指令其實只是去讀取 /var/log/lastlog 的內容而已。

lastlog
# 只列出 tony 這個使用者
lastlog | grep tony

uname 指令

查詢系統與核心相關資訊。

uname
uname -a # 所有系統相關的資訊
# 結果 Linux localhost.localdomain 3.10.0-862.9.1.el7.x86_64 #1 SMP Mon Jul 16 16:29:36 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux

uname -s # 系統核心名稱
uname -r # 核心的版本
uname -m # 系統的硬體名稱,例如 i386 (32位元) 或 x86_64 (64位元)

free 指令

查詢記憶體使用情況。

free
# 依選擇的單位顯示,請擇一使用
# -b (bytes) -k (Kbytes,預設值) -m (Mbytes) -g (Gbytes)
free -m
# 依人類容易閱讀的方式顯示
free -h
# 每隔幾秒自動輸出, ctrl + c 結束
free -s 5

top 指令

持續顯示程序的運作狀態。

top
# 進入畫面後按 u 再輸入使用者名稱,例如 nginx
# 就能觀察 nginx 使用者的使用硬體資源的情況
# q 離開

ps 指令

將目前這個時間點程序運作狀態顯示出來。相對於 top 是靜態的。

# 顯示系統所有的程序的資料
ps aux 
# 通常會搭配管線指令及 grep 來過濾內容
ps aux | grep nginx 

crontab 指令

這是排程指令,例如你希望每天晚上 12 點執行某支程式,就可以透過它來設定。

# 確認 crond 這個排程服務是否已啟動
systemctl status crond

crontab -e # 編輯排程,自動開啟 vi
crontab -l # 查看排程
crontab -r # 刪除排程

排程的格式為

分    時    日   月   週   指令
0~59 0~23 1~31 1~12 0~7  注意指令的路徑

註:週的 0 和 7 均指星期日。

一行一個排程,全部以空白間隔,可以使用 4 個符號來指定時間:

  • * 星號:表示任何時刻,例如放在這欄表示任何分鐘都符合。
  • , 逗號:多個時間,例如在這欄寫 9,17 表示早上 9 點及下午 5 點兩個時間。
  • - 減號:一段連續時間,例如8-12 表示早上 8 點一直到中午 12 點。
  • / 斜線:間隔時間,例如*/10 表示每 10 分鐘一次。

使用範例:

# 每隔 5 分鐘,把 error.log 最後的內容輸出到家目錄下
*/5 * * * * tail /var/log/nginx/error.log > ~/error.log

# 每天早上 9 點,把最後登入的資訊輸出到家目錄下
* 9 * * * * last > ~/lastlogin.txt

# 每月 1 日凌晨 1 點,更新憑證
* 1 1 * * /usr/local/bin/certbot-auto renew

ip 指令

# 列出所有網路裝置
ip a

# 只列出 ipv4 的 ip 
ip -4 a 
# -6 則只顯示 ipv6 的 ip

# 我們要查的裝置為 eth1,只顯示它的資料即可
ip -4 a show eth1

# 可以串接管線指令 grep 搜尋來過濾結果
ip -4 a show eth1 | grep inet
# 得到的結果 inet 192.168.8.8/24 brd 192.168.8.255 scope global noprefixroute eth1

下一章,我們將介紹如何設定讓系統的登入更加安全。

本文網址:http://blog.tonycube.com/2018/08/vps-centos-7-nginx-php-fpm-mariadb-4-shell.html
Tony Blog 撰寫,請勿全文複製,轉載時請註明出處及連結,謝謝 😀

我要留言

留言小提醒:
1.回覆時間通常在晚上,如果太忙可能要等幾天。
2.請先瀏覽一下其他人的留言,也許有人問過同樣的問題。
3.程式碼請先將它編碼後再貼上。(線上編碼:http://bit.ly/1DL6yog)
4.文字請加上標點符號及斷行,難以閱讀者恕難回覆。
5.感謝您的留言,您的問題也可能幫助到其他有相同問題的人。