Linux常用实用运维脚本命令分享
2023-1-9 08:32:27 Author: 天驿安全(查看原文) 阅读量:11 收藏

#查看僵尸进程

ps -al | gawk '{print $2,$4}' | grep Z

# 匹配电子邮件的地址

cat index.html | egrep -o "[A-Za-z0-9._][email protected][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 

#纯文本形式下载网页

lynx -dump www.baidu.com > plain.txt

#只打印HTTP头部信息,无须远程下载文件

curl --head www.baidu.com

#使用POST提交数据

curl -d "param2=nickwolfe¶m2=12345" http://www.linuxidc.com/login.cgi

#显示分组途经的网关

traceroute www.baidu.com

#列出系统中的开放端口以及运行在端口上的服务

lsof -i 

#nc命令建立socket连接

#设置监听 nc -l 5555

#连接到套接字 nc 192.0.0.1 5555

#快速文件传输

#接收端 nc -l 5555 > destination_filename

#发送端 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为数字,r为降序,k指定列

#向终端中的所有登陆用户发送广播信息

cat message.txt | wall

#创建新的screen窗口

screen

#打印所有的.txt和.pdf文件

find . \( -name "*.txt" -o -name "*.pdf" \) -print

# -exec command {} \;是连用的,所有符合的都会放置在{}中,去执行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"

# 数据库数据目录 #

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 "创建数据库 $db 全量备份目录 $backup_dir 失败"; continue; }

            note "数据库 $db 全量备份目录 $backup_dir  不存在,创建完成";

        fi

        note "full backup $db start ..."

        mysqldump --user=${USER} --password=${PASSWORD} --flush-logs --skip-lock-tables --quick $db > $backup_file || { warning "数据库 $db 备份失败"; continue; }

        cd $backup_dir

        tar -cPzf $filename".tar.gz" $filename".sql"

        rm -f $backup_file

        chown -fR mysql:mysql $backup_dir

        note "数据库 $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 "创建数据库 $db 增量备份目录 $backup_dir 失败"; continue; }

                note "数据库 $db 增量备份目录 $backup_dir  不存在,创建完成";

            fi

            note "increment backup $db form time $StartTime start ..."

            mysqlbinlog -d $db --start-datetime="$StartTime" $DATA_DIR/$i >> $backup_file || { warning "数据库 $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 "数据库 $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

# 目标文件名

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

#用途:根据网络配置对网络地址192.168.0进行修改,检查是否是活动状态

#{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

    )&

done

wait

#并行ping,加速

磁盘IO检查命令

##iostat是查看磁盘活动统计情况

##显示所有设备负载情况 r/s:  每秒完成的读 I/O 设备次数。即 rio/s;w/s:  每秒完成的写 I/O 设备次数。即 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)读取的数据量;kB_wrtn/s:每秒向设备(drive expressed)写入的数据量;kB_read:读取的总数据量;kB_wrtn:写入的总数量数据量;

iostat -d -k 1 1

#查看设备使用率(%util)、响应时间(await)

iostat -d -x -k 1 1

#查看CPU状态

iostat -c 1 3

#统计进程(pid)的stat,进程的stat自然包括进程的IO状况

pidstat

#只显示IO

pidstat -d  1 

#-d IO 信息,-r 缺页及内存信息-u CPU使用率-t 以线程为统计单位1  1秒统计一次

pidstat -u -r -d -t 1

#文件级IO分析,查看当前文件由哪些进程打开

lsof   

ls /proc/pid/fd

#利用 sar 报告磁盘 I/O 信息DEV 正在监视的块设备 tps 每秒钟物理设备的 I/O 传输总量 rd_sec/s 每秒从设备读取的扇区数量 wr_sec/s 每秒向设备写入的扇区数量 avgrq-sz I/O 请求的平均扇区数

#avgqu-sz I/O 请求的平均队列长度 await I/O 请求的平均等待时间,单位为毫秒 svctm I/O 请求的平均服务时间,单位为毫秒 %util I/O 请求所占用的时间的百分比,即设备利用率

sar -pd 10 3 

#iotop  top的io版

iotop

#查看页面缓存信息 其中的Cached 指用于pagecache的内存大小(diskcache-SwapCache)。随着写入缓存页,Dirty 的值会增加 一旦开始把缓存页写入硬盘,Writeback的值会增加直到写入结束。

cat /proc/meminfo 

#查看有多少个pdflush进程 Linux 用pdflush进程把数据从缓存页写入硬盘

#pdflush的行为受/proc/sys/vm中的参数的控制/proc/sys/vm/dirty_writeback_centisecs (default 500): 1/100秒, 多长时间唤醒pdflush将缓存页数据写入硬盘。默认5秒唤醒2个(更多个)线程。如果wrteback的时间长于dirty_writeback_centisecs的时间,可能会出问题

cat /proc/sys/vm/nr_pdflush_threads

#查看I/O 调度器

#调度算法

#noop anticipatory deadline [cfq] 

#deadline :    deadline 算法保证对既定的IO请求以最小的延迟时间。

#anticipatory:有个IO发生后,如果又有进程请求IO,则产生一个默认6ms猜测时间,猜测下一个进程请求IO是干什么。这对于随机读取会造成较大的延时。对数据库应用很糟糕,而对于Web Server等则会表现不错。

#cfq:        对每个进程维护一个IO队列,各个进程发来的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

性能相关命令

#查看当前系统load

uptime

#查看系统状态和每个进程的系统资源使用状况

top

#可视化显示CPU的使用状况

htop

#查看每个CPU的负载信息

mpstat -P ALL 1

#每隔1秒查看磁盘IO的统计信息

iostat -xkdz 1

#每隔一秒查看虚拟内存的使用信息

vmstat 1

#查看内存使用统计信息

free

#查看网络使用信息

nicstat -z 1

#类似vmstat的显示优化的工具

dstat 1

#查看系统活动状态,比如系统分页统计,块设备IO统计等

sar

#网络连接状态查看

netstat -s

#进程资源使用信息查看

pidstat 1

pidstat -d 1

#查看某个进程的系统调用信息 -p后面是进程id,-tttT 进程系统后的系统调用时间

strace -tttT -p 12670

#统计IO设备输入输出的系统调用信息

strace -c dd if=/dev/zero of=/dev/null bs=512 count=1024k

#tcpdump 查看网络数据包

tcpdump -nr /tmp/out.tcpdump

#块设备的读写事件信息统计

btrace /dev/sdb 

#iotop查看某个进程的IO操作统计信息

iotop -bod5

#slabtop 查看内核 slab内存分配器的使用信息

slabtop -sc

#系统参数设置

sysctl -a

#系统性能指标统计信息

perf stat gzip file1

#系统cpu活动状态查看

perf record -a -g -F 997 sleep 10

进程相关命令

## processes  进程管理

##ps查看当前系统执行的线程列表,进行瞬间状态,不是连续状态,连续状态需要使用top名称查看  更多常用参数请使用 man ps查看

ps

##显示所有进程详细信息

ps aux

##-u 显示某个用户的进程列表

ps -f -u www-data 

## -C 通过名字或者命令搜索进程

ps -C apache2

## --sort  根据进程cpu使用率降序排列,查看前5个进程  -pcpu表示降序  pcpu升序

ps aux --sort=-pcpu | head -5 

##-f 用树结构显示进程的层次关系,父子进程情况下

ps -f --forest -C apache2 

##显示一个父进程的所有子进程

ps -o pid,uname,comm -C apache2

ps --ppid 2359 

##显示一个进程的所有线程  -L 参数

ps -p 3150 -L 

##显示进程的执行时间 -o参数

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命令执行的结果,+表示是一个当前的作业,减号表是是一个当前作业之后的一个作业,jobs -l选项可显示所有任务的PID,jobs的状态可以是running, stopped, Terminated,但是如果任务被终止了(kill),shell 从当前的shell环境已知的列表中删除任务的进程标识;也就是说,jobs命令显示的是当前shell环境中所起的后台正在运行或者被挂起的任务信息

jobs

##查看后台运营的进程号

jobs -p

##查看现在被终止或者退出的进程号

jobs -n

##kill命令 终止一个前台进程可以使用Ctrl+C键   kill  通过top或者ps获取进程id号  kill [-s 信号 | -p ] [ -a ] 进程号 ...

##发送指定的信号到相应进程。不指定型号将发送SIGTERM(15)终止指定进程。关闭进程号12的进程

kill 12

##等同于在前台运行PID为123的进程时按下Ctrl+C键

kill -2 123

##如果任无法终止该程序可用“-KILL” 参数,其发送的信号为SIGKILL(9) ,将强制结束进程  

kill -9 123

##列出所有信号名称

##HUP    1    终端断线

##INT     2    中断(同 Ctrl + C)

##QUIT    3    退出(同 Ctrl + \)

##TERM   15    终止

##KILL    9    强制终止

##CONT   18    继续(与STOP相反, fg/bg命令)

##STOP    19    暂停(同 Ctrl + Z)

kill -l

##得到指定信号的数值

kill -l KILL

##杀死指定用户所有进程

kill -u peidalinux

kill -9 $(ps -ef | grep peidalinux) 

##将后台中的命令调至前台继续运行  将进程123调至前台执行

fg 123

##将一个在后台暂停的命令,变成继续执行

bg  123

##该命令可以在你退出帐户/关闭终端之后继续运行相应的进程。nohup就是不挂起的意思  下面输出被重定向到myout.file文件中

nohup command > myout.file 2>&1 &

##at:计划任务,在特定的时间执行某项工作,在特定的时间执行一次。

## 格式: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执行一项操作

#at>useradd aaa //在at命令里设定添加用户aaa

#ctrl+d //退出at命令

#tail -f /etc/passwd //查看/etc/passwd文件后十行是否增加了一个用户aaa

##计划任务设定后,在没有执行之前我们可以用atq命令来查看系统没有执行工作任务。

atq

##启动计划任务后,如果不想启动设定好的计划任务可以使用atrm命令删除。

atrm 1 //删除计划任务1

##pstree命令:列出当前的进程,以及它们的树状结构  格式:pstree [选项] [pid|user]

pstree

##nice命令:改变程序执行的优先权等级 应用程序优先权值的范围从-20~19,数字越小,优先权就越高。一般情况下,普通应用程序的优先权值(CPU使用权值)都是0,如果让常用程序拥有较高的优先权等级,自然启动和运行速度都会快些。需要注意的是普通用户只能在0~19之间调整应用程序的优先权值,只有超级用户有权调整更高的优先权值(从-20~19)。

nice [-n <优先等级>][--help][--version][命令]

nice -n 5 ls

##sleep命令:使进程暂停执行一段时间

date;sleep 1m;date

##renice命令 renice命令允许用户修改一个正在运行进程的优先权。利用renice命令可以在命令执行时调整其优先权。

##其中,参数number与nice命令的number意义相同。(1) 用户只能对自己所有的进程使用renice命令。(2) root用户可以在任何进程上使用renice命令。(3) 只有root用户才能提高进程的优先权

renice -5 -p 5200  #PID为5200的进程nice设为-5 

##pmap命令用于显示一个或多个进程的内存状态。其报告进程的地址空间和内存状态信息 #pmap PID

pmap 20367


文章来源: http://mp.weixin.qq.com/s?__biz=MzkxNjIxNDQyMQ==&mid=2247493970&idx=1&sn=7fa8b327232485fdb25dc52b3c255280&chksm=c151eea8f62667bef99c17cec10ac6ee55aed0157ef81f28791c1d87e1a205177f81dfc537ec#rd
如有侵权请联系:admin#unsafe.sh