Linux 常用命令總結(三)


一、實用命令

1、crontab(定時任務)

(1)基本概念
  crontab 是用來管理定時任務的命令。
  系統啟動后,將會自動調用 crontab,如果存在任務,則根據相關定義去執行。

 

(2)常用場景
  系統周期性執行的工作。比如:系統數據備份,定期清理緩存等。
  個人定期執行的工作。比如:每隔幾分鍾檢查郵件服務器是否存在新郵件。

 

(3)語法規則

【語法:】
    crontab [options]
    crontab [options] file

【options:】
    -u <user>     指定某用戶的定時任務。
    -e            編輯當前用戶的任務,進入 vi 文字編輯器。
    -l            查看當前用戶的任務
    -r           刪除當前用戶的任務
    
【定時任務格式:】
    f1 f2 f3 f4 f5 command
說明:
    f1 表示分鍾(0 - 59)
    f2 表示小時(0 - 23)
    f3 表示天數(1 - 31)
    f4 表示月數(1 - 12)
    f5 表示星期幾(0 - 6, 0 表示 星期天,1 表示星期一...)
    command 表示待執行的命令

即:(通過 cat /etc/crontab 可以查看)
# .---------------- minute (0 - 59)
# |  .------------- hour (0 - 23)
# |  |  .---------- day of month (1 - 31)
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# |  |  |  |  |   .---- command to be executed
# *  *  *  *  * command 

注:
    f1 為 * 時,表示每分鍾執行。f2...f5 類似。
    f1 為 a-b 時,表示從第 a 分鍾到第 b 分鍾時間段內,每分鍾執行一次。f2...f5 類似。
    f1 為 */n 時,表示每隔 n 分鍾執行一次。f2...f5 類似。
    f1 為 a,b,c 時,表示第 a、b、c 分鍾執行一次。f2...f5 類似。

 

(4)相關命令

【查看 crontab:】
    cat /etc/crontab

【編輯 crontab:】
    crontab -e
注:
    不同的用戶創建的任務,最終出現在 /var/spool/cron 下,文件名為 用戶名。
    比如:root 用戶創建的任務最終存儲在 /var/spool/cron/root 文件中。

【查看 crontab:】
    crontab -l
    cat /var/spool/cron/root    # 查看 root 用戶的定時任務

【刪除所有 crontab:】
    crontab -r

【查看、啟動、重啟、停止 crontab 服務:】
  service crond status
  service crond start/stop/restart

【查看日志:】
  tail -f /var/log/cron

 

(5)舉例:

【每分鍾執行一次 echo:】
    * * * * * echo 11 >> /root/test/text.txt
注:
    若腳本中命令不生效,將命令換成 絕對路徑 試一下。
    通過 which 可以查找 命令所在的 絕對路徑,比如: which echo 輸出為 /usr/bin/echo
    替換絕對路徑,比如: * * * * * /usr/bin/echo 11 >> /root/test/text.txt
    
【每個月 1 號、15 號 執行一次 echo:】
    0 0 1,15 * * echo 11 >> /root/test/text.txt

 

2、sh、source、exec(執行腳本)

(1)基本概念

【sh:】
    使用 sh script.sh 執行腳本時,當前 shell 是父進程,生成一個子 shell 進程,在子 shell 中執行腳本。
    腳本執行完畢,退出子 shell,回到當前 shell。
    ./script.sh 與 sh script.sh 等效
注:
    echo $$  # 輸出當前 shell 的進程號

【source:】
    使用 source script.sh 方式,在當前上下文中執行腳本,不會生成新的進程。
    腳本執行完畢,回到當前 shell。
    . script.sh(. 與 script.sh 之間有一個空格) 與 source script.sh 等效。    

【exec:】
    使用 exec command 方式,一般用於腳本內部,會用 command 進程替換當前 shell 進程,並且保持 PID 不變。
    執行完畢,直接退出,不回到之前的 shell 環境。

 

(2)問題一:sh、source 區別

【sh、source 區別:】
    使用 sh 和 source 方式下,腳本執行完畢,都會回到之前的 shell 中。
    通過 sh 執行腳本時,修改的上下文(比如:環境變量)不會影響當前 shell。
    通過 source 執行腳本時,修改的上下文(比如:環境變量)會影響當前 shell。

 

(3)問題二:修改 PATH 變量,不重啟使其生效

【修改 PATH 變量,不重啟使其生效:】
Step1:
    在 /etc/profile 文件末尾追加 PATH 設置。
比如:
    echo 'export MAVEN_HOME=/usr/local/maven/apache-maven-3.6.1' >> /etc/profile
    echo 'export PATH=$MAVEN_HOME/bin:$PATH' >> /etc/profile
    
Step2:
    執行 source /etc/profile 使其生效

 

(4)問題三:在腳本中執行 source /etc/profile 不生效

【在腳本中執行 source /etc/profile 不生效:】
方式一:
    可以直接使用 source 腳本名 直接去調用,不需要在腳本中寫 source /etc/profile
    
方式二:
    在腳本執行 source /etc/profile 后,追加 exec 語句。
    通過 exec bash -l 或者 exec /bin/bash -l 或者 exec $SHELL -l 去打開一個新進程。
注:
    exec 會導致 exec 之后的語句不執行,exec 一般放於腳本末尾。

 

3、jq(json 解析工具)

(1)基本概念
  jq 是一款在使用命令行處理 JSON 數據的工具,可用於處理 標准輸入、管道、文件 傳遞的 JSON 數據,經過一系列 過濾器、表達式 后,提取成需要的數據 並輸出到 標准輸出中。

 

(2)相關地址
  jq 官網地址: https://stedolan.github.io/jq/
  jq 文檔: https://github.com/stedolan/jq/wiki
  jq 文檔: https://stedolan.github.io/jq/manual/

 

(3)安裝

【centos:】
    yum install -y epel-release
    yum install -y jq
    
【其余方式參考官網提供方式:】
    https://stedolan.github.io/jq/download/

 

(4)語法規則

【語法:】
    jq [options] <jq filter> [file...]
    
【options: 】
    -c 緊湊輸出(默認為 樹形結構,緊湊輸出將樹形結構轉為一行輸出)
    -r 輸出原始字符串,不在結果上加雙引號
    -R 讀取原始字符串,在結果上加上雙引號
    -C 字符串着色
    -M 字符串不着色
    --tab 使用 tab 替換縮進符
    -s 將結果使用數組保存
    --arg a v 將變量 $a 設置為值 v
注:
    對於待解析的數據,其所有的屬性名必須是以雙引號包括的字符串,否則可能會解析失敗。
    數據不存在時,返回 null 。

【jq filter -- 基本規則: 】
    jq 根據語法規則解析 jq filter,並將其應用在 JSON 數據上,從而解析出想要的結果。
    
    .   是最基本的過濾器。僅用 . 作為過濾器時,表示對整個 JSON 數據的引用,結果是格式化輸出 JSON 數據。
    ''  單引號可以不使用,但是若組合了多個過濾器,需要使用單引號包裹。
    ""  雙引號用於包裹特殊字符。比如: ."key$" 或者 .["key$"] 
    ,   用於輸出多個過濾器結果。比如: .key1,.key2 表示過濾 key1 key2 的數據
    |   jq filter 支持串行化操作,一個復雜的 filter 可以由多個簡單的 filter 通過 管道符 "|" 連接組成,每個 filter 均以 前一個 filter 的結果作為輸入數據進行處理。
    ..  遞歸輸出每個值。
    []  將結果構造為一個數組,比如: '[.key1,.key2]'
    {}  將結果構造為一個對象,比如: '{"result": .key1}'。
