1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        Linux 實用運維腳本分享

        共 38086字,需瀏覽 77分鐘

         ·

        2022-06-20 20:29

        在公眾號后臺回復(fù):JGNB,可獲取杰哥原創(chuàng)的 PDF 手冊。

        #查看僵尸進(jìn)程
        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 URL
        cat index.html | egrep -o "http://[A-Za-z0-9.]+\.[a-zA-Z]{2,3}" > ans.txt 

        #純文本形式下載網(wǎng)頁
        lynx -dump www.baidu.com > plain.txt

        #只打印HTTP頭部信息,無須遠(yuǎn)程下載文件
        curl --head www.baidu.com

        #使用POST提交數(shù)據(jù)
        curl -d "param2=nickwolfe?m2=12345" http://www.linuxidc.com/login.cgi

        #顯示分組途經(jīng)的網(wǎng)關(guān)
        traceroute www.baidu.com

        #列出系統(tǒng)中的開放端口以及運行在端口上的服務(wù)
        lsof -i 

        #nc命令建立socket連接

        #設(shè)置監(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/bash

        set -e

        USER="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
            ;;
        esac

        exit 1

        目錄備份

        #!/bin/bash
        #
        #
        # 時間
        DATE=$(date '+%Y-%m-%d_%H_%M_%S')
        # 備份目錄 
        BACKUPDIR="/home/backups"
        # 需要備份的目錄
        SORFILE=/opt
        # 目標(biāo)文件名
        DESFILE=/home/backups/$SORFILE.$(date '+%Y-%m-%d_%H_%M_%S').zip

        [ ! -d $BACKUPDIR ] && mkdir -p $BACKUPDIR
        cd $BACKUPDIR

        echo "start backup $SORFILE ..."
        sleep 3
        #echo "$DESFILE"


        #tar cvf $DESFILE $SORFILE
        #gzip -f .zip $DESFILE
        zip -r $DESFILE $SORFILE &>/dev/null
        if [ "$?" == "0" ]
        then
           echo $(date +%Y-%m-%d)" zip sucess">>backup.log
        else
           echo $(date +%Y-%m-%d)" zip failed">>backup.log
           exit 0
        fi

        # 刪除3天前的備份
        find $BACKUPDIR -type f -ctime +3 | xargs rm -rf

        PING查詢

        #!/bin/bash
        #用途:根據(jù)網(wǎng)絡(luò)配置對網(wǎng)絡(luò)地址192.168.0進(jìn)行修改,檢查是否是活動狀態(tài)

        #{start..end}shell擴(kuò)展生成一組地址
        for ip in 192.168.0.{1..255}
        do 
            (
            ping $ip -c 2 &> /dev/null 
            # > 標(biāo)準(zhǔn)輸出重定向,和1>一致
            # 2>&1 將標(biāo)準(zhǔn)錯誤輸出 重定向 到標(biāo)準(zhǔn)輸出
            # &>file 將標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯誤輸出都重定向到文件filename中

            if [ $? -eq 0 ];then
                echo $ip is alive
            fi
            )&
        done
        wait
        #并行ping,加速

        磁盤IO檢查

        ##iostat是查看磁盤活動統(tǒng)計情況

        #
        #顯示所有設(shè)備負(fù)載情況 r/s:  每秒完成的讀 I/O 設(shè)備次數(shù)。即 rio/s;w/s:  每秒完成的寫 I/O 設(shè)備次數(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:每秒從設(shè)備(drive expressed)讀取的數(shù)據(jù)量;kB_wrtn/s:每秒向設(shè)備(drive expressed)寫入的數(shù)據(jù)量;kB_read:讀取的總數(shù)據(jù)量;kB_wrtn:寫入的總數(shù)量數(shù)據(jù)量;
        iostat -d -k 1 1

        #
        查看設(shè)備使用率(%util)、響應(yīng)時間(await)
        iostat -d -x -k 1 1

        #
        查看CPU狀態(tài)
        iostat -c 1 3

        #
        統(tǒng)計進(jìn)程(pid)的stat,進(jìn)程的stat自然包括進(jìn)程的IO狀況
        pidstat

        #
        只顯示IO
        pidstat -d  1 

        #
        -d IO 信息,-r 缺頁及內(nèi)存信息-u CPU使用率-t 以線程為統(tǒng)計單位1  1秒統(tǒng)計一次
        pidstat -u -r -d -t 1

        #
        文件級IO分析,查看當(dāng)前文件由哪些進(jìn)程打開
        lsof   
        ls /proc/pid/fd

        #
        利用 sar 報告磁盤 I/O 信息DEV 正在監(jiān)視的塊設(shè)備 tps 每秒鐘物理設(shè)備的 I/O 傳輸總量 rd_sec/s 每秒從設(shè)備讀取的扇區(qū)數(shù)量 wr_sec/s 每秒向設(shè)備寫入的扇區(qū)數(shù)量 avgrq-sz I/O 請求的平均扇區(qū)數(shù)
        #avgqu-sz I/O 請求的平均隊列長度 await I/O 請求的平均等待時間,單位為毫秒 svctm I/O 請求的平均服務(wù)時間,單位為毫秒 %util I/O 請求所占用的時間的百分比,即設(shè)備利用率
        sar -pd 10 3 

        #
        iotop  top的io版
        iotop

        #
        查看頁面緩存信息 其中的Cached 指用于pagecache的內(nèi)存大小(diskcache-SwapCache)。隨著寫入緩存頁,Dirty 的值會增加 一旦開始把緩存頁寫入硬盤,Writeback的值會增加直到寫入結(jié)束。
        cat /proc/meminfo 

        #
        查看有多少個pdflush進(jìn)程 Linux 用pdflush進(jìn)程把數(shù)據(jù)從緩存頁寫入硬盤
        #pdflush的行為受/proc/sys/vm中的參數(shù)的控制/proc/sys/vm/dirty_writeback_centisecs (default 500): 1/100秒, 多長時間喚醒pdflush將緩存頁數(shù)據(jù)寫入硬盤。默認(rèn)5秒喚醒2個(更多個)線程。如果wrteback的時間長于dirty_writeback_centisecs的時間,可能會出問題
        cat /proc/sys/vm/nr_pdflush_threads

        #
        查看I/O 調(diào)度器
        #調(diào)度算法
        #noop anticipatory deadline [cfq] 
        #deadline :    deadline 算法保證對既定的IO請求以最小的延遲時間。
        #anticipatory:有個IO發(fā)生后,如果又有進(jìn)程請求IO,則產(chǎn)生一個默認(rèn)6ms猜測時間,猜測下一個進(jìn)程請求IO是干什么。這對于隨機(jī)讀取會造成較大的延時。對數(shù)據(jù)庫應(yīng)用很糟糕,而對于Web Server等則會表現(xiàn)不錯。
        #cfq:        對每個進(jìn)程維護(hù)一個IO隊列,各個進(jìn)程發(fā)來的IO請求會被cfq以輪循方式處理,對每一個IO請求都是公平。適合離散讀的應(yīng)用。
        #noop:        對所有IO請求都用FIFO隊列形式處理。默認(rèn)IO不會存在性能問題。
        cat /sys/block/[disk]/queue/scheduler


        #
        改變IO調(diào)度器
        $ echo deadline > /sys/block/sdX/queue/scheduler
        #提高調(diào)度器請求隊列的
        $ echo 4096 > /sys/block/sdX/queue/nr_requests

        性能相關(guān)

        #查看當(dāng)前系統(tǒng)load
        uptime

        #查看系統(tǒng)狀態(tài)和每個進(jìn)程的系統(tǒng)資源使用狀況
        top

        #可視化顯示CPU的使用狀況
        htop

        #查看每個CPU的負(fù)載信息
        mpstat -P ALL 1

        #每隔1秒查看磁盤IO的統(tǒng)計信息
        iostat -xkdz 1

        #每隔一秒查看虛擬內(nèi)存的使用信息
        vmstat 1

        #查看內(nèi)存使用統(tǒng)計信息
        free

        #查看網(wǎng)絡(luò)使用信息
        nicstat -z 1

        #類似vmstat的顯示優(yōu)化的工具
        dstat 1

        #查看系統(tǒng)活動狀態(tài),比如系統(tǒng)分頁統(tǒng)計,塊設(shè)備IO統(tǒng)計等
        sar

        #網(wǎng)絡(luò)連接狀態(tài)查看
        netstat -s

        #進(jìn)程資源使用信息查看
        pidstat 1
        pidstat -d 1

        #查看某個進(jìn)程的系統(tǒng)調(diào)用信息 -p后面是進(jìn)程id,-tttT 進(jìn)程系統(tǒng)后的系統(tǒng)調(diào)用時間
        strace -tttT -p 12670
        #統(tǒng)計IO設(shè)備輸入輸出的系統(tǒng)調(diào)用信息
        strace -c dd if=/dev/zero of=/dev/null bs=512 count=1024k


        #tcpdump 查看網(wǎng)絡(luò)數(shù)據(jù)包
        tcpdump -nr /tmp/out.tcpdump

        #塊設(shè)備的讀寫事件信息統(tǒng)計
        btrace /dev/sdb 

        #iotop查看某個進(jìn)程的IO操作統(tǒng)計信息
        iotop -bod5

        #slabtop 查看內(nèi)核 slab內(nèi)存分配器的使用信息
        slabtop -sc

        #系統(tǒng)參數(shù)設(shè)置
        sysctl -a

        #系統(tǒng)性能指標(biāo)統(tǒng)計信息
        perf stat gzip file1
        #系統(tǒng)cpu活動狀態(tài)查看
        perf record -a -g -F 997 sleep 10

        進(jìn)程相關(guān)

        ## processes  進(jìn)程管理

        #
        #ps查看當(dāng)前系統(tǒng)執(zhí)行的線程列表,進(jìn)行瞬間狀態(tài),不是連續(xù)狀態(tài),連續(xù)狀態(tài)需要使用top名稱查看  更多常用參數(shù)請使用 man ps查看
        ps

        #
        #顯示所有進(jìn)程詳細(xì)信息
        ps aux

        #
        #-u 顯示某個用戶的進(jìn)程列表
        ps -f -u www-data 

        #
        # -C 通過名字或者命令搜索進(jìn)程
        ps -C apache2

        #
        # --sort  根據(jù)進(jìn)程cpu使用率降序排列,查看前5個進(jìn)程  -pcpu表示降序  pcpu升序
        ps aux --sort=-pcpu | head -5 

        #
        #-f 用樹結(jié)構(gòu)顯示進(jìn)程的層次關(guān)系,父子進(jìn)程情況下
        ps -f --forest -C apache2 

        #
        #顯示一個父進(jìn)程的所有子進(jìn)程
        ps -o pid,uname,comm -C apache2
        ps --ppid 2359 

        #
        #顯示一個進(jìn)程的所有線程  -L 參數(shù)
        ps -p 3150 -L 

        #
        #顯示進(jìn)程的執(zhí)行時間 -o參數(shù)
        ps -e -o pid,comm,etime 

        #
        #watch命令可以用來實時捕捉ps顯示進(jìn)程
        watch -n 1 'ps -e -o pid,uname,cmd,pmem,pcpu --sort=-pmem,-pcpu | head -15' 

        #
        #jobs 查看后臺運行的進(jìn)程  jobs命令執(zhí)行的結(jié)果,+表示是一個當(dāng)前的作業(yè),減號表是是一個當(dāng)前作業(yè)之后的一個作業(yè),jobs -l選項可顯示所有任務(wù)的PID,jobs的狀態(tài)可以是running, stopped, Terminated,但是如果任務(wù)被終止了(kill),shell 從當(dāng)前的shell環(huán)境已知的列表中刪除任務(wù)的進(jìn)程標(biāo)識;也就是說,jobs命令顯示的是當(dāng)前shell環(huán)境中所起的后臺正在運行或者被掛起的任務(wù)信息
        jobs

        #
        #查看后臺運營的進(jìn)程號
        jobs -p

        #
        #查看現(xiàn)在被終止或者退出的進(jìn)程號
        jobs -n


        #
        #kill命令 終止一個前臺進(jìn)程可以使用Ctrl+C鍵   kill  通過top或者ps獲取進(jìn)程id號  kill [-s 信號 | -p ] [ -a ] 進(jìn)程號 ...
        ##發(fā)送指定的信號到相應(yīng)進(jìn)程。不指定型號將發(fā)送SIGTERM(15)終止指定進(jìn)程。關(guān)閉進(jìn)程號12的進(jìn)程
        kill 12


        #
        #等同于在前臺運行PID為123的進(jìn)程時按下Ctrl+C鍵
        kill -2 123

        #
        #如果任無法終止該程序可用“-KILL” 參數(shù),其發(fā)送的信號為SIGKILL(9) ,將強(qiáng)制結(jié)束進(jìn)程  
        kill -9 123

        #
        #列出所有信號名稱
        ##HUP    1    終端斷線
        ##INT     2    中斷(同 Ctrl + C)
        ##QUIT    3    退出(同 Ctrl + \)
        ##TERM   15    終止
        ##KILL    9    強(qiáng)制終止
        ##CONT   18    繼續(xù)(與STOP相反, fg/bg命令)
        ##STOP    19    暫停(同 Ctrl + Z)
        kill -l

        #
        #得到指定信號的數(shù)值
        kill -l KILL

        #
        #殺死指定用戶所有進(jìn)程
        kill -u peidalinux
        kill -9 $(ps -ef | grep peidalinux) 

        #
        #將后臺中的命令調(diào)至前臺繼續(xù)運行  將進(jìn)程123調(diào)至前臺執(zhí)行
        fg 123

        #
        #將一個在后臺暫停的命令,變成繼續(xù)執(zhí)行
        bg  123

        #
        #該命令可以在你退出帳戶/關(guān)閉終端之后繼續(xù)運行相應(yīng)的進(jìn)程。nohup就是不掛起的意思  下面輸出被重定向到myout.file文件中
        nohup command > myout.file 2>&1 &

        #
        #at:計劃任務(wù),在特定的時間執(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命令設(shè)定12:00執(zhí)行一項操作
        #at>useradd aaa //在at命令里設(shè)定添加用戶aaa
        #ctrl+d //退出at命令
        #tail -f /etc/passwd //查看/etc/passwd文件后十行是否增加了一個用戶aaa

        #
        #計劃任務(wù)設(shè)定后,在沒有執(zhí)行之前我們可以用atq命令來查看系統(tǒng)沒有執(zhí)行工作任務(wù)。
        atq

        #
        #啟動計劃任務(wù)后,如果不想啟動設(shè)定好的計劃任務(wù)可以使用atrm命令刪除。
        atrm 1 //刪除計劃任務(wù)1

        #
        #pstree命令:列出當(dāng)前的進(jìn)程,以及它們的樹狀結(jié)構(gòu)  格式:pstree [選項] [pid|user]
        pstree

        #
        #nice命令:改變程序執(zhí)行的優(yōu)先權(quán)等級 應(yīng)用程序優(yōu)先權(quán)值的范圍從-20~19,數(shù)字越小,優(yōu)先權(quán)就越高。一般情況下,普通應(yīng)用程序的優(yōu)先權(quán)值(CPU使用權(quán)值)都是0,如果讓常用程序擁有較高的優(yōu)先權(quán)等級,自然啟動和運行速度都會快些。需要注意的是普通用戶只能在0~19之間調(diào)整應(yīng)用程序的優(yōu)先權(quán)值,只有超級用戶有權(quán)調(diào)整更高的優(yōu)先權(quán)值(從-20~19)。
        nice [-n <優(yōu)先等級>][--help][--version][命令]
        nice -n 5 ls

        #
        #sleep命令:使進(jìn)程暫停執(zhí)行一段時間
        date;sleep 1m;date


        #
        #renice命令 renice命令允許用戶修改一個正在運行進(jìn)程的優(yōu)先權(quán)。利用renice命令可以在命令執(zhí)行時調(diào)整其優(yōu)先權(quán)。
        ##其中,參數(shù)number與nice命令的number意義相同。(1) 用戶只能對自己所有的進(jìn)程使用renice命令。(2) root用戶可以在任何進(jìn)程上使用renice命令。(3) 只有root用戶才能提高進(jìn)程的優(yōu)先權(quán)
        renice -5 -p 5200  #PID為5200的進(jìn)程nice設(shè)為-5 

        #
        #pmap命令用于顯示一個或多個進(jìn)程的內(nèi)存狀態(tài)。其報告進(jìn)程的地址空間和內(nèi)存狀態(tài)信息 #pmap PID
        pmap 20367

        javadump.sh

        #!/bin/sh

        DUMP_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;
        fi

        DUMP_ROOT=~/dump
        if [ ! -d $DUMP_ROOT ]; then
          mkdir $DUMP_ROOT
        fi

        DUMP_DATE=`date +%Y%m%d%H%M%S`
        DUMP_DIR=$DUMP_ROOT/dump-$DUMP_DATE
        if [ ! -d $DUMP_DIR ]; then
          mkdir $DUMP_DIR
        fi

        for PID in $DUMP_PIDS ; do
        #Full thread dump 用來查線程占用,死鎖等問題
          $JAVA_HOME/bin/jstack $PID > $DUMP_DIR/jstack-$PID.dump 2>&1
          echo -e ".\c"
        #打印出一個給定的Java進(jìn)程、Java core文件或遠(yuǎn)程Debug服務(wù)器的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)的相關(guān)統(tǒng)計信息。如young gc執(zhí)行的次數(shù)、full gc執(zhí)行的次數(shù),各個內(nèi)存分區(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打印共享對象的映射。對每個目標(biāo)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的堆中內(nèi)存信息輸出到一個文件中,然后可以通過eclipse memory analyzer進(jìn)行分析
        #注意:這個jmap使用的時候jvm是處在假死狀態(tài)的,只能在服務(wù)癱瘓的時候為了解決問題來使用,否則會造成服務(wù)中斷。
          $JAVA_HOME/bin/jmap -dump:format=b,file=$DUMP_DIR/jmap-dump-$PID.dump $PID 2>&1
          echo -e ".\c"
        #顯示被進(jìn)程打開的文件信息
        if [ -r /usr/sbin/lsof ]; then
          /usr/sbin/lsof -p $PID > $DUMP_DIR/lsof-$PID.dump
          echo -e ".\c"
          fi
        done
        #主要負(fù)責(zé)收集、匯報與存儲系統(tǒng)運行信息的。
        if [ -r /usr/bin/sar ]; then
        /usr/bin/sar > $DUMP_DIR/sar.dump
        echo -e ".\c"
        fi
        #主要負(fù)責(zé)收集、匯報與存儲系統(tǒng)運行信息的。
        if [ -r /usr/bin/uptime ]; then
        /usr/bin/uptime > $DUMP_DIR/uptime.dump
        echo -e ".\c"
        fi
        #內(nèi)存查看
        if [ -r /usr/bin/free ]; then
        /usr/bin/free -t > $DUMP_DIR/free.dump
        echo -e ".\c"
        fi
        #可以得到關(guān)于進(jìn)程、內(nèi)存、內(nèi)存分頁、堵塞IO、traps及CPU活動的信息。
        if [ -r /usr/bin/vmstat ]; then
        /usr/bin/vmstat > $DUMP_DIR/vmstat.dump
        echo -e ".\c"
        fi
        #報告與CPU相關(guān)的一些統(tǒng)計信息
        if [ -r /usr/bin/mpstat ]; then
        /usr/bin/mpstat > $DUMP_DIR/mpstat.dump
        echo -e ".\c"
        fi
        #報告與IO相關(guān)的一些統(tǒng)計信息
        if [ -r /usr/bin/iostat ]; then
        /usr/bin/iostat > $DUMP_DIR/iostat.dump
        echo -e ".\c"
        fi
        #報告與網(wǎng)絡(luò)相關(guān)的一些統(tǒng)計信息
        if [ -r /bin/netstat ]; then
        /bin/netstat > $DUMP_DIR/netstat.dump
        echo -e ".\c"
        fi
        echo "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
        # 網(wǎng)絡(luò)工具: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
        #
        ###################################################################################
        EOF
        printf "${RESET}\n"

        printf "\n${GREEN}>>>>>>>>> 安裝常用命令工具開始${RESET}\n"

        # 核心工具
        printf "\n${CYAN}>>>> install coreutils(df、du)${RESET}\n"
        yum install -y coreutils
        printf "\n${CYAN}>>>> install chkconfig${RESET}\n"
        yum install -y chkconfig

        # 網(wǎng)絡(luò)工具
        printf "\n${CYAN}>>>> install net-tools(ifconfig、netstat、route)${RESET}\n"
        yum install -y net-tools
        printf "\n${CYAN}>>>> install iptables${RESET}\n"
        yum install -y iptables

        # IP工具
        printf "\n${CYAN}>>>> install iputils(ping、tracepath)${RESET}\n"
        yum install -y iputils
        printf "\n${CYAN}>>>> install traceroute${RESET}\n"
        yum install -y traceroute
        printf "\n${CYAN}>>>> install iproute(ip、ss)${RESET}\n"
        yum install -y iproute

        # 端口工具
        printf "\n${CYAN}>>>> install lsof${RESET}\n"
        yum install -y lsof
        printf "\n${CYAN}>>>> install nc${RESET}\n"
        yum install -y nc
        printf "\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-utils
        printf "\n${CYAN}>>>> install whois${RESET}\n"
        yum install -y whois

        # 下載工具
        printf "\n${CYAN}>>>> install curl${RESET}\n"
        yum install -y curl
        printf "\n${CYAN}>>>> install wget${RESET}\n"
        yum install -y wget

        # 編輯工具
        printf "\n${CYAN}>>>> install emacs${RESET}\n"
        yum install -y emacs
        printf "\n${CYAN}>>>> install vim${RESET}\n"
        yum install -y vim

        # 流量工具
        printf "\n${CYAN}>>>> install iftop${RESET}\n"
        yum install -y iftop
        printf "\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 git
        printf "\n${CYAN}>>>> install subversion${RESET}\n"
        yum install -y subversion

        printf "\n${GREEN}<<<<<<<< 安裝常用命令工具結(jié)束${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
        ###################################################################################
        EOF
        printf "${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 libtool

        printf "\n${CYAN}>>>> install openssl openssl-devel${RESET}\n"
        yum -y install make openssl openssl-devel

        printf "\n${CYAN}>>>> install zlib zlib-devel${RESET}\n"
        yum -y install make zlib zlib-devel

        printf "\n${CYAN}>>>> install pcre${RESET}\n"
        yum -y install pcre

        printf "\n${GREEN}<<<<<<<< 安裝常見 lib 結(jié)束${RESET}\n"

        系統(tǒng)檢查腳本

        #!/usr/bin/env bash

        ##############################################################################
        # console color
        C_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)信息檢查腳本
        ###################################################################################
        EOF
        printf "${C_RESET}"

        [[ $(id -u) -gt 0 ]] && echo "請用root用戶執(zhí)行此腳本!" && exit 1
        sysversion=$(rpm -q centos-release | cut -d- -f3)
        double_line="==============================================================="
        line="----------------------------------------------"

        # 打印頭部信息
        printHeadInfo() {
          cat << EOF
        +---------------------------------------------------------------------------------+
        |                           歡迎使用 【系統(tǒng)信息檢查腳本】                          |
        +---------------------------------------------------------------------------------+
        EOF
        }

        # 打印尾部信息
        printFootInfo() {
          cat << EOF
        +---------------------------------------------------------------------------------+
        |                            腳本執(zhí)行結(jié)束,感謝使用!|
        +---------------------------------------------------------------------------------+
        EOF
        }

        options=( "獲取系統(tǒng)信息" "獲取服務(wù)信息" "獲取CPU信息" "獲取系統(tǒng)網(wǎng)絡(luò)信息" "獲取系統(tǒng)內(nèi)存信息" "獲取系統(tǒng)磁盤信息" "獲取CPU/內(nèi)存占用TOP10" "獲取系統(tǒng)用戶信息" "輸出所有信息" "退出" )
        printMenu() {
          printf "${C_BLUE}"
          printf "主菜單:\n"
          for i in "${!options[@]}"do
            index=`expr ${i} + 1`
            val=`expr ${index} % 2`
            printf "\t(%02d) %-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)內(nèi)核:   ${sys_kernel}
        主機(jī)名:    ${sys_hostname}
        selinux狀態(tài):  ${sys_selinux}
        系統(tǒng)語言:   ${sys_lang}
        系統(tǒng)當(dāng)前時間: ${sys_time}
        系統(tǒng)最后重啟時間:   ${sys_lastreboot}
        系統(tǒng)運行時間: ${sys_runtime}
        系統(tǒng)負(fù)載:   ${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_Kernels
        CPU型號:$CPU_Type
        CPU架構(gòu):$CPU_Arch
        EOF
        }

        # 獲取服務(wù)信息
        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
        【服務(wù)信息】
        ${service_config}
          ${line}
        運行的服務(wù):
        ${run_service}
          ${line}
        監(jiān)聽端口:
        ${port_listen}
          ${line}
        內(nèi)核參考配置:
        ${kernel_config}
        EOF
        }

        # 獲取系統(tǒng)內(nèi)存信息
        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" #內(nèi)存總?cè)萘?MB)
          report_MemFree="$((MemFree/1024))" "MB" #內(nèi)存剩余(MB)
          report_MemUsedPercent=$(free | sed -n '2p' | gawk 'x = int(( $3 / $2 ) * 100) {print x}' | sed 's/$/%/')

          cat << EOF
        【內(nèi)存信息】
        內(nèi)存總?cè)萘?MB): ${report_MemTotal}
        內(nèi)存剩余量(MB):${report_MemFree}
        內(nèi)存使用率: ${report_MemUsedPercent}
        EOF
        }

        # 獲取系統(tǒng)網(wǎng)絡(luò)信息
        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
        【網(wǎng)絡(luò)信息】
        系統(tǒng)公網(wǎng)地址:${pub_ipadd}
        系統(tǒng)私網(wǎng)地址:${pri_ipadd}
        網(wǎng)關(guān)地址:${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}
        定時任務(wù)配置:
        ${crond_config}
          ${line}
        hosts 信息:
        ${host_config}
        EOF
        }

        # 獲取CPU/內(nèi)存占用TOP10
        get_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}
        內(nèi)存占用TOP10:
        ${top_title}
          ${mem_top10}
        EOF
        }

        show_dead_process() {
          printf "僵尸進(jìn)程:\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 ;;
              "獲取服務(wù)信息")
                get_service_info ;;
              "獲取CPU信息")
                get_cpu_info ;;
              "獲取系統(tǒng)網(wǎng)絡(luò)信息")
                get_net_info ;;
              "獲取系統(tǒng)內(nèi)存信息")
                get_mem_info ;;
              "獲取系統(tǒng)磁盤信息")
                get_disk_info ;;
              "獲取CPU/內(nèi)存占用TOP10")
                get_process_top_info ;;
              "獲取系統(tǒng)用戶信息")
                get_sys_user ;;
              "輸出所有信息")
                get_all_info > sys.log
                printf "${C_GREEN}信息已經(jīng)輸出到 sys.log 中。${C_RESET}\n\n"
              ;;
              "退出")
                exit ;;
              *)
                clear
                echo "抱歉,不支持此選項" ;;
            esac
          done
        }

        ######################################## MAIN ########################################
        printHeadInfo
        main
        printFootInfo
        printf "${C_RESET}"

        sed進(jìn)階

        #!/bin/bash

        #多個空格只保留一個
        #sed '/./,/^$/!d' test

        #刪除開頭的空白行
        #sed '/./,$!d' test

        #刪除結(jié)尾的空白行
        sed '{
        :start
        /^\n*$/{$d; N; b start}
        }'
         test

        #刪除html標(biāo)簽
        #有問題
        #s/<.*>//g

        #sed 's/<[^>]*>//g' test1

        #sed 's/<[^>]*>//g;/^$/d' test1


        #and符號,代表替換命令中的匹配模式,不管預(yù)定義模式是什么文本,都可以用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/ /'

        推薦閱讀:

        拿來就用的腳本案例?。ㄈ?/span>


        7 個非常實用的 Shell 拿來就用腳本實例!


        超硬核!11 個非常實用的 Python 和 Shell 拿來就用腳本實例!

        瀏覽 53
        點贊
        評論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報
        評論
        圖片
        表情
        推薦
        點贊
        評論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            9超碰 | 免费观看黄色毛片 | 欧美乱论 | 天天日天天摸天天搞 | 免费看无码网站成人A片 | 大香蕉伊人在线网 | 国产性猛交xx乱摘基 | 国产农村寡妇高潮的毛片 | 乱淫的女高中暑假调教 | 男人添女人囗交做爰的图 |