程序員必知必會的 Linux系列 —— 系統篇

1. 進程管理

1.1 進程

  • 進程是正在執行的一個程序或命令,每個進程都是一個運行的實體,都有本身的地址空間而且會佔用必定的系統資源
  • 進程能夠理解爲正在執行的某個程序

1.2 進程管理簡介

  • 判斷服務器的狀態
  • 查看系統中的全部進程
  • 殺死進程,只有沒法關閉纔要殺死進程

1.3 進程的查看命令(ps)

  • ps aux 查看系統中全部進程,使用BSD操做系統格式
  • ps -le 查看系統中全部進程,使用Linux標準格式
  • TTY是TeleType的一個縮寫,原來指的是電傳打字機,是經過串行線用打印機鍵盤經過閱讀和發送信息的東西
  • pts(pseudo['su:doʊ]-terminal slave)是所謂的僞終端或虛擬終端

1.3.1 選項

參數 含義
-a 顯示一個終端的全部進程
-u 顯示進程的歸屬用戶及內存的使用狀況
-x 顯示沒有控制終端的進程
-l 長格式顯示,顯示更詳細的信息

1.3.2 結果字段含義

數據 含義
USER 該進程是由哪一個用戶建立的
PID 進程的ID號
%CPU 該進程佔用CPU資源的百分比,佔用越高說明越消耗系統資源
%MEM 該進程佔用物理內存的百分比,佔用越高說明越消耗系統資源
VSZ 該進程佔用虛擬內存的百分比,單位是KB
RSS 該進程佔用實際物理內存大小,單位是KB
TTY 該進程在哪一個終端中運行。tty1tty7表示本地控制終端,tty1tty6是字符終端,tty7是圖形終端。pts/0~255表明虛擬終端,?表示此終端是系統啓動的
STAT 進程狀態
START 該進程的啓動時間
TIME 該進程佔用CPU的運算時間,數值越高說明越消耗系統資源
COMMAND 產生此進程的命令名

1.3.3 進程狀態(STAT)

參數 含義
R(Runing) 運行
S(Sleep) 休眠
T(Terminated) 中止
S(Son) 包含子進程
+ 位於後臺

1.4 pstree

  • pstree [選項]
    • -p 顯示進程PID
    • -u 顯示進程的所屬用戶

1.5 進程的查看(top)

  • top
top -b -n 1 > top.txt
複製代碼

1.5.1 選項

選項 含義
-b 使用批處理模式輸出,通常和-n配合使用
-n 次數,指定top命令執行的次數。通常了-b選項配合使用
-d 秒數,指定top命令每隔幾秒更新。默認是3秒

1.5.2 交互模式的命令

選項 含義
?或h 顯示交互模式的幫助
P 按CPU使用率排序,默認就是此選項
M 之內存的使用率排序
N 以PID排序
q 退出top

1.5.3 狀態欄

1.5.3.1 第一行爲任務隊列信息
內容 說明
12:12:12 系統的當前時間
up 1 day 5:33 系統的運行時間,本機已經運行了1天5小時33分
2 users 當前登陸了二個客戶端
load average 0 0 0 系統在以前1分鐘、5分鐘、15分鐘的平均負載。通常認爲小於1小時負載較小,大於1超過負載
1.5.3.2 第二行爲進程信息
內容 說明
Tasks: 100 total 系統中的進程總數
1 running 正在運行的進程數
94 sleeping 睡眠的進程
0 stopped 正在中止的進程
0 zombie 殭屍進程。若是不是0的話要進行檢查
1.5.3.3 第三行爲CPU信息
內容 說明
Cpu(s): 0.1%us 用戶模式佔用的CPU百分比
0.1%sy 系統模式佔用的CPU百分比
0.0%ni 改變過優先級的用戶進程 佔用的CPU百分比
99.7%id 空閒CPU的CPU百分比
0.1%wa 等待輸入/輸出的進程的佔用CPU百分比
0.1%hi 硬中斷請求服務佔用的CPU百分比
0.1%si 軟中斷請求服務佔用的CPU百分比
0.0%st st(Steal time)虛擬時間百分比,就是當有
1.5.3.4 第四行爲物理內存信息
內容 說明
Mem: 1030720k total 物理內存的問題,單位是KB
551860k used 已經使用的物理內存數量
478860k free 空閒的物理內存數量,虛擬機分配了1024M內存,使用了538M,空閒467M
43180k buffers 做爲緩衝的內存數量,能夠存放須要寫入硬盤的數據,用來加速數據的寫入
1.5.3.5 第四行爲交換分區信息
內容 說明
Swap: 2047992k total 總計的交換分區(虛擬內存)大小
536k used 已經使用的交換分區大小
2047456k free 空閒的交換分區大小
368164k cached 把須要常常讀取的數據從硬盤讀到內存中,加速了數據的讀取

1.6 殺死進程(kill)

1.6.1 進程信號

  • kill -l 查看可用的進程信號
信號 代碼 信號名稱 說明 示例
1 SIGHUP 該信號讓進程當即關閉,而後重寫讀取配置文件後重啓,平滑重啓 kill -1 -HUP 進程號
2 SIGINT 程序終止信號,用於關閉前臺進程,至關於ctrl+c
9 SIGKILL 用來馬上結束程序的運行,本信號不能阻塞、處理和忽略,通常用於強制停止
15 SIGTERM 正常結束進程的信號,kill命令的默認信號。若是不能正常停止,纔會嘗試SIGKILL信號

1.6.2 殺死進程

sleep.shmysql

#!/bin/bash
i=0
while [ $i -le 1000 ]
 do
   echo $(date)
   sleep 1s
 done
sh sleep.sh &
ps -ef | grep sleep.sh
kill  進程號
複製代碼

2. 系統資源查看

2.1 vmstat

  • 監控系統資源使用狀態
  • vmstat [刷新延時 刷新次數]
vmstat 1 3
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 1  0    532 329932  99388 459768    0    0    16    81   59   50  3  1 96  0  0    
複製代碼

2.1.1 (procs)進程信息字段

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

2.1.2 memory(內存信息字段)

分類 參數 含義
memory swpd 使用的Swap空間的大小,單位KB
memory free 空閒的內存容量,單位KB
memory buff 緩衝的內存容量,單位KB
memory cache 緩存的內存容量,單位KB

2.1.3 swap(交換分區信息)

  • 若是說si和so數越大說明數據常常要在磁盤和內存之間數據交換,系統性能就會越差
分類 參數 含義
swap si(in) 從磁盤中交換到內存中的數據的數量,單位KB
swap so(out) 從內存中交換到硬盤中的數據的數量,單位KB

2.1.4 io(磁盤讀寫)

  • bi和bo數越大,說明磁盤的I/O越繁忙
分類 參數 含義
io bi(in) 從塊設備讀入數據的問題,單位是塊
io bo(out) 寫到塊設備的數據的總量,單位是塊

2.1.5 system(系統信息字段)

  • in和cs數越大,說明系統與接口設備的通訊越繁忙
分類 參數 含義
system in(interrupt) 每秒被中斷的進程次數
system cs(switch) 每秒鐘進行的事件切換次數

2.1.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.3 free

  • 查看內存使用狀態
  • free [-b|-k|-m|-g]
  • 選項
    • -b 以字節爲單位
    • -k 以KB字節爲單位
    • -m 以MB字節爲單位
    • -g 以GB字節爲單位
# free -m
             total       used       free     shared    buffers     cached
Mem:          1006        687        319          0         98        449
-/+ buffers/cache:        139        866
Swap:         1999          0       1999
複製代碼

2.3.1 第一行

分類 參數 含義
total 內存總數
used 已經使用的內存數
free 空閒的內存數
shared 多個進程共享的內存數
buffers 緩衝區內存數
cached 緩存內存數

2.3.2 第二行

參數 算法 含義
- buffers/cache 第一行的used-buffers-cached 已經使用的要減去緩存和緩衝的內存量
+ buffers/cache 第一行的free+buffers+cached 空閒的要加上緩存和緩衝的內存量

2.3.3 第三行

分類 參數 含義
total swap總數,默認單位是K
used 已經使用的swap數,默認單位是K
free 空閒的swap數,默認單位是K

2.6 查看內核相關信息

  • uname
# uname -a
Linux localhost 2.6.32-279.el6.i686 #1 SMP Fri Jun 22 10:59:55 UTC 2012 i686 i686 i386 GNU/Linux
# uname -s
Linux
# uname -r
2.6.32-279.el6.i686
複製代碼

2.7 查看操做系統位數

file /bin/ls
複製代碼

2.8 查看發行版本

lsb_release -a
複製代碼

2.9 查看發行版本

yum install redhat-lsb -y
lsb_release -v
複製代碼

3. 系統定時任務

  • 有些任務好比備份數據庫等操做須要在系統空閒的時候執行

3.2 crontab

  • 能夠循環定時執行定時任務
  • cron
systemctl restart crond.service
複製代碼

3.2.3 crontab設置

  • crontab [選項]
  • 選項
    • -e 編輯crontab定時任務
    • -l 查詢crontab任務
    • -r 刪除當前用戶全部的crontab任務
* * * * *  執行的任務
複製代碼
3.2.3.1 語法
# .---------------- 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
# |  |  |  |  |
# *  *  *  *  * user-name command to be executed
複製代碼
3.2.3.2 位置
項目 含義 範圍
第1個星 1個小時中的第幾分鐘 0~59
第2個星 1天當中的第幾小時 0~23
第3個星 1月當中的第幾天 1~31
第4個星 1年當中的第幾月 1~12
第5個星 1周當中的星期幾 0~6
3.2.3.3 特殊符號
符號 含義 例子
* 表明任意時間 好比第一個星就表明一個小時中每分鐘都執行一次
, 表明不連續的時間 好比"1,2,3 ",就表明每小時的1分、2分、3分執行命令
- 表明連續的時間範圍 好比 " 1-5 * ** ",表明每小時的第1分到第5分執行命令
*/n 表明每隔多久執行一次 好比 "/10 " 就表明每隔10分鐘就執行一次命令
0 0 1,10 * 1 每個月1號和10號,每週1的0點0分都會執行
3.2.3.4 案例
符號 含義
10 22 * 在天天的22點10分執行
0 15 1 每週1的15點0分執行
0 5 5,10 每個月5號和10號的凌晨5點整執行
10 5 1-5 每週一到週五的凌晨5點10分執行命令
/10 10 天天凌晨10點鐘,每隔10分鐘執行一次
3.2.3.5 注意事項
  • 全部選項不能爲空,必須填寫
  • crontab最小單位是分鐘,最大單位是天
  • 無論寫命令仍是腳本都要使用絕對路徑

3.3 系統定時任務

  • crontab -e是用戶執行的命令,不一樣的用戶身份能夠執行本身的定時任務
  • 若是須要系統執行定時任務,能夠編輯/etc/crontab文件
  • /etc/crontab能夠指定shell、路徑、郵件發送和家目錄

3.3.1 /etc/crontab

  • 修改/etc/crontab配置文件
5 5 * * * echo `date` >> /root/date.log
複製代碼

4. 實戰任務

4.1 監控nginx

nginx.shnginx

#!/bin/bash
local nginx
nginx=`ps -ef |grep nginx|grep -v grep|wc -l`
 if [ $nginx -gt 2 ];then
    echo "your nginx is running"
    exit 0
 else
    /bin/systemctl start nginx.service
    exit 1
fi
複製代碼

4.2 監控mysql狀態

mysql.sh算法

#!/bin/sh
PortNum=`netstat -lnt|grep 3306|wc -l`
if [ $PortNum -eq 1 ]
then
 echo "mysqld is running."
else
 echo "mysqld is stoped."
fi
複製代碼

4.3 mysql備份腳本

mysql_backup.shsql

#!/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 {} \;
複製代碼
相關文章
相關標籤/搜索