比如: 
    {"key1":{"key11":"value11","key12":"value12"}}, 可以通過 '.key1 | .key11' 去解析 key11 的值。 
    echo '{"key1":{"key11":"value11","key12":"value12"}}' | jq '.key1 | .key11'

【jq filter -- 對象操作: 】
    jq 使用類似於 '.key' 的方式過濾 JSON 對象,當數據不存在時,返回 null。
    
    過濾單個對象: '.key1'  等價於 .'["key1"]'
    過濾多個對象 '.key1, .key2'  等價於  .'["key1", "key2"]'
    過濾對象的對象: '.key1.key2' 等價於 '.key1 | .key2'
    
【jq filter -- 數組操作: 】
    jq 使用類似於 '.[index]' 的方式過濾 JSON 數組。

    過濾單個數組元素: '.[index]'      index 從 0 開始,正序輸出,若為負數,反序輸出(0 表示第一個元素, -1 表示最后一個元素)。
    過濾多個數組元素: '.[index, index2]'
    過濾所有數組元素: '.[]'
    過濾數組某個范圍的數據:  '.[startIndex:endIndex]'    包含 startIndex ,但不包含 endIndex

 

(5)舉例(簡單)

【vi test.json       編輯 json 數據】
{
  "key1": "value1",  "key2": "value2"
}

【cat test.json | jq     格式化輸出數據】
{
  "key1": "value1",
  "key2": "value2"
}

【cat test.json | jq -c     輸出緊湊的數據】
{"key1":"value1","key2":"value2"}

【cat test.json | jq -R     輸出結果會加上雙引號】
"{"
"  \"key1\": \"value1\",  \"key2\": \"value2\""
"}"

【cat test.json | jq -s    結果使用數組形式保存】
[
  {
    "key1": "value1",
    "key2": "value2"
  }
]

【cat test.json | jq --arg name jarry '{name: $name}'     將變量 $a 設置為值 v】
{
  "name": "jarry"
}

 

(6)舉例(解析對象 Object)

【vi test.json    編輯 json 數據】
{
  "key1": {
    "key11": "value11",
    "key12": "value12"
  },
  "key2": "value2"
}

【cat test.json | jq .key1     獲取 key1 對應的 value】
{
  "key11": "value11",
  "key12": "value12"
}

【cat test.json | jq .'["key1"]'     獲取 key1 對應的 value】
{
  "key11": "value11",
  "key12": "value12"
}

【cat test.json | jq .key1,.key2      獲取 key1,key2 對應的 value】
{
  "key11": "value11",
  "key12": "value12"
}
"value2"

【cat test.json | jq .'["key1", "key2"]'     獲取 key1,key2 對應的 value】
{
  "key11": "value11",
  "key12": "value12"
}
"value2"

【cat test.json | jq .[]     獲取所有的 value】
{
  "key11": "value11",
  "key12": "value12"
}
"value2"

【cat test.json | jq .key1.key11   獲取 key11 對應的 value】
"value11"

【cat test.json | jq -r .key1.key11   獲取 key11 對應的 value】
value11

【cat test.json | jq keys   獲取所有 key 組成的數組】
[
  "key1",
  "key2"
]

【cat test.json | jq [.[]]   獲取所有的 value 組成的數組】
[
  {
    "key11": "value11",
    "key12": "value12"
  },
  "value2"
]

 

(7)舉例(解析數組 Array)

【vi test.json    編輯 json 數據】
[
    {
      "key1": ["value1"],
      "key2": "value2"
    },
    ["value3", "value4"]
]

【cat test.json | jq .[]    獲取數組所有的元素】
{
  "key1": [
    "value1"
  ],
  "key2": "value2"
}
[
  "value3",
  "value4"
]

【cat test.json | jq .[0]   獲取數組的第一個元素】
{
  "key1": [
    "value1"
  ],
  "key2": "value2"
}

【cat test.json | jq .[1]   獲取數組的第二個元素】
[
  "value3",
  "value4"
]

【cat test.json | jq .[0:2]   獲取數組 第一個元素 到 第三個元素】
[
  {
    "key1": [
      "value1"
    ],
    "key2": "value2"
  },
  [
    "value3",
    "value4"
  ]
]

【cat test.json | jq .[0].key1    獲取 Object 對象的 value 值】
[
  "value1"
]

【cat test.json | jq '.[0] | .key1'   獲取 Object 對象的 value 值】
[
  "value1"
]

【cat test.json | jq .[0].key1,.[0].key2】
[
  "value1"
]
"value2"

【cat test.json | jq .[1][0]   獲取 數組元素 】
"value3"

【cat test.json | jq '.[1] | .[0]'"value3"

【cat test.json | jq [.[0].key2]】
[
  "value2"
]

【cat test.json | jq [.[1][0]]】
[
  "value3"
]

 

4、logrotate(管理日志文件)

(1)基本概念

logrotate 是 Linux 上的一個日志文件管理工具。
可以刪除 舊的日志文件,並創建新的日志文件。這個過程可以稱為 “日志輪替”。
可以根據 日志文件的大小、以及 日志文件 的存放天數 來進行處理。一般通過 cron 程序來執行。
crontab 會每天執行一次 /etc/cron.daily 目錄下的腳本,該目錄下存在一個 /etc/cron.daily/logrotate 文件,內部執行 logrotate 命令。
若 logrotate 配置在其他目錄下,比如: /etc/cron.daily/,/etc/cron.weekly/,/etc/cron.monthly/,/etc/cron.hourly/,則可能 每天、每周、每月、每小時 執行一次。
一般情況下,logrotate 每天由 crontab 執行一次,可以手動執行 logrotate 命令(-f 強制執行),或者 自定義定時任務。

 

(2)語法規則

【語法:】
    logrotate [options] <configfile>

【options:】
    -d, --debug       顯示指令執行過程,不進行實際操作
    -v, --verbose     顯示指令執行過程,進行實際操作
    -f, --force       強制執行
    -s, --state=statefile  指定日志更新狀態,形如:"/var/log/yum.log" 2021-4-1-10:54:26
   
【logrotate 基本格式:】
    日志文件路徑 + {} 組成,{} 內部每行表示一個規則。
    若配置多個文件,文件名獨立成行。
*.log {
    rule1
    rule2
    ...
}

xxx.log
xxx.log2
{
    rule1
    rule2
    ...
}

【logrotate 基本規則參數:】
    compress                    使用 gzip 壓縮日志文件。
    nocompress                  不壓縮日志文件。
    copytruncate                先復制日志文件,再清空。復制與清空之間存在時間差,可能丟失部分日志數據。
    create mode owner group     創建空文件,並指定權限、用戶名、組名。比如: create 0600 root root。
    nocreate                    不創建新的空文件。
    daily                       指定 日志輪替 周期為 每天。
    weekly                      指定 日志輪替 周期為 每周。
    monthly                     指定 日志輪替 周期為 每月。
    delaycompress               延遲壓縮過程到 下一次 進行 日志輪替 時進行。與 compress 配合使用,即當前日志文件 需要等待下一次 日志輪替 時才進行 壓縮。
    ifempty                     即使日志文件為空,也進行 日志輪替。
    notifempty                  日志文件為空,則不作 日志輪替。
    missingok                   如果日志文件不存在,仍可以繼續處理,不會出錯。
    nomissingok                 如果日志文件不存在,則會出錯(顯示出錯信息)。
    noolddir                    日志存儲在同一個目錄下。
    olddir [目錄名]             指定日志存儲目錄。
    rotate [數量]               指定日志文件備份數量。執行一次日志輪替,就生成一次備份文件,超過后,備份文件內容將清空,若未配置,則直接修改原文件。
    size [大小]                 當日志文件超過指定的文件大小時進行日志輪替,默認單位為 byte,可以為 K、M、G,比如: size 10M                 
    sharedscripts               對多個日志文件 執行 postrotate 或者 prerotate 命令。
    dateext                     使文件以日期為后綴。默認為 xxx.log.1,xxx.log.2 等,以日期結尾,比如:xx.log.2020-04-20
    dateformat -%Y%m%d%H.%s     配合 dateext 使用,改變日期后綴的格式。
    prerotate~endscript        預操作,在執行 日志輪替前 先執行 prerotate~endscript 之間的命令。
    postrotate~endscript       后操作,在執行 日志輪替后 執行 postrotate~endscript 之間的命令。

 

(3)相關文件

【cat /etc/cron.daily/logrotate】
#!/bin/sh

/usr/sbin/logrotate -s /var/lib/logrotate/logrotate.status /etc/logrotate.conf
EXITVALUE=$?
if [ $EXITVALUE != 0 ]; then
    /usr/bin/logger -t logrotate "ALERT exited abnormally with [$EXITVALUE]"
fi
exit 0

【cat /etc/logrotate.conf】
# see "man logrotate" for details  通過 man logrotate 指令可以查看 logrotate 詳情
# rotate log files weekly          每周進行一次 日志輪替
weekly

# keep 4 weeks worth of backlogs   保留最近 4 周的日志
rotate 4

# create new (empty) log files after rotating old ones   創建一個空的新文件 在 日志輪替 老文件后
create

# use date as a suffix of the rotated file      使文件以日期為后綴
dateext

# uncomment this if you want your log files compressed     compress 表示壓縮日志文件
#compress

# RPM packages drop log rotation information into this directory  存放 rpm 安裝的軟件的日志輪替規則,自定義日志輪替
include /etc/logrotate.d

# no packages own wtmp and btmp -- we'll rotate them here   配置 wtmp、btmp 日志輪替規則
/var/log/wtmp {
    monthly
    create 0664 root utmp
   minsize 1M
    rotate 1
}

/var/log/btmp {
    missingok
    monthly
    create 0600 root utmp
    rotate 1
}

# system-specific logs may be also be configured here       可以在此處配置系統日志輪替規則

 

(4)配置 logrotate 的方式

【方式一:】
    直接在 /etc/logrotate.conf 文件中進行配置。
    一般用於配置非 rpm 安裝的軟件的系統文件。
    
【方式二:】
    在 /etc/logrotate.d 文件夾下 新建一個配置文件。
    一般 rpm 安裝的軟件 會自動生成一個配置文件。比如:/etc/logrotate.d/yum

【cat /etc/logrotate.d/yum】
/var/log/yum.log {
    missingok
    notifempty
    maxsize 30k
    yearly
    create 0600 root root
}

 

5、sed(修改文本)

(1)基本概念

【基本概念:】
    sed 是一個過濾和轉換文本的流編輯器(非交互式)。
    用於處理 文件 或者 管道符 傳遞的文本數據,可以對數據行進行替換、刪除、新增、選取等特定工作,簡化對文件的反復操作。
    默認情況下,sed 逐行處理 輸入數據,會將修改結果輸出,不會修改源文件。
    
【處理流程:】
    1、將正在處理的行 保存在一個臨時緩存區(模式空間)中.
    2、處理臨時緩存區中的數據,將結果輸出。處理完一行,就將其從臨時緩存區刪除。
    3、重復 1-2 部署,直至數據處理完成。

 

(2)語法規則

【語法:】
    sed [options] 'command' fileName1 [fileName2]          # sed 命令格式
    sed [options] -f scriptFile fileName(s)                # sed 腳本模式(根據 scriptFile 中的 sed 命令對 fileName 表示的文件進行操作)
    
【options:】
    -i       直接修改源文件內容,不輸出。
    -e       默認選項,不修改源文件(可以進行重定向覆蓋源文件)。
    -n       禁止默認輸出行為(輸出所有內容),僅顯示模糊匹配的行,不修改源文件。

【command:】
    command 定義如何處理文件,默認處理所有行。可以通過 數字、字符、正則表達式 組合形式過濾文件。

【command -- 數字(從 1 開始,1 表示第一行):】
    單個數字表示第幾行
    $ 表示最后一行
    使用 , 連接,表示 第幾行 到 第幾行
    使用 ~ 連接,表示從 第幾行 開始,每隔 幾行 取一行
比如:
    2             表示第 2 行。
    $             表示最后一行。
    2,4           表示第 2 行 到 第 4 行。
    2~3           表示從第 2 行開始,每隔 3 行取一行。
    2,+4          表示從第 2 行到 第 2+4 行。
    
【command -- 字符:】
    a\      表示在當前行后面插入一行 或 多行。追加多行時,除最后一行,每行需要以 \ 結尾(表示換行)。
    i\      表示在當前行之前插入一行 或 多行。追加多行時,除最后一行,每行需要以 \ 結尾(表示換行)。
    c\      表示使用新文本替換當前行。追加多行時,除最后一行,每行需要以 \ 結尾(表示換行)。
    d       表示刪除選擇的行。
    h       把模式空間里的內容復制到暫存緩沖區.
    H       把模式空間里的內容追加到暫存緩沖區
    g       把暫存緩沖區里的內容復制到模式空間,覆蓋原有的內容
    G       把暫存緩沖區的內容追加到模式空間里,追加在原有內容的后面
    x       交換暫存緩沖區 與 模式空間的內容。
    n       讀取下一個輸入行到模式空間。
    N       追加下一個輸入行到模式空間。
    p       顯示每行的內容,若與 options 中的 -n 使用時,可以僅輸出 選定的 內容。
    P       僅顯示第一行。
    q       結束 sed 操作
    !       非,表示對非選中行進行操作。
    =       輸出當前行號。
    
【command -- 正則表達式:】
    s/regexp/replacement/     根據 regexp 匹配到指定字符串,然后使用 replacement 進行替換。
    /regexp/
regexp:
    ^         行首定位符,匹配 xx 開頭的行。 /^xx/
    $         行位定位符,匹配 xx 結尾的行. /xx$/
    .         匹配單個字符(除換行符外)。  /x..x/
    *         匹配 0個 或 多個 字符(不能用於首字母)。 /x*x/
    []        匹配指定字符組的任一個字符。 /[Xx]xx/
    [^]       匹配不在指定字符組內的任一字符。  /[^Xx]xx/
    \(..\)    匹配拆分子串,下標從 1 開始,在替換字符串中使用 \1、\2 對其進行引用。  s/\(love\)able/\1rs  -> lovers
    &         保存查找串,在替換字符串中使用 & 進行引用。   s/my/**&**/ ->  **my**
    \<        詞首定位符,匹配 xx 開頭的詞。 /\<xx/
    \>        詞尾定位符,匹配 xx 結尾的詞。 /xx\>/
    x\{m\}    匹配重復 x 行 m 次的行。 /x\{5\}/
    x\{m,\}   匹配重復 x 行至少 m 次的行。 /x\{5,\}/
    x\{m,n\}  匹配重復 x 行至少 m 次,但是少於 n 次的行。 /x\{5,10\}/

注:

  s@regexp@replacement@ 等同於 s/regexp/replacement/

  如果 replacement 是目錄,即存在 "/",使用 s/regexp/replacement/ 需要對 "/" 進行轉義(不太方便)。使用 s@regexp@replacement@ 可以不用轉義。 

 

(3)舉例(數字)

【vi test.txt】
java
javascript
python
c++
go

【sed -n '2p' test.txt     僅輸出 test.txt 第二行內容】
javascript

【sed -n '3,$p' test.txt  輸出第 3 行 到最后一行的內容】
python
c++
go

【sed -n '2,+2p' test.txt  輸出第 2 行開始,到第 4 行(2+2=4)的內容】
javascript
python
c++

【sed -n '2~3p' test.txt  輸出從第 2 行開始,每隔 3 行的內容】
javascript
go

 

(4)舉例(字符)

【vi test.txt】
java
javascript
python
c++
go

【sed -e '2a\hello' test.txt  在 第二行 與 第三行 之間 插入新的一行 hello。此時 hello 作為新的第三行單獨存在】
java
javascript
hello
python
c++
go

【sed -e '3c\helloworld' test.txt    使用 helloworld 替換 第三行】
java
javascript
helloworld
python
c++
go

【sed -e '3i\world' test.txt    在 第三行 之前插入 新的一行 world】
java
javascript
world
helloworld
python
c++
go

【sed -e '3,4d' test.txt   刪除第三行、第四行】
java
javascript
python
c++
go

 

(5)舉例(正則表達式)

【vi test.txt】
java
javascript
python
c++
go

【sed -n '/^java/p' test.txt     輸出所有以 java 開頭的行】
java
javascript

【sed -n '/.*va/p' test.txt     輸出包含 va 的行,若寫成 /*va/ 的形式,可能匹配不到數據】
java
javascript

【sed -n '/\<ja/p' test.txt     輸出包含 ja 開頭的詞的行】
java
javascript

【sed -n '/\>++/p' test.txt     輸出包含 ++ 結尾的詞的行】
c++

【sed -e 's/c++/c--/' test.txt   替換 c++ 為 c--】
java
javascript
python
c--
go

【sed -e 's/\(c\)\(++\)/\1--/' test.txt    替換字符串,\1 用於替代 \(c\),最終效果為 c++ -> c--】
java
javascript
python
c--
go

【sed -e 's/c++/--&&--/' test.txt     & 用於替代查找串,此處 & 等同於 c++】
java
javascript
python
--c++c++--
go

【sed -E "s@(ja)(.*)@\1x/x@" test.txt 等同於 sed -E "s/(ja)(.*)/\1x\\/x/" test.txt】
 

  jax/x
  jax/x
  python
  c++
  go

 

二、網絡相關

1、netstat(顯示網絡狀態)

(1)基本概念
  netstat 命令用於顯示網絡狀態。
  通過 netstat 可以知道整個 Linux 系統的網絡情況。

 

(2)語法規則

【語法:】
    netstat [options]

【options:】
    -a, --all             顯示所有的網絡狀態(包括 監聽、非監聽的 Socket)
    -l, --listening       只顯示正在監聽的 Socket
    -c, --continuous      持續的列出網絡狀態
    -C, --cache           顯示路由緩沖中的路由信息
    -e, --extend          顯示網絡其他相關信息
    -F, --fib             顯示路由緩沖信息
    -n, --numeric         顯示 ip 地址而不是去解析域名獲取 主機、端口或用戶名。
    -o, --timers          顯示與網絡定時器有關的信息。
    -p, --program         顯示 Socket 所屬進程的 PID 和名稱。
    -t, --tcp             顯示 TCP 傳輸協議的連線狀況。
    -u, --udp             顯示 UDP 傳輸協議的連線狀況。
    -i, --interfaces      顯示網絡界面信息表單(網卡信息)。

 

(3)舉例

【顯示網卡相關信息:】
    netstat -i
    
【顯示 tcp 連接情況:】
    netstat -nltp

 

2、telnet(連接遠程機器,確認機器端口是否開放)

(1)基本概念
  telnet 命令用於使用 TELNET 協議與另一個主機進行交互通信。
  可以對另一主機進行遠程登錄、管理操作(有些 linux 服務器不支持 telnet,使用 ssh)。
  可以通過 telnet 來確認遠程主機的某個端口是否開放。也是日常網絡故障排錯的重要一部分。

(2)安裝

【centos7: 】
    yum -y install telnet-server
    yum -y install telnet

 

(3)語法規則

【語法:】
    telnet [options] [ip] [port]

【options:】
    此處省略,通過 man telnet 可以查看語法規則。

 

(4)舉例

【連接遠程主機:】
    telnet 192.168.210.157

【確認遠程主機上某個端口是否可用:】
    telnet 192.168.210.157 8080
注:
    輸出中出現 "Escape character is '^]'" 即表示端口開放。

 

3、nslookup(查詢域名服務器)

(1)基本概念
  nslookup 是一個查詢 Intelnet 域名服務器的程序。有兩種模式: 交互式、非交互式。
  交互模式允許 用戶查詢名稱服務器 以獲取有關 各種主機 和 域的信息 或 輸出域中的主機列表。
  非交互模式僅用於輸出主機 或 域的名稱 等信息。

 

(2)語法規則

【語法:】
    nslookup [options] domain [DNS-Server]

【options:】
    此處省略,通過 man nslookup 可以查看語法規則。

 

(3)舉例:

【查詢百度域名情況:】
    nslookup www.baidu.com
    
Server:         192.168.157.2
Address:        192.168.157.2#53

Non-authoritative answer:
www.baidu.com   canonical name = www.a.shifen.com.
Name:   www.a.shifen.com
Address: 14.215.177.38
Name:   www.a.shifen.com
Address: 14.215.177.39

【指定域名服務器進行查詢:】
    nslookup www.baidu.com 8.8.8.8

Server:         8.8.8.8
Address:        8.8.8.8#53

Non-authoritative answer:
www.baidu.com   canonical name = www.a.shifen.com.
Name:   www.a.shifen.com
Address: 14.215.177.38
Name:   www.a.shifen.com
Address: 14.215.177.39

【反向 DNS 解析:】
    nslookup -ty=ptr 8.8.8.8

Server:         127.0.0.53
Address:        127.0.0.53#53

Non-authoritative answer:
8.8.8.8.in-addr.arpa    name = dns.google.

Authoritative answers can be found from:

 

三、系統內存、磁盤相關

1、free(顯示內存使用情況)

(1)基本概念
  顯示機器內存使用情況(包括已用和未用的內存空間)。
  顯示 系統中 已用和未用的 物理內存和交換內存, 共享內存和 內核使用的 緩沖區的 總和。

 

(2)語法規則

【語法:】
    free [options]
    
【options:】
    -b, --bytes         以 B 為單位顯示內存
    -k, --kilo          以 KB 為單位顯示內存(默認)
    -m, --mega          以 MB 為單位顯示內存
    -g, --giga          以 GB 為單位顯示內存
    -h, --human         優化輸出,數據顯示帶單位       
    -t, --total         額外增加一個 total 行,顯示總和
    -s N, --seconds N   每隔 N 秒輸出一次
    -c N, --count N     輸出 N 次后退出

 

(3)舉例

【free -h】
              total        used        free      shared  buff/cache   available
Mem:           1.8G        763M        256M         20M        799M        852M
Swap:          2.0G        776K        2.0G

【free -h -s 2 -c 3】
              total        used        free      shared  buff/cache   available
Mem:           1.8G        762M        257M         20M        799M        853M
Swap:          2.0G        776K        2.0G

              total        used        free      shared  buff/cache   available
Mem:           1.8G        762M        257M         20M        799M        853M
Swap:          2.0G        776K        2.0G

              total        used        free      shared  buff/cache   available
Mem:           1.8G        762M        257M         20M        799M        853M
Swap:          2.0G        776K        2.0G

 

2、df(顯示磁盤使用情況)

(1)基本概念
  顯示目前在 Linux 系統上的文件系統磁盤使用情況統計。

 

(2)語法規則

【語法:】
    df [options] [file]
    
【options:】
    -a, --all            列出所有的文件系統
    -h,--huma-readable   以易讀的方式列出,帶單位
    -H, --si             與 -h 類似,但是計數單位為 1000,不是 1024                     
    -T, --print-type     輸出每個文件的類型
    --type=TYPE          只顯示指定類型的文件系統
    --exclude-type=TYPE  只顯示指定類型以外的文件系統

 

(3)舉例

【df -Th】
文件系統                類型      容量  已用  可用 已用% 掛載點
devtmpfs                devtmpfs  894M     0  894M    0% /dev
tmpfs                   tmpfs     910M     0  910M    0% /dev/shm
tmpfs                   tmpfs     910M   19M  892M    3% /run
tmpfs                   tmpfs     910M     0  910M    0% /sys/fs/cgroup
/dev/mapper/centos-root xfs        17G   13G  4.2G   76% /
/dev/sda1               xfs      1014M  184M  831M   19% /boot
tmpfs                   tmpfs     182M   12K  182M    1% /run/user/42
tmpfs                   tmpfs     182M     0  182M    0% /run/user/0

【df --exclude-type=xfs -hT】
文件系統       類型      容量  已用  可用 已用% 掛載點
devtmpfs       devtmpfs  894M     0  894M    0% /dev
tmpfs          tmpfs     910M     0  910M    0% /dev/shm
tmpfs          tmpfs     910M   19M  892M    3% /run
tmpfs          tmpfs     910M     0  910M    0% /sys/fs/cgroup
tmpfs          tmpfs     182M   12K  182M    1% /run/user/42
tmpfs          tmpfs     182M     0  182M    0% /run/user/0

 

3、du(顯示文件占用磁盤空間)

(1)基本概念
  顯示指定的目錄或文件所占用的磁盤空間。
  默認為當前目錄。

 

(2)語法規則

【語法:】
    du [options] [file]
    
【options:】
    -a, --all               顯示對所有文件的統計,而不只是包含子目錄。
    -b, --bytes             輸出以字節為單位的大小,替代缺省時1024字節的計數單位。
    -c, --total             在處理完所有參數后給出所有這些參數的總計。即用於統計指定的一組文件或目錄使用的空間的總和。  
    -h, --human-readable    以易讀的方式輸出,帶單位
    -s或--summarize         只顯示指定目錄占用磁盤空間的總和(不與 a 連用)。

 

(3)舉例

【ls -lh】
總用量 11M
drwxr-xr-x. 9 root root 220 3月  19 2021 apache-tomcat-9.0.44
-rw-r--r--. 1 root root 11M 3月  19 2021 apache-tomcat-9.0.44.tar.gz

【du -shc *】
17M     apache-tomcat-9.0.44
11M     apache-tomcat-9.0.44.tar.gz
28M     總用量

 

4、mount(掛載文件系統)

(1)基本概念
  用於掛載文件系統。

 

(2)語法規則

【語法:】
    mount [-lhV]
    mount -a [-frvw] [-t vfstype] [-O optlist]
    mount [-frvw] [-o option[,option]...]  device|dir
    mount [-frvw] [-t vfstype] [-o options] device dir

【options:】
    -a, --all               掛載 /etc/fstab 中的定義的所有文件系統
    -t, --types <列表>      限制文件系統類型集合
    -T, --fstab <路徑>      /etc/fstab 的替代文件
    -v, --verbose           打印當前進行的操作
    -o, --options <列表>    掛載選項列表,以英文逗號分隔
    -f, --fake              模擬 mount 動作,並未真正執行,通常與 -v 連用
    -r, --read-only         以只讀方式掛載文件系統(同 -o ro)
    -w, --rw, --read-write  以讀寫方式掛載文件系統(默認)

 

(3)舉例

【掛載類型為 cifs 的目錄】
    mount -t cifs --verbose -o vers=3.0,sec=ntlmsspi,cred=/home/ec2-user/creds.txt,rsize=130048,wsize=130048,cache=none //172.24.14.0/share /mnt/fsx 
    
【掛載 /etc/fstab 定義的文件系統】
    mount -a
    
【cat /etc/fstab】
/dev/mapper/centos-root                      /                     xfs     defaults        0 0
UUID=2a32db5c-0484-4f80-b574-74fd01ff36e0    /boot                 xfs     defaults        0 0
/dev/mapper/centos-swap                      swap                  swap    defaults        0 0

 

5、top(顯示系統運行情況)

(1)基本概念
  用於分析系統的整體性能,能夠實時顯示系統中各個進程的資源占用情況(類似於 Windows 中的 任務管理器)。

(2)語法規則
  參考:https://www.cnblogs.com/l-y-h/p/12584563.html#_label0_7

(3)關注點

【load average:】
    輸出的第一行,表示系統運行時間、當前用戶數、以及平均負載量(load average)。    
其中:
    load average 三個數分別是 1 分鍾、5 分鍾、15 分鍾的負載情況。    
    其一般與 CPU 以及 內核數有關,數值越小系統占用越小(具體規則沒有研究)。

【%Cpu(s) 中的 id:】
    輸出的第三行,表示用戶 CPU 相關信息。
其中:
    id 表示 idle,為 CPU 空閑率。
注:
    按鍵盤左上角 數字 1 可以展開邏輯 CPU 的運行情況(多核情況下可以看到各個 邏輯 CPU 情況)。
    以 %Cpu0、%Cpu1、%Cpu2、%Cpu3 等形式展示。

【%CPU、%MEM:】
    輸出 PID、USER 的那行,顯示各個進程的相關信息。
其中:    
    PID     表示進程 ID。
    USER    表示進程所屬用戶。
    TIME+   表示進程運行時間(占用 CPU 的時間)。        
    %CPU    表示進程占用 CPU 百分比。
    %MEM    表示進程占用 內存 百分比。
    COMMAND 表示進程名。
    
交互界面常用按鍵:
    Q   退出 top 。(Ctrl + C 也行)
    P   按照 CPU 占用率降序排序(默認, %CPU)。
    M   按照 內存 使用率降序排序(%MEM)。
    N   按照 PID 降序排序(PID)。
    T   按照 占用 CPU 時間排序(TIME+)。

 

 

6、uptime(顯示系統運行時間)

(1)基本概念
  用於分析系統性能,可理解為 top 的簡化版,其就相當於 top 輸出的第一行,用於顯示當前系統的負載情況。

(2)語法規則

【語法:】
    uptime [options]

【options:】
    -p     格式化輸出系統運行時間
    -s     顯示系統啟動時間

(3)舉例

【uptime:】
    16:46:23 up 2 days, 23:41,  1 user,  load average: 0.00, 0.01, 0.05
    
【uptime -s:】
    2021-12-14 17:05:10

【uptime -p:】
    up 2 days, 23 hours, 41 minutes

 

7、vmstat(內存監測,顯示虛擬內存統計信息)

(1)基本概念
  Virtual Meomory Statistics(虛擬內存統計)的縮寫,用來監控 CPU 使用、內存使用、IO 讀寫以及虛擬內存交換等信息(查看整個機器的使用情況而非各個進程使用情況,與 top 稍有區別)。
  該信息可用於分析系統瓶頸。

(2)語法規則

【語法:】
    vmstat [options] [delay [count]]
注:
    delay 表示時間間隔(秒)
    count 表示次數
比如: 
    vmstat 2 3    表示 每隔 2 秒 輸出一次,共輸出 3 次。

【options:】
    -t     輸出時間戳
    -w     更寬的顯示輸出內容
    -s     顯示統計信息
    -d     顯示磁盤情況
    
【輸出信息:】
Procs
    r: 表示等待運行的進程數。這個值如果長期大於系統CPU個數,就說明CPU資源不足,可以考慮增加CPU。
    b: 表示在等待資源的進程數(阻塞狀態)。比如:正在等待I/O或者內存交換等。
Memory
    swpd: 虛擬內存使用情況,單位:KB
    free: 空閑的內存(free memory),單位KB
    buff: 被用來做為緩存的內存數(buffer memory),單位:KB
    cache: 用於文件緩存(swap cache),單位:KB
Swap
    si: 從磁盤交換到內存的交換頁數量,單位:KB/秒
    so: 從內存交換到磁盤的交換頁數量,單位:KB/秒  
    一般情況下,si、so 的值都為0,如果 si、so 的值長期不為 0,則表示系統內存不足,需要考慮是否增加系統內存 。
IO
    bi: 表示從塊設備讀入的數據總量(即讀磁盤,塊/秒)
    bo: 表示寫入到塊設備的數據總量(即寫磁盤,塊/秒)
    默認塊大小為 1024 KB。bi 和 bo 一般都要接近 0,不然就是 IO 過於頻繁,需要調整。
System
    in: 每秒的中斷數,包括時鍾中斷
    cs: 每秒的環境(上下文)切換次數
    in、cs 值越大,內核消耗的 CPU 時間就越多。
CPU
    us: 顯示了用戶進程消耗 CPU 的時間百分比。us 的值比較高時,說明用戶進程消耗的 CPU 時間多。如果長期大於 50%,需要考慮優化用戶進程。
    sy: 顯示了內核進程消耗 CPU 的時間百分比。sy 的值比較高時,就說明內核消耗的 CPU 時間多。如果 us+sy 超過 80%,需要考慮增加 CPU。
    id: CPU 閑置時間百分比
    wa: 表示 IO 等待所占的 CPU 時間百分比。wa 值越高,說明 IO 等待越嚴重。如果 wa 值超過 20%,說明 IO 等待嚴重 

 

(3)舉例

【vmstat -t 2 3:】
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu----- -----timestamp-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st                 CST
 1  0  73728 269416      4 973384    0    0     8     9   14   21  0  0 100  0  0 2021-12-17 17:07:48
 0  0  73728 269400      4 973384    0    0     0     0   49   68  0  0 100  0  0 2021-12-17 17:07:50
 0  0  73728 269400      4 973384    0    0     0     0   35   57  0  0 100  0  0 2021-12-17 17:07:52

 

8、iostat(磁盤 IO 監測)

(1)基本概念
  用於輸出 CPU、磁盤 IO 等統計信息。

(2)語法規則

【語法:】
    iostat [options] [delay [count]]
注:
    delay 表示時間間隔(秒)
    count 表示次數
比如: 
    iostat 2 3    表示 每隔 2 秒 輸出一次,共輸出 3 次。

【options:】
    -c       顯示 CPU 情況
    -d       顯示磁盤 I/O 情況
    -x       顯示拓展信息。
    -k       單位為 KB/S
    -m       單位為 MB/S

【輸出:】
avg-cpu:
    %user     顯示了用戶進程消耗 CPU 的時間百分比。
    %system   顯示了內核進程消耗 CPU 的時間百分比。
    %idle     顯示了 CPU 閑置時間百分比。
    %iowait   顯示了 CPU 等待完成磁盤 I/O 的百分比。

Device: 
    rrqm/s    每秒進行 merge 到 device 的讀操作數目
    wrqm/s    每秒進行 merge 到 device 的寫操作數目
    r/s       每秒 merge 完成的讀 I/O 次數
    w/s       每秒 merge 完成的寫 I/O 次數
    %util     I/O 操作的百分比,值接近 100% 時,則表示 I/O 請求飽和(達到瓶頸)。

 

(3)舉例

【iostat -xcdk 2 2:】
Linux 3.10.0-1160.42.2.el7.x86_64 (localhost.localdomain)       2021年12月17日  _x86_64_        (4 CPU)

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.06    0.00    0.06    0.03    0.00   99.86

Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
sda               0.00     0.14    0.90    0.33    30.87    36.15   109.06     0.05   43.57   31.85   75.63   1.60   0.20
scd0              0.00     0.00    0.00    0.00     0.00     0.00   114.22     0.00   23.89   23.89    0.00  22.94   0.00
dm-0              0.00     0.00    0.89    0.39    30.72    35.83   103.68     0.07   51.31   32.40   93.88   1.49   0.19
dm-1              0.00     0.00    0.01    0.08     0.03     0.31     8.17     0.00   54.10    5.83   58.16   2.44   0.02

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.00    0.00    0.00    0.00    0.00  100.00

Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
sda               0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
scd0              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
dm-0              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
dm-1              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00

 

9、mpstat(CPU 監測)

(1)基本概念
  用於輸出 CPU 的統計信息。

(2)語法規則

【語法:】
    mpstat [options] [delay [count]]
注:
    delay 表示時間間隔(秒)
    count 表示次數
比如: 
    mpstat 2 3    表示 每隔 2 秒 輸出一次,共輸出 3 次。

【options:】
    -A       顯示所有 CPU 情況

【輸出:】
    %user     顯示了用戶進程消耗 CPU 的時間百分比。
    %sys      顯示了內核進程消耗 CPU 的時間百分比。
    %idle     顯示了 CPU 閑置時間百分比。
    %iowait   顯示了 CPU 等待完成磁盤 I/O 的百分比。
    %soft     軟中斷時間百分比
    %irq      硬中斷時間百分比

 

(3)舉例

【mpstat 2 3:】
Linux 3.10.0-1160.42.2.el7.x86_64 (localhost.localdomain)       2021年12月17日  _x86_64_        (4 CPU)

18時21分07秒  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
18時21分09秒  all    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
18時21分11秒  all    0.12    0.00    0.12    0.00    0.00    0.00    0.00    0.00    0.00   99.75
18時21分13秒  all    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
平均時間:  all    0.04    0.00    0.04    0.00    0.00    0.00    0.00    0.00    0.00   99.92

 

四、其他命令

1、nohup(后台運行程序)

(1)基本概念
  nohup 即 no hang up(不掛起),即使關閉連接終端也不會終止程序的運行。
  默認情況下,會在當前目錄下生成一個名為 nohup.out 的文件。

 

(2)語法規則

【語法規則:】
    nohup Command [ & ]
注:
    Command   為要執行的命令
    &         表示命令在后台執行,終端退出后命令仍舊執行。
    nohup 與 & 連用,可以讓程序在后台執行,且退出用戶終端也不會停止。

 

(3)舉例

【后台啟動 helloworld.jar 】
    nohup java -jar helloworld.jar &

【要殺死進程:】
    ps -aux | grep "helloworld"   # 先找到后台進程
    kill -9 PID                   # 再根據進程號殺死進程

 

2、wget(網絡文件下載工具)

(1)基本概念
  wget 是一款非交互式的網絡文件下載工具。

 

(2)安裝

【centos7:】
    yum install -y wget

 

(3)語法規則

【語法:】
    wget [options] [url]

【options:】
    -r,  --recursive    遞歸下載
    -q,  --quiet        安靜下載,無信息輸出
    -v,  --verbose      輸出詳細信息(默認)
注:
    通過 wget --help 可以查看詳細描述,此處省略

 

(4)舉例

【獲取 git 數據】
    wget https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip

 

3、curl(發送請求、下載文件)

(1)基本概念
  curl 一般用於向服務器發送請求,默認發送 Get 請求。
  當與 -o 或 -O 參數連用時,可以用於下載文件。

 

(2)安裝

【centos7:】
    yum install -y curl

 

(3)語法規則

【語法:】
    curl [options] [url]

【options:】
    -b xxx       向服務器發送 cookie 數據   
    -c xxx       將服務器返回的 cookie 數據寫入本地文件
    -d xxx       發送 POST 的數據體,可以省略 -X POST
    -o xxx       將服務器回應保存為文件,功能等同於 wget
    -O           無需指定文件名,默認使用 URL 最后部分作為文件名
注:
    通過 man curl 或者 curl --help 可以查看詳細描述,此處省略

 

(4)舉例

【向服務器發送 cookie 數據】
    curl -b 'foo1=bar;foo2=bar2' https://www.baidu.com/
    curl -b cookies.txt https://www.baidu.com/
    
【將服務器返回的 cookie 數據寫入文件】
    curl -c cookies.txt https://www.baidu.com/
    
【向服務器發送 POST 數據體】
    curl -d'login=emma&password=123'-X POST https://baidu.com

【將回應數據保存在 test 中】
    curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
    
【默認文件名為 blog.git】
    curl -O "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip"

 

五、設置開機自動啟動腳本(CentOS7)

1、方式一:crontab 定時任務

  crontab 開機自啟動,通過 crontab 執行命令,可以間接的實現 開機自啟動腳本。
  crontab 用法見 https://www.cnblogs.com/l-y-h/p/15379861.html#_label0_0

 

2、方式二:修改腳本 (/etc/rc.local、/etc/rc.d/rc.local)

(1)基本認識
  /etc/rc.local 是 /etc/rc.d/rc.local 的軟連接,linux 機器重啟的時候會去加載 這個文件。
  將待執行的命令 寫入 /etc/rc.d/rc.local 文件中,並給其可執行權限(默認沒有執行權限)。
  chomd +x /etc/rc.d/rc.local
  重啟機器后會加載 /etc/rc.d/rc.local 中的命令。

(2)cat /etc/rc.d/rc.local

#!/bin/bash
# THIS FILE IS ADDED FOR COMPATIBILITY PURPOSES
#
# It is highly advisable to create own systemd services or udev rules
# to run scripts during boot instead of using this file.
#
# In contrast to previous versions due to parallel execution during boot
# this script will NOT be run after all other services.
#
# Please note that you must run 'chmod +x /etc/rc.d/rc.local' to ensure
# that this script will be executed during boot.

touch /var/lock/subsys/local

 

3、方式三:注冊系統服務(chkconfig)

(1)基本認識

【linux 系統啟動級別:】
    級別有0-6共7個級別。
  運行級別0:系統關機狀態,默認級別不能設為 0,否則不能正常啟動(一啟動就關機)。
  運行級別1:單用戶工作狀態,用於系統維護、找回 root 密碼等,禁止遠程登錄,只能在當前計算機上操作。
  運行級別2:多用戶狀態(無網絡服務)。
  運行級別3:多用戶狀態(有網絡服務)。
  運行級別4:作為保留級別,未使用。
  運行級別5:圖形界面狀態。
  運行級別6:系統重啟狀態,默認級別不能設為 6,否則不能正常啟動(一啟動就重啟)。

【chkconfig:】
    chkconfig 用於更新和查詢系統服務的運行級別信息。
    chkconfig 提供了一個簡單的命令行工具,用於維護 /etc/rc[0-6].d 目錄層次結構,免除了系統管理員直接操作這些系統中大量符號鏈接的任務目錄。
    chkconfig 不是立即自動禁止或激活一個服務,它只是簡單的改變了符號連接。

 

(2)語法規則

【語法:】
    chkconfig [--list] [--type <type>] [name]
    chkconfig --add <name>
    chkconfig --del <name>
    chkconfig --override <name>
    chkconfig [--level <levels>] [--type <type>] <name> <on|off|reset|resetpriorities>

【參數說明:】
    -–add  增加所指定的系統服務,讓 chkconfig 指令得以管理它,並同時在系統啟動的敘述文件內增加相關數據。
    -–del  刪除所指定的系統服務,不再由 chkconfig 指令管理,並同時在系統啟動的敘述文件內刪除相關數據。
    -–level 指定系統級別(0-6),表示服務在哪個級別啟動、關閉。
    --list 列出服務信息。
          
【on、off、reset 說明:】
    如果在服務名后面指定了 on,off 或者 reset,那么 chkconfig 會改變指定服務的啟動信息。
    on 和 off 分別指服務被啟動和停止,reset 指重置服務的啟動信息。
    對於 on 和 off,系統默認只對運行級 2,3,4,5 有效。reset 對所有級別均有效。

 

(3)如何新增一個服務

【步驟:】
    Step1:服務腳本必須存放在/etc/init.d/目錄下。編輯腳本。
    Step2:使用 chkconfig --add 添加服務。

注:
    假設服務名為myservice,
    當我們運行添加服務的命令時候,會出現 "service myservice does not support chkconfig"。
    一般在腳本開頭加入 "#chkconfig: 2345 10 90" 即可:
其中:
    2345 是系統啟動級別,10是啟動優先級,90是停止優先級,優先級范圍是0-100,數字越大,優先級越低。
    執行 --add 后,會在 /etc/rc[0-6].d 中創建軟鏈接。

 

(4)舉例:

【chkconfig --list】
netconsole      0:關    1:關    2:關    3:關    4:關    5:關    6:關
network         0:關    1:關    2:開    3:開    4:開    5:開    6:關

【vi /etc/init.d/autoStartUp.sh】
#!/bin/bash
# chkconfig: 2345 20 90
# description: autoStartUp

【chkconfig --add /etc/init.d/autoStartUp.sh】

【ls -lh /etc/rc0.d/ /etc/rc2.d/】
/etc/rc0.d/:
總用量 0
lrwxrwxrwx. 1 root root 20 10月  8 21:42 K50netconsole -> ../init.d/netconsole
lrwxrwxrwx. 1 root root 24 10月 11 22:11 K90autoStartUp.sh -> ../init.d/autoStartUp.sh
lrwxrwxrwx. 1 root root 17 10月  8 21:42 K90network -> ../init.d/network

/etc/rc2.d/:
總用量 0
lrwxrwxrwx. 1 root root 20 10月  8 21:42 K50netconsole -> ../init.d/netconsole
lrwxrwxrwx. 1 root root 17 10月  8 21:42 S10network -> ../init.d/network
lrwxrwxrwx. 1 root root 24 10月 11 22:11 S20autoStartUp.sh -> ../init.d/autoStartUp.sh

【chkconfig --list】
autoStartUp.sh  0:關    1:關    2:開    3:開    4:開    5:開    6:關
netconsole      0:關    1:關    2:關    3:關    4:關    5:關    6:關
network         0:關    1:關    2:開    3:開    4:開    5:開    6:關

【chkconfig --del /etc/init.d/autoStartUp.sh】
netconsole      0:關    1:關    2:關    3:關    4:關    5:關    6:關
network         0:關    1:關    2:開    3:開    4:開    5:開    6:關

 

4、方式四:注冊系統服務(systemctl )

(1)基本認識

【systemd 與 systemctl】
    systemctl 是 CentOS7 采用的 用於 Linux 啟動處理和系統管理的機制,可以理解為 systemd 的管理工具。
    systemd 是 CentOS7 完成引導程序進入操作系統后啟動的第一個進程。可用於管理 服務 的啟動順序。
    chkconfig 是 CentOS6 使用的。

【linux 啟動流程】
    在電源打開時啟動 BIOS
    從 BIOS 調用引導加載程序
    引導加載程序引導 Linux 內核
    Linux 內核啟動 init 進程 (PID 1)
    Systemd 是 init 進程。

 

(2)語法規則

【語法:】
    systemctl [OPTIONS...] [COMMAND]
    
【options:】
    list-unit-files    列出所有可用單元
    list-units         列出所有運行中的單元
    list-unit-files --type=service    列出指定類型的單元
    enable、disable    開啟、禁用 服務
    status/start/restart/stop    查看、啟動、重啟、關閉 服務
    daemon-reload      重新加載 systemd 管理器配置
    
【常用命令:】
    systemctl list-unit-files
    systemctl list-units
    systemctl list-unit-files --type=mount
    systemctl enable/disable xxx
    systemctl status/start/restart/stop xxx
    systemctl daemon-reload

 

(3)如何新增一個服務

【步驟:】
    Step1:服務腳本必須存放在 /etc/systemd/system 目錄下。
    Step2:創建后綴名為[.service]的文件,並進行編輯。
    Step3:使用 systemctl daemon-reload 重新加載 systemd 管理器配置。
注意:
    xx.service 有具體格式寫法,不能亂寫。

【xx.service 文件格式說明:】
[Unit]
    Description: 描述Unit的說明和依賴關系等
    Before:此服務啟動於右側配置的組件之前
    After:此服務啟動於右側配置的組件之后    

[Service]
    Type: 服務過程啟動完成的判定方法(默認為simple)
    PIDFile: 主進程PID文件
    KillSignal: Systemctl stop命令發送哪個信號
    TimeoutStopSec: 在停止結束前待機的時間
    
    ExecStart: 服務的啟動命令 
    ExexReload: 服務的重載命令
    ExecStop: 服務的停止命令
    ExecStartPre: 服務啟動前的附加命令
    ExecStartPost: 服務啟動后的附加命令
    ExecStopPost: 服務停止后執行的命令
    Restart: 服務進程停止時的重啟條件
    PrivateTmp: 是否准備 /tmp 和 /var/tmp 專用於這個服務
    KillMode: 如何使用未停止的進程

[Install]
    WantedBy: 啟用時在此單元的 .wants 目錄中創建鏈接
    Requiredby: 啟用時在此單元的 .required 目錄中創建鏈接
    
【注意:(獲取環境變量)】
    systemd 的執行時不會加載用戶 Shell 里的環境變量,如果需要從環境變量中取值,需要 service 中配置 Environment。
    Environment=
    EnvironmentFile=
    
【注意:(Type=forking)】
    Type 指定了在 ExecStart 中指定的命令啟動服務進程時如何判斷啟動完成。
例如: 
    對於在 foie gras 中繼續運行的命令,
    使用 Type = simple, 表示執行命令時,判斷啟動完成。

或者:
    fork子進程並把它放在后台,如果第一個命令本身就是結束的類型,
    設置 Type = forking, 在這種情況下,當執行的命令完成時,判斷啟動完成。

 

(4)舉例

【vi /etc/systemd/system/test.service】
[Unit]
Description=Test Service Server
After=network.target remote-fs.target nss-lookup.target

[Service]
Type=simple
PIDFile=/run/nginx.pid
ExecStartPre=/usr/bin/rm -f /run/nginx.pid
ExecStart=/usr/sbin/nginx
ExecReload=/bin/kill -s HUP $MAINPID
KillSignal=SIGQUIT
TimeoutStopSec=5
Restart=always
WorkingDirectory=/usr/local/test
ExecStart=/usr/local/test/test.sh
KillMode=process

[Install]
WantedBy=multi-user.target

【systemctl daemon-reload】

【systemctl list-unit-files | grep test】
test.service                                  disabled

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM