又大又粗又猛免费视频久久_国产理论在线播放_久久男人av资源网站免费软件_99国产精品无码

Linux合集之Linux實用運維腳本分享及Linux CPU的上下文切換(linux wed)

Linux實用運維腳本分享

#查看僵尸進程ps -al | gawk '{print $2,$4}' | grep Z# 匹配電子郵件的地址cat index.html | egrep -o "[A-Za-z0-9._] @[A-Za-z0-9.] .[a-zA-Z]{2,4}" > ans.txt#匹配http URLcat index.html | egrep -o "http://[A-Za-z0-9.] .[a-zA-Z]{2,3}" > ans.txt #純文本形式下載網頁lynx -dump www.rumenz.com > plain.txt#只打印HTTP頭部信息,無須遠程下載文件curl --head www.rumenz.com#使用POST提交數(shù)據(jù)curl -d "param2=nickwolfe?m2=12345" http://www.rumenz.com/login.cgi#顯示分組途經的網關traceroute www.rumenz.com#列出系統(tǒng)中的開放端口以及運行在端口上的服務lsof -i #nc命令建立socket連接#設置監(jiān)聽 nc -l 5555#連接到套接字 nc 192.0.0.1 5555#快速文件傳輸#接收端 nc -l 5555 > destination_filename#發(fā)送端 nc 192.0.0.1 5555 < source_filename#找出指定目錄最大的n個文件du -ak target_dir | sort -nrk 1 | head -n 4# du中a為遞歸,k為kb;sort中n為數(shù)字,r為降序,k指定列#向終端中的所有登陸用戶發(fā)送廣播信息cat message.txt | wall#創(chuàng)建新的screen窗口screen#打印所有的.txt和.pdf文件find . ( -name "*.txt" -o -name "*.pdf" ) -print# -exec command {} ;是連用的,所有符合的都會放置在{}中,去執(zhí)行command #將文件分割成多個大小為10kB的文件split -b 10k data.file #打印兩個文件的交集comm A.txt B.txt -3 | sed 's/^t//'#sed移除空白行sed '/^$/d' file

mysql備份

#!/BIN/bashset -eUSER="backup"PASSWORD="backup"# 數(shù)據(jù)庫數(shù)據(jù)目錄 #DATA_DIR="/data/mysql"BIN_INDEX=$DATA_DIR"/mysql-bin.index"# 備份目錄 #BACKUP_DIR="/data/backup/mysql"BACKUP_LOG="/var/log/mysql/backup.log"DATE=`date "%Y%m%d"`TIME=`date "%Y%m%d%H"`LOG_TIME=`date "%Y-%m-%d %H:%M:%S"`DELETE_BINLOG_TIME="7 day"INCREMENT_INTERVAL="3 hour"note() { printf "[$LOG_TIME] note: $*n" >> $BACKUP_LOG;}warning() { printf "[$LOG_TIME] warning: $*n" >> $BACKUP_LOG;}error() { printf "[$LOG_TIME] error: $*n" >> $BACKUP_LOG; exit 1;}full_backup() { local dbs=`ls -l $DATA_DIR | grep "^d" | awk -F " " '{print $9}'` for db in $dbs do local backup_dir=$BACKUP_DIR"/full/"$db local filename=$db"."$DATE local backup_file=$backup_dir"/"$filename".sql" if [ ! -d $backup_dir ] then mkdir -p $backup_dir || { error "創(chuàng)建數(shù)據(jù)庫 $db 全量備份目錄 $backup_dir 失敗"; continue; } note "數(shù)據(jù)庫 $db 全量備份目錄 $backup_dir 不存在,創(chuàng)建完成"; fi note "full backup $db start ..." mysqldump --user=${USER} --password=${PASSWORD} --flush-logs --skip-lock-tables --quick $db > $backup_file || { warning "數(shù)據(jù)庫 $db 備份失敗"; continue; } cd $backup_dir tar -cPzf $filename".tar.gz" $filename".sql" rm -f $backup_file chown -fR mysql:mysql $backup_dir note "數(shù)據(jù)庫 $db 備份成功"; note "full backup $db end." done}increment_backup() { local StartTime=`date "-d $INCREMENT_INTERVAL ago" "%Y-%m-%d %H:%M:%S"` local DELETE_BINLOG_END_TIME=`date "-d $DELETE_BINLOG_TIME ago" "%Y-%m-%d %H:%M:%S"` local dbs=`ls -l $DATA_DIR | grep "^d" | awk -F " " '{print $9}'` mysql -u$USER -p$PASSWORD -e "purge master logs before '$DELETE_BINLOG_END_TIME'" && note "delete $DELETE_BINLOG_TIME days before log"; filename=`cat $BIN_INDEX | awk -F "/" '{print $2}'` for i in $filename do for db in $dbs do local backup_dir=$BACKUP_DIR"/increment/"$db local filename=$db"."$TIME local backup_file=$backup_dir"/"$filename".sql" if [ ! -d $backup_dir ] then mkdir -p $backup_dir || { error "創(chuàng)建數(shù)據(jù)庫 $db 增量備份目錄 $backup_dir 失敗"; continue; } note "數(shù)據(jù)庫 $db 增量備份目錄 $backup_dir 不存在,創(chuàng)建完成"; fi note "increment backup $db form time $StartTime start ..." mysqlbinlog -d $db --start-datetime="$StartTime" $DATA_DIR/$i >> $backup_file || { warning "數(shù)據(jù)庫 $db 備份失敗"; continue; } note "increment backup $db end." done done for db in $dbs do local backup_dir=$BACKUP_DIR"/increment/"$db local filename=$db"."$TIME local backup_file=$backup_dir"/"$filename".sql" cd $backup_dir tar -cPzf $filename".tar.gz" $filename".sql" rm -f $backup_file note "數(shù)據(jù)庫 $db 備份成功"; done}case "$1" in full) full_backup ;; increment) increment_backup ;; *) exit 2 ;;esacexit 1

目錄備份

#!/bin/bash### 時間DATE=$(date ' %Y-%m-%d_%H_%M_%S')# 備份目錄 BACKUPDIR="/home/backups"# 需要備份的目錄SORFILE=/opt# 目標文件名DESFILE=/home/backups/$SORFILE.$(date ' %Y-%m-%d_%H_%M_%S').zip[ ! -d $BACKUPDIR ] && mkdir -p $BACKUPDIRcd $BACKUPDIRecho "start backup $SORFILE ..."sleep 3#echo "$DESFILE"#tar cvf $DESFILE $SORFILE#gzip -f .zip $DESFILEzip -r $DESFILE $SORFILE &>/dev/nullif [ "$?" == "0" ]then echo $(date %Y-%m-%d)" zip sucess">>backup.logelse echo $(date %Y-%m-%d)" zip failed">>backup.log exit 0fi# 刪除3天前的備份find $BACKUPDIR -type f -ctime 3 | xargs rm -rf

PING查詢

#!/bin/bash#用途:根據(jù)網絡配置對網絡地址192.168.0進行修改,檢查是否是活動狀態(tài)#{start..end}shell擴展生成一組地址for ip in 192.168.0.{1..255}do ( ping $ip -c 2 &> /dev/null # > 標準輸出重定向,和1>一致 # 2>&1 將標準錯誤輸出 重定向 到標準輸出 # &>file 將標準輸出和標準錯誤輸出都重定向到文件filename中 if [ $? -eq 0 ];then echo $ip is alive fi )&donewait#并行ping,加速

磁盤IO檢查

##iostat是查看磁盤活動統(tǒng)計情況##顯示所有設備負載情況 r/s: 每秒完成的讀 I/O 設備次數(shù)。即 rio/s;w/s: 每秒完成的寫 I/O 設備次數(shù)。即 wio/s等iostat ##每隔2秒刷新磁盤IO信息,并且每次顯示3次iostat 2 3#顯示某個磁盤的IO信息iostat -d sda1##顯示tty和cpu信息IOstat -t##以M為單位顯示磁盤IO信息iostat -m##查看TPS和吞吐量信息 kB_read/s:每秒從設備(drive expressed)讀取的數(shù)據(jù)量;kB_wrtn/s:每秒向設備(drive expressed)寫入的數(shù)據(jù)量;kB_read:讀取的總數(shù)據(jù)量;kB_wrtn:寫入的總數(shù)量數(shù)據(jù)量;iostat -d -k 1 1#查看設備使用率(%util)、響應時間(await)iostat -d -x -k 1 1#查看CPU狀態(tài)iostat -c 1 3#統(tǒng)計進程(PID)的stat,進程的stat自然包括進程的IO狀況pidstat#只顯示IOpidstat -d 1 #-d IO 信息,-r 缺頁及內存信息-u CPU使用率-t 以線程為統(tǒng)計單位1 1秒統(tǒng)計一次pidstat -u -r -d -t 1#文件級IO分析,查看當前文件由哪些進程打開lsof ls /proc/pid/fd#利用 sar 報告磁盤 I/O 信息DEV 正在監(jiān)視的塊設備 tps 每秒鐘物理設備的 I/O 傳輸總量 rd_sec/s 每秒從設備讀取的扇區(qū)數(shù)量 wr_sec/s 每秒向設備寫入的扇區(qū)數(shù)量 avgrq-sz I/O 請求的平均扇區(qū)數(shù)#avgqu-sz I/O 請求的平均隊列長度 await I/O 請求的平均等待時間,單位為毫秒 svctm I/O 請求的平均服務時間,單位為毫秒 %util I/O 請求所占用的時間的百分比,即設備利用率sar -pd 10 3 #iotop top的io版iotop#查看頁面緩存信息 其中的Cached 指用于pagecache的內存大?。╠iskcache-SwapCache)。隨著寫入緩存頁,Dirty 的值會增加 一旦開始把緩存頁寫入硬盤,Writeback的值會增加直到寫入結束。cat /proc/meminfo #查看有多少個pdflush進程 Linux 用pdflush進程把數(shù)據(jù)從緩存頁寫入硬盤#pdflush的行為受/proc/sys/vm中的參數(shù)的控制/proc/sys/vm/dirty_writeback_centisecs (default 500): 1/100秒, 多長時間喚醒pdflush將緩存頁數(shù)據(jù)寫入硬盤。默認5秒喚醒2個(更多個)線程。如果wrteback的時間長于dirty_writeback_centisecs的時間,可能會出問題cat /proc/sys/vm/nr_pdflush_threads#查看I/O 調度器#調度算法#noop anticipatory deadline [cfq] #deadline : deadline 算法保證對既定的IO請求以最小的延遲時間。#anticipatory:有個IO發(fā)生后,如果又有進程請求IO,則產生一個默認6ms猜測時間,猜測下一個進程請求IO是干什么。這對于隨機讀取會造成較大的延時。對數(shù)據(jù)庫應用很糟糕,而對于Web Server等則會表現(xiàn)不錯。#cfq: 對每個進程維護一個IO隊列,各個進程發(fā)來的IO請求會被cfq以輪循方式處理,對每一個IO請求都是公平。適合離散讀的應用。#noop: 對所有IO請求都用FIFO隊列形式處理。默認IO不會存在性能問題。cat /sys/block/[disk]/queue/scheduler#改變IO調度器$ echo deadline > /sys/block/sdX/queue/scheduler#提高調度器請求隊列的$ echo 4096 > /sys/block/sdX/queue/nr_requests

性能相關

#查看當前系統(tǒng)loaduptime#查看系統(tǒng)狀態(tài)和每個進程的系統(tǒng)資源使用狀況top#可視化顯示CPU的使用狀況htop#查看每個CPU的負載信息mpstat -P ALL 1#每隔1秒查看磁盤IO的統(tǒng)計信息iostat -xkdz 1#每隔一秒查看虛擬內存的使用信息vmstat 1#查看內存使用統(tǒng)計信息free#查看網絡使用信息nicstat -z 1#類似vmstat的顯示優(yōu)化的工具dstat 1#查看系統(tǒng)活動狀態(tài),比如系統(tǒng)分頁統(tǒng)計,塊設備IO統(tǒng)計等sar#網絡連接狀態(tài)查看netstat -s#進程資源使用信息查看pidstat 1pidstat -d 1#查看某個進程的系統(tǒng)調用信息 -p后面是進程id,-tttT 進程系統(tǒng)后的系統(tǒng)調用時間strace -tttT -p 12670#統(tǒng)計IO設備輸入輸出的系統(tǒng)調用信息strace -c dd if=/dev/zero of=/dev/null bs=512 count=1024k#tcpdump 查看網絡數(shù)據(jù)包tcpdump -nr /tmp/out.tcpdump#塊設備的讀寫事件信息統(tǒng)計btrace /dev/sdb #iotop查看某個進程的IO操作統(tǒng)計信息iotop -bod5#slabtop 查看內核 slab內存分配器的使用信息slabtop -sc#系統(tǒng)參數(shù)設置sysctl -a#系統(tǒng)性能指標統(tǒng)計信息perf stat gzip file1#系統(tǒng)cpu活動狀態(tài)查看perf record -a -g -F 997 sleep 10

進程相關

## processes 進程管理##ps查看當前系統(tǒng)執(zhí)行的線程列表,進行瞬間狀態(tài),不是連續(xù)狀態(tài),連續(xù)狀態(tài)需要使用top名稱查看 更多常用參數(shù)請使用 man ps查看ps##顯示所有進程詳細信息ps aux##-u 顯示某個用戶的進程列表ps -f -u www-data ## -C 通過名字或者命令搜索進程ps -C apache2## --sort 根據(jù)進程cpu使用率降序排列,查看前5個進程 -pcpu表示降序 pcpu升序ps aux --sort=-pcpu | head -5 ##-f 用樹結構顯示進程的層次關系,父子進程情況下ps -f --forest -C apache2 ##顯示一個父進程的所有子進程ps -o pid,uname,comm -C apache2ps --ppid 2359 ##顯示一個進程的所有線程 -L 參數(shù)ps -p 3150 -L ##顯示進程的執(zhí)行時間 -o參數(shù)ps -e -o pid,comm,etime ##watch命令可以用來實時捕捉ps顯示進程watch -n 1 'ps -e -o pid,uname,cmd,pmem,pcpu --sort=-pmem,-pcpu | head -15' ##jobs 查看后臺運行的進程 jobs命令執(zhí)行的結果,+表示是一個當前的作業(yè),減號表是是一個當前作業(yè)之后的一個作業(yè),jobs -l選項可顯示所有任務的PID,jobs的狀態(tài)可以是running, stopped, Terminated,但是如果任務被終止了(kill),shell 從當前的shell環(huán)境已知的列表中刪除任務的進程標識;也就是說,jobs命令顯示的是當前shell環(huán)境中所起的后臺正在運行或者被掛起的任務信息jobs##查看后臺運營的進程號jobs -p##查看現(xiàn)在被終止或者退出的進程號jobs -n##kill命令 終止一個前臺進程可以使用Ctrl C鍵 kill 通過top或者ps獲取進程id號 kill [-s 信號 | -p ] [ -a ] 進程號 ...##發(fā)送指定的信號到相應進程。不指定型號將發(fā)送SIGTERM(15)終止指定進程。關閉進程號12的進程kill 12##等同于在前臺運行PID為123的進程時按下Ctrl C鍵kill -2 123##如果任無法終止該程序可用“-KILL” 參數(shù),其發(fā)送的信號為SIGKILL(9) ,將強制結束進程 kill -9 123##列出所有信號名稱##HUP 1 終端斷線##INT 2 中斷(同 Ctrl C)##QUIT 3 退出(同 Ctrl )##TERM 15 終止##KILL 9 強制終止##CONT 18 繼續(xù)(與STOP相反, fg/bg命令)##STOP 19 暫停(同 Ctrl Z)kill -l##得到指定信號的數(shù)值kill -l KILL##殺死指定用戶所有進程kill -u peidalinuxkill -9 $(ps -ef | grep peidalinux) ##將后臺中的命令調至前臺繼續(xù)運行 將進程123調至前臺執(zhí)行fg 123##將一個在后臺暫停的命令,變成繼續(xù)執(zhí)行bg 123##該命令可以在你退出帳戶/關閉終端之后繼續(xù)運行相應的進程。nohup就是不掛起的意思 下面輸出被重定向到myout.file文件中nohup command > myout.file 2>&1 &##at:計劃任務,在特定的時間執(zhí)行某項工作,在特定的時間執(zhí)行一次。## 格式:at HH:MM YYYY-MM-DD //HH(小時):MM(分鐘) YYYY(年)-MM(月份)-DD(日)##HH[am pm] D(天) days //HH(小時)[am(上午)pm(下午)] days(天)at 12:00(時間) //at命令設定12:00執(zhí)行一項操作#at>useradd aaa //在at命令里設定添加用戶aaa#ctrl d //退出at命令#tail -f /etc/passwd //查看/etc/passwd文件后十行是否增加了一個用戶aaa##計劃任務設定后,在沒有執(zhí)行之前我們可以用atq命令來查看系統(tǒng)沒有執(zhí)行工作任務。atq##啟動計劃任務后,如果不想啟動設定好的計劃任務可以使用atrm命令刪除。atrm 1 //刪除計劃任務1##pstree命令:列出當前的進程,以及它們的樹狀結構 格式:pstree [選項] [pid|user]pstree##nice命令:改變程序執(zhí)行的優(yōu)先權等級 應用程序優(yōu)先權值的范圍從-20~19,數(shù)字越小,優(yōu)先權就越高。一般情況下,普通應用程序的優(yōu)先權值(CPU使用權值)都是0,如果讓常用程序擁有較高的優(yōu)先權等級,自然啟動和運行速度都會快些。需要注意的是普通用戶只能在0~19之間調整應用程序的優(yōu)先權值,只有超級用戶有權調整更高的優(yōu)先權值(從-20~19)。nice [-n <優(yōu)先等級>][--help][--version][命令]nice -n 5 ls##sleep命令:使進程暫停執(zhí)行一段時間date;sleep 1m;date##renice命令 renice命令允許用戶修改一個正在運行進程的優(yōu)先權。利用renice命令可以在命令執(zhí)行時調整其優(yōu)先權。##其中,參數(shù)number與nice命令的number意義相同。(1) 用戶只能對自己所有的進程使用renice命令。(2) root用戶可以在任何進程上使用renice命令。(3) 只有root用戶才能提高進程的優(yōu)先權renice -5 -p 5200 #PID為5200的進程nice設為-5 ##pmap命令用于顯示一個或多個進程的內存狀態(tài)。其報告進程的地址空間和內存狀態(tài)信息 #pmap PID pmap 20367

javadump.sh

#!/bin/shDUMP_PIDS=`ps --no-heading -C java -f --width 1000 |awk '{print $2}'`if [ -z "$DUMP_PIDS" ]; then echo "The server $HOST_NAME is not started!" exit 1;fiDUMP_ROOT=~/dumpif [ ! -d $DUMP_ROOT ]; then mkdir $DUMP_ROOTfiDUMP_DATE=`date %Y%m%d%H%M%S`DUMP_DIR=$DUMP_ROOT/dump-$DUMP_DATEif [ ! -d $DUMP_DIR ]; then mkdir $DUMP_DIRfifor PID in $DUMP_PIDS ; do#Full thread dump 用來查線程占用,死鎖等問題 $JAVA_HOME/bin/jstack $PID > $DUMP_DIR/jstack-$PID.dump 2>&1 echo -e ".c"#打印出一個給定的Java進程、Java core文件或遠程Debug服務器的Java配置信息,具體包括Java系統(tǒng)屬性和JVM命令行參數(shù)。 $JAVA_HOME/bin/jinfo $PID > $DUMP_DIR/jinfo-$PID.dump 2>&1 echo -e ".c"#jstat能夠動態(tài)打印jvm(Java Virtual Machine Statistics Monitoring Tool)的相關統(tǒng)計信息。如young gc執(zhí)行的次數(shù)、full gc執(zhí)行的次數(shù),各個內存分區(qū)的空間大小和可使用量等信息。 $JAVA_HOME/bin/jstat -gcutil $PID > $DUMP_DIR/jstat-gcutil-$PID.dump 2>&1 echo -e ".c" $JAVA_HOME/bin/jstat -gccapacity $PID > $DUMP_DIR/jstat-gccapacity-$PID.dump 2>&1 echo -e ".c"#未指定選項時,jmap打印共享對象的映射。對每個目標VM加載的共享對象,其起始地址、映射大小及共享對象文件的完整路徑將被打印出來, $JAVA_HOME/bin/jmap $PID > $DUMP_DIR/jmap-$PID.dump 2>&1 echo -e ".c"#-heap打印堆情況的概要信息,包括堆配置,各堆空間的容量、已使用和空閑情況 $JAVA_HOME/bin/jmap -heap $PID > $DUMP_DIR/jmap-heap-$PID.dump 2>&1 echo -e ".c"#-dump將jvm的堆中內存信息輸出到一個文件中,然后可以通過eclipse memory analyzer進行分析#注意:這個jmap使用的時候jvm是處在假死狀態(tài)的,只能在服務癱瘓的時候為了解決問題來使用,否則會造成服務中斷。 $JAVA_HOME/bin/jmap -dump:format=b,file=$DUMP_DIR/jmap-dump-$PID.dump $PID 2>&1 echo -e ".c"#顯示被進程打開的文件信息if [ -r /usr/sbin/lsof ]; then /usr/sbin/lsof -p $PID > $DUMP_DIR/lsof-$PID.dump echo -e ".c" fidone#主要負責收集、匯報與存儲系統(tǒng)運行信息的。if [ -r /usr/bin/sar ]; then /usr/bin/sar > $DUMP_DIR/sar.dumpecho -e ".c"fi#主要負責收集、匯報與存儲系統(tǒng)運行信息的。if [ -r /usr/bin/uptime ]; then /usr/bin/uptime > $DUMP_DIR/uptime.dumpecho -e ".c"fi#內存查看if [ -r /usr/bin/free ]; then /usr/bin/free -t > $DUMP_DIR/free.dumpecho -e ".c"fi#可以得到關于進程、內存、內存分頁、堵塞IO、traps及CPU活動的信息。if [ -r /usr/bin/vmstat ]; then /usr/bin/vmstat > $DUMP_DIR/vmstat.dumpecho -e ".c"fi#報告與CPU相關的一些統(tǒng)計信息if [ -r /usr/bin/mpstat ]; then /usr/bin/mpstat > $DUMP_DIR/mpstat.dumpecho -e ".c"fi#報告與IO相關的一些統(tǒng)計信息if [ -r /usr/bin/iostat ]; then /usr/bin/iostat > $DUMP_DIR/iostat.dumpecho -e ".c"fi#報告與網絡相關的一些統(tǒng)計信息if [ -r /bin/netstat ]; then /bin/netstat > $DUMP_DIR/netstat.dumpecho -e ".c"fiecho "OK!"

常用工具安裝

#!/usr/bin/env bash# ---------------------------------------------------------------------------------# 控制臺顏色BLACK="033[1;30m"RED="033[1;31m"GREEN="033[1;32m"YELLOW="033[1;33m"BLUE="033[1;34m"PURPLE="033[1;35m"CYAN="033[1;36m"RESET="$(tput sgr0)"# ---------------------------------------------------------------------------------printf "${BLUE}n"cat << EOF#################################################################################### 安裝常用命令工具# 命令工具清單如下:# 核心工具:df、du、chkconfig# 網絡工具:ifconfig、netstat、route、iptables# IP工具:ip、ss、ping、tracepath、traceroute# DNS工具:dig、host、nslookup、whois# 端口工具:lsof、nc、telnet# 下載工具:curl、wget# 編輯工具:emacs、vim# 流量工具:iftop、nethogs# 抓包工具:tcpdump# 壓縮工具:unzip、zip# 版本控制工具:git、subversion####################################################################################EOFprintf "${RESET}n"printf "n${GREEN}>>>>>>>>> 安裝常用命令工具開始${RESET}n"# 核心工具printf "n${CYAN}>>>> install coreutils(df、du)${RESET}n"yum install -y coreutilsprintf "n${CYAN}>>>> install chkconfig${RESET}n"yum install -y chkconfig# 網絡工具printf "n${CYAN}>>>> install net-tools(ifconfig、netstat、route)${RESET}n"yum install -y net-toolsprintf "n${CYAN}>>>> install iptables${RESET}n"yum install -y iptables# IP工具printf "n${CYAN}>>>> install iputils(ping、tracepath)${RESET}n"yum install -y iputilsprintf "n${CYAN}>>>> install traceroute${RESET}n"yum install -y tracerouteprintf "n${CYAN}>>>> install iproute(ip、ss)${RESET}n"yum install -y iproute# 端口工具printf "n${CYAN}>>>> install lsof${RESET}n"yum install -y lsofprintf "n${CYAN}>>>> install nc${RESET}n"yum install -y ncprintf "n${CYAN}>>>> install netstat${RESET}n"yum install -y netstat# DNS工具printf "n${CYAN}>>>> install bind-utils(dig、host、nslookup)${RESET}n"yum install -y bind-utilsprintf "n${CYAN}>>>> install whois${RESET}n"yum install -y whois# 下載工具printf "n${CYAN}>>>> install curl${RESET}n"yum install -y curlprintf "n${CYAN}>>>> install wget${RESET}n"yum install -y wget# 編輯工具printf "n${CYAN}>>>> install emacs${RESET}n"yum install -y emacsprintf "n${CYAN}>>>> install vim${RESET}n"yum install -y vim# 流量工具printf "n${CYAN}>>>> install iftop${RESET}n"yum install -y iftopprintf "n${CYAN}>>>> install nethogs${RESET}n"yum install -y nethogs# 抓包工具printf "n${CYAN}>>>> install tcpdump${RESET}n"yum install -y tcpdump# 壓縮工具printf "n${CYAN}>>>> install unzip${RESET}n"yum install -y unzip# 版本控制工具printf "n${CYAN}>>>> install git${RESET}n"yum install -y gitprintf "n${CYAN}>>>> install subversion${RESET}n"yum install -y subversionprintf "n${GREEN}<<<<<<<< 安裝常用命令工具結束${RESET}n"

常用lib庫安裝

#!/usr/bin/env bash# ---------------------------------------------------------------------------------# 控制臺顏色BLACK="033[1;30m"RED="033[1;31m"GREEN="033[1;32m"YELLOW="033[1;33m"BLUE="033[1;34m"PURPLE="033[1;35m"CYAN="033[1;36m"RESET="$(tput sgr0)"# ---------------------------------------------------------------------------------printf "${BLUE}n"cat << EOF#################################################################################### 安裝常見 lib# 如果不知道命令在哪個 lib,可以使用 yum search xxx 來查找# lib 清單如下:# gcc gcc-c kernel-devel libtool# openssl openssl-devel# zlib zlib-devel# pcre###################################################################################EOFprintf "${RESET}n"printf "n${GREEN}>>>>>>>>> 安裝常見 lib 開始${RESET}n"printf "n${CYAN}>>>> install gcc gcc-c kernel-devel libtool${RESET}n"yum -y install make gcc gcc-c kernel-devel libtoolprintf "n${CYAN}>>>> install openssl openssl-devel${RESET}n"yum -y install make openssl openssl-develprintf "n${CYAN}>>>> install zlib zlib-devel${RESET}n"yum -y install make zlib zlib-develprintf "n${CYAN}>>>> install pcre${RESET}n"yum -y install pcreprintf "n${GREEN}<<<<<<<< 安裝常見 lib 結束${RESET}n"

系統(tǒng)檢查腳本

#!/usr/bin/env bash############################################################################### console colorC_RESET="$(tput sgr0)"C_BLACK="033[1;30m"C_RED="033[1;31m"C_GREEN="033[1;32m"C_YELLOW="033[1;33m"C_BLUE="033[1;34m"C_PURPLE="033[1;35m"C_CYAN="033[1;36m"C_WHITE="033[1;37m"##############################################################################printf "${C_PURPLE}"cat << EOF#################################################################################### 系統(tǒng)信息檢查腳本###################################################################################EOFprintf "${C_RESET}"[[ $(id -u) -gt 0 ]] && echo "請用root用戶執(zhí)行此腳本!" && exit 1sysversion=$(rpm -q centos-release | cut -d- -f3)double_line="==============================================================="line="----------------------------------------------"# 打印頭部信息printHeadInfo() { cat << EOF --------------------------------------------------------------------------------- | 歡迎使用 【系統(tǒng)信息檢查腳本】 | --------------------------------------------------------------------------------- EOF}# 打印尾部信息printFootInfo() { cat << EOF --------------------------------------------------------------------------------- | 腳本執(zhí)行結束,感謝使用!| --------------------------------------------------------------------------------- EOF}options=( "獲取系統(tǒng)信息" "獲取服務信息" "獲取CPU信息" "獲取系統(tǒng)網絡信息" "獲取系統(tǒng)內存信息" "獲取系統(tǒng)磁盤信息" "獲取CPU/內存占用TOP10" "獲取系統(tǒng)用戶信息" "輸出所有信息" "退出" )printMenu() { printf "${C_BLUE}" printf "主菜單:n" for i in "${!options[@]}"; do index=`expr ${i} 1` val=`expr ${index} % 2` printf "t(d) %-30s" "${index}" "${options[$i]}" if [[ ${val} -eq 0 ]]; then printf "n" fi done printf "${C_BLUE}請輸入需要執(zhí)行的指令:n" printf "${C_RESET}"}# 獲取系統(tǒng)信息get_systatus_info() { sys_os=$(uname -o) sys_release=$(cat /etc/redhat-release) sys_kernel=$(uname -r) sys_hostname=$(hostname) sys_selinux=$(getenforce) sys_lang=$(echo $LANG) sys_lastreboot=$(who -b | awk '{print $3,$4}') sys_runtime=$(uptime | awk '{print $3,$4}' | cut -d, -f1) sys_time=$(date) sys_load=$(uptime | cut -d: -f5) cat << EOF【系統(tǒng)信息】系統(tǒng): ${sys_os}發(fā)行版本: ${sys_release}系統(tǒng)內核: ${sys_kernel}主機名: ${sys_hostname}selinux狀態(tài): ${sys_selinux}系統(tǒng)語言: ${sys_lang}系統(tǒng)當前時間: ${sys_time}系統(tǒng)最后重啟時間: ${sys_lastreboot}系統(tǒng)運行時間: ${sys_runtime}系統(tǒng)負載: ${sys_load}EOF}# 獲取CPU信息get_cpu_info() { Physical_CPUs=$(grep "physical id" /proc/cpuinfo | sort | uniq | wc -l) Virt_CPUs=$(grep "processor" /proc/cpuinfo | wc -l) CPU_Kernels=$(grep "cores" /proc/cpuinfo | uniq | awk -F ': ' '{print $2}') CPU_Type=$(grep "model name" /proc/cpuinfo | awk -F ': ' '{print $2}' | sort | uniq) CPU_Arch=$(uname -m) cat << EOF【CPU信息】物理CPU個數(shù):$Physical_CPUs邏輯CPU個數(shù):$Virt_CPUs每CPU核心數(shù):$CPU_KernelsCPU型號:$CPU_TypeCPU架構:$CPU_ArchEOF}# 獲取服務信息get_service_info() { port_listen=$(netstat -lntup | grep -v "Active Internet") kernel_config=$(sysctl -p 2> /dev/null) if [[ ${sysversion} -gt 6 ]]; then service_config=$(systemctl list-unit-files --type=service --state=enabled | grep "enabled") run_service=$(systemctl list-units --type=service --state=running | grep ".service") else service_config=$(/sbin/chkconfig | grep -E ":on|:啟用" | column -t) run_service=$(/sbin/service --status-all | grep -E "running") fi cat << EOF【服務信息】${service_config} ${line}運行的服務:${run_service} ${line}監(jiān)聽端口:${port_listen} ${line}內核參考配置:${kernel_config}EOF}# 獲取系統(tǒng)內存信息get_mem_info() { check_mem=$(free -m) MemTotal=$(grep MemTotal /proc/meminfo | awk '{print $2}') #KB MemFree=$(grep MemFree /proc/meminfo | awk '{print $2}') #KB let MemUsed=MemTotal-MemFree MemPercent=$(awk "BEGIN {if($MemTotal==0){printf 100}else{printf "%.2f",$MemUsed*100/$MemTotal}}") report_MemTotal="$((MemTotal/1024))" "MB" #內存總容量(MB) report_MemFree="$((MemFree/1024))" "MB" #內存剩余(MB) report_MemUsedPercent=$(free | sed -n '2p' | gawk 'x = int(( $3 / $2 ) * 100) {print x}' | sed 's/$/%/') cat << EOF【內存信息】內存總容量(MB): ${report_MemTotal}內存剩余量(MB):${report_MemFree}內存使用率: ${report_MemUsedPercent}EOF}# 獲取系統(tǒng)網絡信息get_net_info() { pri_ipadd=$(ip addr | awk '/^[0-9] : / {}; /inet.*global/ {print gensub(/(.*)/(.*)/, "1", "g", $2)}') pub_ipadd=$(curl ifconfig.me -s) gateway=$(ip route | grep default | awk '{print $3}') mac_info=$(ip link | egrep -v "lo" | grep link | awk '{print $2}') dns_config=$(egrep -v "^$|^#" /etc/resolv.conf) route_info=$(route -n) cat << EOF【網絡信息】系統(tǒng)公網地址:${pub_ipadd}系統(tǒng)私網地址:${pri_ipadd}網關地址:${gateway}MAC地址:${mac_info}路由信息:${route_info}DNS 信息:${dns_config}EOF}# 獲取系統(tǒng)磁盤信息get_disk_info() { disk_info=$(fdisk -l | grep "Disk /dev" | cut -d, -f1) disk_use=$(df -hTP | awk '$2!="tmpfs"{print}') disk_percent=$(free | sed -n '2p' | gawk 'x = int(( $3 / $2 ) * 100) {print x}' | sed 's/$/%/') disk_inode=$(df -hiP | awk '$1!="tmpfs"{print}') cat << EOF【磁盤信息】${disk_info}磁盤使用: ${disk_use}磁盤使用百分比: ${disk_percent}inode信息: ${disk_inode}EOF}# 獲取系統(tǒng)用戶信息get_sys_user() { login_user=$(awk -F: '{if ($NF=="/bin/bash") print $0}' /etc/passwd) ssh_config=$(egrep -v "^#|^$" /etc/ssh/sshd_config) sudo_config=$(egrep -v "^#|^$" /etc/sudoers | grep -v "^Defaults") host_config=$(egrep -v "^#|^$" /etc/hosts) crond_config=$(for cronuser in /var/spool/cron/*; do ls ${cronuser} 2> /dev/null | cut -d/ -f5; egrep -v "^$|^#" ${cronuser} 2> /dev/null; echo ""; done) cat << EOF【用戶信息】系統(tǒng)登錄用戶:${login_user} ${line}ssh 配置信息:${ssh_config} ${line}sudo 配置用戶:${sudo_config} ${line}定時任務配置:${crond_config} ${line}hosts 信息:${host_config}EOF}# 獲取CPU/內存占用TOP10get_process_top_info() { top_title=$(top -b n1 | head -7 | tail -1) cpu_top10=$(top -b n1 | head -17 | tail -11) mem_top10=$(top -b n1 | head -17 | tail -10 | sort -k10 -r) cat << EOF【TOP10】CPU占用TOP10:${cpu_top10}內存占用TOP10:${top_title} ${mem_top10}EOF}show_dead_process() { printf "僵尸進程:n" ps -al | gawk '{print $2,$4}' | grep Z}get_all_info() { get_systatus_info echo ${double_line} get_service_info echo ${double_line} get_cpu_info echo ${double_line} get_net_info echo ${double_line} get_mem_info echo ${double_line} get_disk_info echo ${double_line} get_process_top_info echo ${double_line} get_sys_user}main() { while [[ 1 ]] do printMenu read option local index=$[ ${option} - 1 ] case ${options[${index}]} in "獲取系統(tǒng)信息") get_systatus_info ;; "獲取服務信息") get_service_info ;; "獲取CPU信息") get_cpu_info ;; "獲取系統(tǒng)網絡信息") get_net_info ;; "獲取系統(tǒng)內存信息") get_mem_info ;; "獲取系統(tǒng)磁盤信息") get_disk_info ;; "獲取CPU/內存占用TOP10") get_process_top_info ;; "獲取系統(tǒng)用戶信息") get_sys_user ;; "輸出所有信息") get_all_info > sys.log printf "${C_GREEN}信息已經輸出到 sys.log 中。${C_RESET}nn" ;; "退出") exit ;; *) clear echo "抱歉,不支持此選項" ;; esac done}######################################## MAIN ########################################printHeadInfomainprintFootInfoprintf "${C_RESET}"

sed進階

#!/bin/bash#多個空格只保留一個#sed '/./,/^$/!d' test#刪除開頭的空白行#sed '/./,$!d' test#刪除結尾的空白行sed '{:start /^n*$/{$d; N; b start}}' test#刪除html標簽#有問題#s/<.*>//g#sed 's/<[^>]*>//g' test1#sed 's/<[^>]*>//g;/^$/d' test1#and符號,代表替換命令中的匹配模式,不管預定義模式是什么文本,都可以用and符號替換,and符號會提取匹配替換命令中指定替換模式中的所有字符串echo "The cat sleeps in his hat" | sed 's/.at/"&"/g'#替換單獨的單詞echo "The System Administrator manual" | sed 's/(System) Administrator/1 user/'#在長數(shù)字中插入逗號echo "1234567" | sed '{:start; s/(.*[0-9])([0-9]{3})/1,2/; t start}'#給文件中的行編號sed '=' test | sed 'N; s/n/ /'

Linux CPU的上下文切換

我們都知道 Linux 是一個多任務操作系統(tǒng),它支持的任務同時運行的數(shù)量遠遠大于 CPU 的數(shù)量。當然,這些任務實際上并不是同時運行的(Single CPU),而是因為系統(tǒng)在短時間內將 CPU 輪流分配給任務,造成了多個任務同時運行的假象。

CPU 上下文(CPU Context)

在每個任務運行之前,CPU 需要知道在哪里加載和啟動任務。這意味著系統(tǒng)需要提前幫助設置 CPU 寄存器和程序計數(shù)器。

CPU 寄存器是內置于 CPU 中的小型但速度極快的內存。程序計數(shù)器用于存儲 CPU 正在執(zhí)行的或下一條要執(zhí)行指令的位置。

它們都是 CPU 在運行任何任務之前必須依賴的依賴環(huán)境,因此也被稱為 “CPU 上下文”。如下圖所示:

Linux合集之Linux實用運維腳本分享及Linux CPU的上下文切換(linux wed)

圖片

知道了 CPU 上下文是什么,我想你理解 CPU 上下文切換就很容易了。“CPU上下文切換”指的是先保存上一個任務的 CPU 上下文(CPU寄存器和程序計數(shù)器),然后將新任務的上下文加載到這些寄存器和程序計數(shù)器中,最后跳轉到程序計數(shù)器。

這些保存的上下文存儲在系統(tǒng)內核中,并在重新安排任務執(zhí)行時再次加載。這確保了任務的原始狀態(tài)不受影響,并且任務似乎在持續(xù)運行。

CPU 上下文切換的類型

你可能會說 CPU 上下文切換無非就是更新 CPU 寄存器和程序計數(shù)器值,而這些寄存器是為了快速運行任務而設計的,那為什么會影響 CPU 性能呢?

在回答這個問題之前,請問,你有沒有想過這些“任務”是什么?你可能會說一個任務就是一個進程或者一個線程。是的,進程和線程正是最常見的任務,但除此之外,還有其他類型的任務。

別忘了硬件中斷也是一個常見的任務,硬件觸發(fā)信號,會引起中斷處理程序的調用。

因此,CPU 上下文切換至少有三種不同的類型:

  • 進程上下文切換
  • 線程上下文切換
  • 中斷上下文切換

讓我們一一來看看。

進程上下文切換

Linux 按照特權級別將進程的運行空間劃分為內核空間和用戶空間,分別對應下圖中 Ring 0 和 Ring 3 的 CPU 特權級別的 。

  • 內核空間(Ring 0)擁有最高權限,可以直接訪問所有資源
  • 用戶空間(Ring 3)只能訪問受限資源,不能直接訪問內存等硬件設備。它必須通過系統(tǒng)調用被陷入(trapped)內核中才能訪問這些特權資源。

Linux合集之Linux實用運維腳本分享及Linux CPU的上下文切換(linux wed)

圖片

從另一個角度看,一個進程既可以在用戶空間也可以在內核空間運行。當一個進程在用戶空間運行時,稱為該進程的用戶態(tài),當它落入內核空間時,稱為該進程的內核態(tài)。

從用戶態(tài)到內核態(tài)的轉換需要通過系統(tǒng)調用來完成。例如,當我們查看一個文件的內容時,我們需要以下系統(tǒng)調用:

  • open():打開文件
  • read():讀取文件的內容
  • write():將文件的內容寫入到輸出文件(包括標準輸出)
  • close():關閉文件

