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