shell通用部分

本篇写一些shell中共用的内容,比如shell的开头,或一些简单的开重用的模块。或者脚本执行计时、定时脚本的编写方式等等。

开头

经常写shell,shell中常用的共享的一些内容。提炼如下:

#/bin/bash

BASEDIR=$(dirname $(readlink -f "$0"))

用得最多的就是这个,做成模版,每个shell都放在第三行上。

BASEDIR=$(cd `dirname $0`;pwd)

或者,多加一些引号

DIR=$(cd "$(dirname "$0")" && pwd)

定时脚本

#!/bin/bash
# 2021年8月10日  脚本导入任务
# 01 00 * * * /path/to/myshell.sh >> /path/to/log.txt 2>&1
BASEDIR=$(cd `dirname $0`;pwd)
cd $BASEDIR
source /root/.bash_profile
export PATH=/usr/local/bin/:/usr/local/greenplum-db/bin/:$PATH

logmsg(){
    echo `date '+%Y-%m-%d %H:%M:%S'` $@
}

如果上面日志写写得好的话,能按下面的方式,提取到执行的时间点,便于排查。

grep 结束  log.txt|sed '/^结束/d;'|tr -t " " "," > time.csv

记录执行时间

start_time=$SECONDS
# 要执行的命令

echo 字段1  字段2 `expr $SECONDS - $start_time`

记录时间方式2

logtime.sh

#!/bin/bash
logmsg(){
    echo `date '+%Y-%m-%d %H:%M:%S'` $@
}

while read line;do logmsg $line;done

测试,增加时间显示

for i in `seq 1 100`;do echo $i;sleep 1 ;done|./logtime.sh 

#for i in ` cat /yd/td2/runtime/cron/log.txt`;do echo $i;sleep 1 ;done|./logtime.sh
while read line;do echo $line;sleep 1;done < /yd/td2/runtime/cron/log.txt |./logtime.sh

将日志通过udp发送到其他的机器上

# 服务端 用来显示
socat - udp4-listen:5220,reuseaddr,fork
# 客户端,即日志的产生端
while read line;do echo $line;sleep 1;done < /yd/td2/runtime/cron/log.txt|./logtime.sh |socat - udp:localhost:5220

如果服务端,停止,客户端整体都会停止掉。这显然不科学。

另外,也可以将一个日志,拷贝一份,别增加时间戳,或通过管道做其他的事

tail -f mylog.txt|./logtime.sh
# 反过来应该也是可以的
./logtime.sh < tail -f mylog.txts