Skip to content

Instantly share code, notes, and snippets.

@icejoywoo
Last active August 1, 2018 02:12
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save icejoywoo/26f0f9203c0a606da4b1 to your computer and use it in GitHub Desktop.
Save icejoywoo/26f0f9203c0a606da4b1 to your computer and use it in GitHub Desktop.
bash snippets
#!/bin/bash
# 显示脚本的各种调用命令
set -x
# 一但有任何一个语句返回非真的值,则退出bash
set -e
# 你使用未初始化的变量时,让bash自动退出
set -u
SCRIPT_PATH="${BASH_SOURCE[0]}";
while([ -L "${SCRIPT_PATH}" ]); do
cd "`dirname "${SCRIPT_PATH}"`"
SCRIPT_PATH="$(readlink "$(basename "${SCRIPT_PATH}")")";
done
cd "$(dirname "${SCRIPT_PATH}")" > /dev/null
SCRIPT_PATH="$(pwd)";
# 获取当前路径
CURRENT_DIR=$(cd `dirname $0`; pwd)
CURRENT_DIR=$(cd $(dirname ${BASH_SOURCE[0]}); pwd)
# 赋值变量的方法
TEST_ENV=${TEST_ENV:-"$CURRENT_DIR/../../test"}
# 简单的日志打印封装
LOG_FILE="$CURRENT_DIR/xxx.log"
# print log to stdout and log file
function log()
{
echo "`date +"%Y-%m-%d %H:%M:%S"` $@"
echo "`date +"%Y-%m-%d %H:%M:%S"` $@" >> $LOG_FILE
}
# 仅 bash 支持,<(cmd) 可以将 cmd 的输出作为一个文件参数,可以避免临时文件
cat <(ls)
# 在子进程中后台执行,没有 & 表示子进程执行
(ls)&
# 端口检测
# 检查端口是否被监听, 作为服务启动的标志
# check_port_listening $port
function check_port_listening
{
max_check_times=20
left_check_times=$max_check_times
while [[ $left_check_times -gt 0 ]]
do
count=`netstat -anl 2>/dev/null | awk '/^tcp.*LISTEN/{split($4,addr,":");print addr[2]}' 2>/dev/null | grep -c "^$1$"`
if [[ count -ne "0" ]]; then
return $count
else
((left_check_times--))
sleep 1
fi
done
# 没找的时候计数是0, 逻辑会到这里
return 0
}
# 杀死pid的进程
# stop_process $pid_file
function stop_process()
{
pid=$1
shift
# 最大重试次数
max_check_times=20
left_check_times=$max_check_times
while [[ $left_check_times -gt 0 ]]
do
# 判断进程是否还活着, 死了就把pid文件删掉
if [ `ps -ef|grep $pid|wc -l` != "0" ];then
kill $pid
else
# 查看pid和pid_file是否匹配, 匹配就删除, 防止误删
if [[ -f $pid_file && $pid -eq `cat $pid_file` ]]; then
rm -f $pid_file
fi
break
fi
((left_check_times--))
# 等待一下
sleep 1
done
# 最后来一次kill -9, 保证杀死释放端口
if [ `ps -ef|grep $pid|wc -l` != "0" ];then
kill -9 $pid
# 查看pid和pid_file是否匹配, 匹配就删除, 防止误删
if [[ -f $pid_file && $pid -eq `cat $pid_file` ]]; then
rm -f $pid_file
fi
fi
}
# 日期遍历
start="2015-09-16"
end="2015-11-15"
# 正序
for ((i=0;`date -d "$start +$i days" +%s`<=`date -d "$end" +%s`;i++))
do
log_date=`date -d "$start +$i days" +%Y%m%d`
echo $log_date
done
# 逆序
for ((i=0;`date -d "$end -$i days" +%s`>=`date -d "$start" +%s`;i++))
do
log_date=`date -d "$end -$i days" +%Y%m%d`
echo $log_date
done
# colour macros
if [ -t 1 ]
then
BLACK="$( echo -e "\e[30m" )"
RED="$( echo -e "\e[31m" )"
GREEN="$( echo -e "\e[32m" )"
YELLOW="$( echo -e "\e[33m" )"
BLUE="$( echo -e "\e[34m" )"
PURPLE="$( echo -e "\e[35m" )"
CYAN="$( echo -e "\e[36m" )"
WHITE="$( echo -e "\e[37m" )"
NORMAL="$( echo -e "\e[0m" )"
fi
_black() { echo "$BLACK""$@""$NORMAL";}
_red() { echo "$RED""$@""$NORMAL";}
_green() { echo "$GREEN""$@""$NORMAL";}
_yellow() { echo "$YELLOW""$@""$NORMAL";}
_blue() { echo "$BLUE""$@""$NORMAL";}
_purple() { echo "$PURPLE""$@""$NORMAL";}
_cyan() { echo "$CYAN""$@""$NORMAL";}
_white() { echo "$WHITE""$@""$NORMAL";}
# shell array
pid=()
index=0
# shell function
function run
{
sleep ${1} >/dev/null 2>&1 </dev/null &
pid[$[index++]]=$!
}
run 1
run 2
run 3
run 4
run 5
run 6
# 等待所有pid
for ((i=0;i<${index};i++))
do
echo ${pid[$i]}
wait ${pid[$i]} || echo "${pid[$i]} finished already."
done
# 并发执行多个命令
tmpfile=$$.fifo
mkfifo $tmpfile
exec 4<>$tmpfile
rm $tmpfile
procs=$1
s=`ls test*.py`
seq=($s)
#
{
for (( i = 1;i<=${procs};i++ ))
do
echo;
done
} >&4
for id in ${seq[*]}
do
read
(sh run_one_case.sh ${id};echo >&4) &
done <&4
wait
# 关闭文件描述符
exec 4>&-
rm -f $tmpfile
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment