《前端運維》一、Linux基礎--10定時任務

Zaking發表於2022-03-23

一、程式管理

程式(Process)是計算機中的程式關於某資料集合上的一次執行活動,是系統進行資源分配和排程的基本單位,是作業系統結構的基礎。在早期面向程式設計的計算機結構中,程式是程式的基本執行實體;在當代面向執行緒設計的計算機結構中,程式是執行緒的容器。程式是指令、資料及其組織形式的描述,程式是程式的實體。以上這段話來自百度百科

簡單來說哈,程式就是執行一段程式碼的實體。在linux中,我們可以通過命令來檢視系統中所有的程式、判斷伺服器的狀態、殺死程式等等。下面我們來看一下相關的命令都有哪些。

1、ps

該命令用來顯示當前程式的狀態,類似於Windows的工作管理員。它的選項非常多,這裡僅簡單說下常用的選項:

  • -A,顯示所有程式
  • -w,顯示加寬,可以顯示更多的資訊
  • -au,顯示較詳細的資訊
  • -aux,顯示所有包含其他使用者的行程

然後呢,我們來看下-au(x)命令下顯示資訊欄位的含義:

資料含義
USER 該程式是由哪個使用者建立的
PID 程式的ID號
%CPU 該程式佔用CPU資源的百分比,佔用越高說明越消耗系統資源
%MEM 該程式佔用實體記憶體的百分比,佔用越高說明越消耗系統資源
VSZ 該程式佔用虛擬記憶體的百分比,單位是KB
RSS 該程式佔用實際實體記憶體大小,單位是KB
TTY 該程式在哪個終端中執行。tty1~tty7表示本地控制終端,tty1~tty6是字元終端,tty7是圖形終端。pts/0~255代表虛擬終端,?表示此終端是系統啟動的
STAT 程式狀態
START 該程式的啟動時間
TIME 該程式佔用CPU的運算時間,數值越高說明越消耗系統資源
COMMAND 產生此程式的命令名

其中STAT程式狀態對應的欄位含義是:

  • D: 無法中斷的休眠狀態 (通常 IO 的程式)
  • R: 正在執行中
  • S: 靜止狀態
  • T: 暫停執行
  • Z: 不存在但暫時無法消除
  • W: 沒有足夠的記憶體分頁可分配
  • <: 高優先序的行程
  • N: 低優先序的行程
  • L: 有記憶體分頁分配並鎖在記憶體內 (實時系統或捱A I/O)

2、pstree

 將所有行程以樹狀圖顯示,樹狀圖將會以 pid (如果有指定) 或是以 init 這個基本行程為根 (root),如果有指定使用者 id,則樹狀圖會只顯示該使用者所擁有的行程,常用選項如下:

  1. -u,顯示使用者名稱稱
  2. -p,顯示程式pid

3、top

該命令用於實時顯示process的動態。常用選項如下:

  • -d : 改變顯示的更新速度,或是在交談式指令列( interactive command)按 s
  • -q : 沒有任何延遲的顯示速度,如果使用者是有 superuser 的許可權,則 top 將會以最高的優先序執行
  • -c : 切換顯示模式,共有兩種模式,一是隻顯示執行檔的名稱,另一種是顯示完整的路徑與名稱
  • -S : 累積模式,會將己完成或消失的子行程 ( dead child process ) 的 CPU time 累積起來
  • -s : 安全模式,將交談式指令取消, 避免潛在的危機
  • -i : 不顯示任何閒置 (idle) 或無用 (zombie) 的行程
  • -n : 更新的次數,完成後將會退出 top
  • -b : 批次檔模式,搭配 "n" 引數一起使用,可以用來將 top 的結果輸出到檔案內

直接執行top命令顯示如下資訊:

 

 

 解釋下資訊的內容:

第一行是任務佇列資訊。

內容說明
12:12:12 系統的當前時間
up 1 day 5:33 系統的執行時間,本機已經執行了1天5小時33分
2 users 當前登入了二個客戶端
load average 0 0 0 系統在之前1分鐘、5分鐘、15分鐘的平均負載。一般認為小於1小時負載較小,大於1超過負載

第二行是行為程式資訊。

內容說明
Tasks: 100 total 系統中的程式總數
1 running 正在執行的程式數
94 sleeping 睡眠的程式
0 stopped 正在停止的程式
0 zombie 殭屍程式。如果不是0的話要進行檢查

第三行是行為CPU資訊。

%Cpu(s): 0.1us 使用者模式佔用的CPU百分比
0.1sy 系統模式佔用的CPU百分比
0.0ni 改變過優先順序的使用者程式 佔用的CPU百分比
99.7id 空閒CPU的CPU百分比
0.1wa 等待輸入/輸出的程式的佔用CPU百分比
0.1hi 硬中斷請求服務佔用的CPU百分比
0.1si 軟中斷請求服務佔用的CPU百分比
0.0st st(Steal time)虛擬時間百分比,就是當有

第四行是行為實體記憶體資訊。

內容說明
Mem: 1030720k total 實體記憶體的問題,單位是KB
551860k used 已經使用的實體記憶體數量
478860k free 空閒的實體記憶體數量,虛擬機器分配了1024M記憶體,使用了538M,空閒467M
43180k buffers 作為緩衝的記憶體數量,可以存放需要寫入硬碟的資料,用來加速資料的寫入

第五行為交換分割槽資訊。

內容說明
Swap: 2047992k total 總計的交換分割槽(虛擬記憶體)大小
536k used 已經使用的交換分割槽大小
2047456k free 空閒的交換分割槽大小
368164k cached 把需要經常讀取的資料從硬碟讀到記憶體中,加速了資料的讀取

另外我們需要學習的就是一些互動式命令:

選項含義
?或h 顯示互動模式的幫助
P 按CPU使用率排序,預設就是此選項
M 以記憶體的使用率排序
N 以PID排序
q 退出top

4、kill

該命令用於刪除執行中的程式或工作。kill 可將指定的資訊送至程式。預設的資訊為 SIGTERM(15),可將指定程式終止。若仍無法終止該程式,可使用 SIGKILL(9) 資訊嘗試強制刪除程式。程式或工作的編號可利用 ps 指令或 jobs 指令檢視。常用選項如下:

  • -l <資訊編號>  若不加<資訊編號>選項,則 -l 引數會列出全部的資訊名稱。
  • -s <資訊名稱或編號>  指定要送出的資訊。
  • [程式]  [程式]可以是程式的PID或是PGID,也可以是工作編號。

常用的資訊編號如下:

  • 1 (HUP):重新載入程式。
  • 9 (KILL):殺死一個程式。
  • 15 (TERM):正常停止一個程式。

下面我們來看一個小栗子:

我們建立一個sh檔案,並將它儲存在/demo下,檔案的內容如下:

#!/bin/bash

i=0
while [ $i -le 1000 ]
 do
   echo $(date)
   sleep 1s
 done

很簡單,就是迴圈執行1000次,列印當前日期。然後我們重新開個視窗來執行這段指令碼。然後他就一直列印了:

 

 

 我們來殺死他,殺死他之前需要知道他的資訊編號,我們來看下:

第一種方法是這樣執行指令碼:

 

 

 它會列印資訊編號後再執行。於是我們就可以:

 

 

 然後,另一個視窗執行的程式碼就停止了。

另一種查詢的方法是這樣的:

 

 

 也可以查到資訊編號。好了,小栗子就到這裡,我們繼續往下學習。

二、系統資源檢視

1、vmstat

監控系統資源使用狀態,vmstat [重新整理延時] [重新整理次數]。比如vmstat 1 3。就是每秒重新整理一次,重新整理三次後停止。

 

 

 其中欄位的含義如下:

1)procs:程式資訊欄位

分類引數含義
procs r 等待執行的程式數,數量越大,系統就越繁忙
procs b 不可被喚醒的程式數量,數量越大,系統越繁忙

2)memory:記憶體資訊欄位

分類引數含義
memory swpd 使用的Swap空間的大小,單位KB
memory free 空閒的記憶體容量,單位KB
memory buff 緩衝的記憶體容量,單位KB
memory cache 快取的記憶體容量,單位KB

3)swap:交換分割槽欄位,如果說si和so數越大說明資料經常要在磁碟和記憶體之間資料交換,系統效能就會越差

分類引數含義
swap si(in) 從磁碟中交換到記憶體中的資料的數量,單位KB
swap so(out) 從記憶體中交換到硬碟中的資料的數量,單位KB

4)io:磁碟讀寫,bi和bo數越大,說明磁碟的I/O越繁忙。

分類引數含義
io bi(in) 從塊裝置讀入資料的問題,單位是塊
io bo(out) 寫到塊裝置的資料的總量,單位是塊

5)system:系統資訊欄位,in和cs數越大說明系統與介面裝置的通訊越頻繁。

分類引數含義
system in(interrupt) 每秒被中斷的程式次數
system cs(switch) 每秒鐘進行的事件切換次數

6)CPU:CPU資訊欄位

分類引數含義
CPU us(user) 非核心程式消耗CPU運算時間的百分比
CPU sy(system) 核心程式消耗CPU運算時間的百分比
CPU id(idea) 空閒CPU的百分比
CPU wa(wait) 等待I/O所消耗的CPU百分比
CPU st(steal) 被虛擬機器偷走的CPU百分比

2、free

該命令用於顯示記憶體狀態。free指令會顯示記憶體的使用情況,包括實體記憶體,虛擬的交換檔案記憶體,共享記憶體區段,以及系統核心使用的緩衝區等。常用選項如下:

  • -b, 以位元組為單位
  • -k ,以KB位元組為單位
  • -m ,以MB位元組為單位
  • -g ,以GB位元組為單位
  • -h ,以合適的單位顯示記憶體使用情況,最大為三位數,自動計算對應的單位值。單位有:B = bytes,K = kilos,M = megas,G = gigas,T = teras
  • -o ,不顯示緩衝區調節列。
  • -s <間隔秒數> ,持續觀察記憶體使用狀況。
  • -t ,記憶體總和列。
  • -V ,顯示版本資訊。

比如我們試一下free -m命令,顯示如下:

 

 

 3、uname

用來檢視核心相關資訊,常用選項如下:

  • -a或--all  顯示全部的資訊。
  • -m或--machine  顯示電腦型別。
  • -n或--nodename  顯示在網路上的主機名稱。
  • -r或--release  顯示作業系統的發行編號。
  • -s或--sysname  顯示作業系統名稱。
  • -v  顯示作業系統的版本。
  • --help  顯示幫助。
  • --version  顯示版本資訊。

4、file 

該指令用於辨識檔案型別。常用選項如下:

  • -b  列出辨識結果時,不顯示檔名稱。
  • -c  詳細顯示指令執行過程,便於排錯或分析程式執行的情形。
  • -f<名稱檔案>  指定名稱檔案,其內容有一個或多個檔名稱時,讓file依序辨識這些檔案,格式為每列一個檔名稱。
  • -L  直接顯示符號連線所指向的檔案的類別。
  • -m<魔法數字檔案>  指定魔法數字檔案。
  • -v  顯示版本資訊。
  • -z  嘗試去解讀壓縮檔案的內容。
  • [檔案或目錄...] 要確定型別的檔案列表,多個檔案之間使用空格分開,可以使用shell萬用字元匹配多個檔案。

通過file命令,可以檢視/bin/ls來檢視作業系統位數。

5、其他

可以通過lsb_release -a命令檢視發行版本。可以通過lsb_release -v命令檢視發行版本。

三、定時任務

1、crontab

該命令可以用來定期執行程式。當安裝完成作業系統之後,預設便會啟動此任務排程命令。crond 命令每分鍾會定期檢查是否有要執行的工作,如果有要執行的工作便會自動執行該工作。

注意:新建立的 cron 任務,不會馬上執行,至少要過 2 分鐘後才可以,當然你可以重啟 cron 來馬上執行。而 linux 任務排程的工作主要分為以下兩類:

  • 1、系統執行的工作:系統週期性所要執行的工作,如備份系統資料、清理快取
  • 2、個人執行的工作:某個使用者定期要做的工作,例如每隔10分鐘檢查郵件伺服器是否有新信,這些工作可由每個使用者自行設定

可以通過下面的命令重啟cron:

systemctl restart crond.service

然後可以通過ps -ef | grep crond來檢視是否啟動了crond:

 

 

crontab命令常用的選項如下:

  • -e : 執行文字編輯器來設定時程表,內定的文字編輯器是 VI,如果你想用別的文字編輯器,則請先設定 VISUAL 環境變數來指定使用那個文字編輯器(比如說 setenv VISUAL joe)
  • -r : 刪除目前的時程表
  • -l : 列出目前的時程表

說明:

crontab 是用來讓使用者在固定時間或固定間隔執行程式之用,換句話說,也就是類似使用者的時程表。

-u user 是指設定指定 user 的時程表,這個前提是你必須要有其許可權(比如說是 root)才能夠指定他人的時程表。如果不使用 -u user 的話,就是表示設定自己的時程表。

crontab的語法如下:

crontab [ -u user ] file
# 或者
crontab [ -u user ] { -l | -r | -e }

 迴圈任務還有時間格式,如下:

f1 f2 f3 f4 f5 program
  • 其中 f1 是表示分鐘,f2 表示小時,f3 表示一個月份中的第幾日,f4 表示月份,f5 表示一個星期中的第幾天。program 表示要執行的程式。
  • 當 f1 為 * 時表示每分鐘都要執行 program,f2 為 * 時表示每小時都要執行程式,其餘類推
  • 當 f1 為 a-b 時表示從第 a 分鐘到第 b 分鐘這段時間內要執行,f2 為 a-b 時表示從第 a 到第 b 小時都要執行,其餘類推
  • 當 f1 為 */n 時表示每 n 分鐘個時間間隔執行一次,f2 為 */n 表示每 n 小時個時間間隔執行一次,其餘類推
  • 當 f1 為 a, b, c,... 時表示第 a, b, c,... 分鐘要執行,f2 為 a, b, c,... 時表示第 a, b, c...個小時要執行,其餘類推
*    *    *    *    *
-    -    -    -    -
|    |    |    |    |
|    |    |    |    +----- 星期中星期幾 (0 - 6) (星期天 為0)
|    |    |    +---------- 月份 (1 - 12) 
|    |    +--------------- 一個月中的第幾天 (1 - 31)
|    +-------------------- 小時 (0 - 23)
+------------------------- 分鐘 (0 - 59)

額外的,表示時間還有些特殊符號,我們要注意一下:

符號含義例子
* 代表任意時間 比如第一個星就代表一個小時中每分鐘都執行一次
, 代表不連續的時間 比如"1,2,3 ",就代表每小時的1分、2分、3分執行命令
- 代表連續的時間範圍 比如 " 1-5 * ** ",代表每小時的第1分到第5分執行命令
*/n 代表每隔多久執行一次 比如 "/10 " 就代表每隔10分鐘就執行一次命令
0 0 1,10 * 1 每月1號和10號,每週1的0點0分都會執行

僅僅羅列語法有點模糊,我們來看個例子吧:

首先,我們通過定時任務的編輯模式命令,編輯一個定時任務:

crontab -e

然後再vi的指令模式下點選鍵盤的i,這個就不多說了,在vi的那一章有詳細的講,然後我們編輯一個定時任務:

* * * * * echo `date` >> /root/date.log

什麼意思呢,就是每分鐘列印日期並輸入到date.log檔案中。要注意,定時任務中的時間最小單位是分鐘,最大單位是天,另外,無論是寫命令還是指令碼都需要使用絕對路徑。額外要說明的是:

  • crontab -e是使用者執行的命令,不同的使用者身份可以執行自己的定時任務
  • 如果需要系統執行定時任務,可以編輯/etc/crontab檔案
  • /etc/crontab可以指定shell、路徑、郵件傳送和家目錄

我們繼續上面的例子:

寫完定時任務後,我們儲存並推出退出。然後就會出現如下的提示:

 

 即,安裝了新的定時任務。另外,我們也可以通過crontab -l命令檢視當前的定時任務:

 

 然後呢,我們看看date.log檔案:

 

 發現任務確實是在跑的。就讓它先跑著吧...。

四、定時任務實戰

還記得之前我們安裝了nginx、mysql等工具,下面我們通過這章的學習內容,來監控下各工具的執行狀態。

1、監控nginx狀態

監控的程式碼如下:

#!/bin/bash
#設定本地變數
#變數nginx的結果是查詢nginx的程式,不包含grep自身
nginx=`ps -ef |grep /user/sbin/nginx|grep -v grep|wc -l`
# 然後下面的意思大家都懂了吧,不懂就回頭複習一遍
 if [ $nginx -gt 2 ];then
    echo "your nginx is running"
    exit 0
 else
    echo "your nginx is ready to  rerunning"
    /bin/systemctl start nginx.service
    exit 1
fi

然後我們跑一下這個命令試一下,還是之前demo的位置,這個位置其實無所謂,就是你放置指令碼的位置就對了:

 

 然後,我們可以:

curl http://localhost

就可以看到了結果了。欸?你這是手動的啊,也沒定時啊。沒錯。但是,我們可以把命令按照前面的例子加進去就可以了,這裡不再演示,大家要自己動手了哦。

2、監控mysql狀態

這回大家都知道怎麼用了吧,這回僅展示下定時任務的指令碼,別的就不說啦:

#!/bin/bash
PortNum=`netstat -lnt|grep 3306|wc -l`
if [ $PortNum -gt 0 ]
then
 echo "mysqld is running."
else
 echo "mysqld is stoped."
fi

3、mysql備份

#!/bin/bash
DATE=$(date +%F_%H-%M-%S)
HOST=127.0.0.1
DB=test
USER=root
PASS=abcd1#EFG
MAIL="83687401@qq.com"
BACKUP_DIR=/data/db_backup
if [ ! -d "$BACKUP_DIR" ];then
 mkdir -p $BACKUP_DIR
fi
SQL_FILE=${DB}_FULL_$DATE.sql
BAK_FILE=${DB}_FULL_$DATE.zip
cd $BACKUP_DIR
if mysqldump -h$HOST -u$USER -p$PASS -B $DB > $SQL_FILE; then
  zip $BAK_FILE $SQL_FILE && rm -rf $SQL_FILE
  if [ ! -s $BAK_FILE ]; then
    echo "$DATE 備份失敗" | mail -s "備份失敗" $MAIL
  fi
else
  echo "$DATE 備份失敗" | mail -s "備份失敗" $MAIL
fi
find $BACKUP_DIR -name '*.zip' -ctime +14 -exec rm {} \;

到此這篇文章就結束了哦。

 

相關文章