那么在上述系統(tǒng)調用過程中是否會發(fā)生 CPU 上下文切換呢?當然是的。

這需要先保存 CPU 寄存器中原來的用戶態(tài)指令的位置。接下來,為了執(zhí)行內核態(tài)的代碼,需要將 CPU 寄存器更新到內核態(tài)指令的新位置。最后是跳轉到內核態(tài)運行內核任務。

那么系統(tǒng)調用結束后,CPU 寄存器需要恢復原來保存的用戶狀態(tài),然后切換到用戶空間繼續(xù)運行進程。

因此,在一次系統(tǒng)調用的過程中,實際上有兩次 CPU 上下文切換。

但需要指出的是,系統(tǒng)調用進程不會涉及進程切換,也不會涉及虛擬內存等系統(tǒng)資源切換。這與我們通常所說的“進程上下文切換”不同。進程上下文切換是指從一個進程切換到另一個進程,而系統(tǒng)調用期間始終運行同一個進程

系統(tǒng)調用過程通常被稱為特權模式切換,而不是上下文切換。但實際上,在系統(tǒng)調用過程中,CPU 的上下文切換也是不可避免的。

進程上下文切換 vs 系統(tǒng)調用

那么進程上下文切換和系統(tǒng)調用有什么區(qū)別呢?首先,進程是由內核管理的,進程切換只能發(fā)生在內核態(tài)。因此,進程上下文不僅包括虛擬內存、棧和全局變量等用戶空間資源,還包括內核棧和寄存器等內核空間的狀態(tài)。

所以進程上下文切換比系統(tǒng)調用要多出一步:

在保存當前進程的內核狀態(tài)和 CPU 寄存器之前,需要保存進程的虛擬內存、棧等;并加載下一個進程的內核狀態(tài)。

根據(jù) Tsuna 的測試報告,每次上下文切換需要幾十納秒至微秒的 CPU 時間。這個時間是相當可觀的,尤其是在大量進程上下文切換的情況下,很容易導致 CPU 花費大量時間來保存和恢復寄存器、內核棧、虛擬內存等資源。這正是我們在上一篇文章中談到的,一個導致平均負載上升的重要因素。

那么,該進程何時會被調度/切換到在 CPU 上運行?其實有很多場景,下面我為大家總結一下:

  • 當一個進程的 CPU 時間片用完時,它會被系統(tǒng)掛起,并切換到其他等待 CPU 運行的進程。
  • 當系統(tǒng)資源不足(如內存不足)時,直到資源充足之前,進程無法運行。此時進程也會被掛起,系統(tǒng)會調度其他進程運行。
  • 當一個進程通過 sleep 函數(shù)自動掛起自己時,自然會被重新調度。
  • 當優(yōu)先級較高的進程運行時,為了保證高優(yōu)先級進程的運行,當前進程會被高優(yōu)先級進程掛起運行。
  • 當發(fā)生硬件中斷時,CPU 上的進程會被中斷掛起,轉而執(zhí)行內核中的中斷服務程序。

了解這些場景是非常有必要的,因為一旦上下文切換出現(xiàn)性能問題,它們就是幕后殺手。

線程上下文切換

線程和進程最大的區(qū)別在于,線程是任務調度的基本單位,而進程是資源獲取的基本單位。

說白了,內核中所謂的任務調度,實際的調度對象是線程;而進程只為線程提供虛擬內存和全局變量等資源。所以,對于線程和進程,我們可以這樣理解:

  • 當一個進程只有一個線程時,可以認為一個進程等于一個線程
  • 當一個進程有多個線程時,這些線程共享相同的資源,例如虛擬內存和全局變量。
  • 此外,線程也有自己的私有數(shù)據(jù),比如棧和寄存器,在上下文切換時也需要保存。

這樣,線程的上下文切換其實可以分為兩種情況:

  • 首先,前后兩個線程屬于不同的進程。此時,由于資源不共享,切換過程與進程上下文切換相同。
  • 其次,前后兩個線程屬于同一個進程。此時,由于虛擬內存是共享的,所以切換時虛擬內存的資源保持不變,只需要切換線程的私有數(shù)據(jù)、寄存器等未共享的數(shù)據(jù)。

顯然,同一個進程內的線程切換比切換多個進程消耗的資源要少。這也是多線程替代多進程的優(yōu)勢。

中斷上下文切換

除了前面兩種上下文切換之外,還有另外一種場景也輸出 CPU 上下文切換的,那就是中斷。

為了快速響應事件,硬件中斷會中斷正常的調度和執(zhí)行過程,進而調用中斷處理程序。

在中斷其他進程時,需要保存進程的當前狀態(tài),以便中斷后進程仍能從原始狀態(tài)恢復。

與進程上下文不同,中斷上下文切換不涉及進程的用戶態(tài)。因此,即使中斷進程中斷了處于用戶態(tài)的進程,也不需要保存和恢復進程的虛擬內存、全局變量等用戶態(tài)資源。

另外,和進程上下文切換一樣,中斷上下文切換也會消耗 CPU。過多的切換次數(shù)會消耗大量的 CPU 資源,甚至嚴重降低系統(tǒng)的整體性能。因此,當您發(fā)現(xiàn)中斷過多時,需要注意排查它是否會對您的系統(tǒng)造成嚴重的性能問題。

結論

綜上所述,無論哪種場景導致上下文切換,你都應該知道:

CPU 上下文切換是保證 Linux 系統(tǒng)正常運行的核心功能之一,一般不需要我們特別關注。

但是過多的上下文切換會消耗 CPU 的時間來保存和恢復寄存器、內核棧、虛擬內存等數(shù)據(jù),從而縮短進程的實際運行時間,導致系統(tǒng)整體性能顯著下降。

相關新聞

聯(lián)系我們
聯(lián)系我們
在線咨詢
分享本頁
返回頂部