Last active
August 1, 2018 02:12
-
-
Save icejoywoo/26f0f9203c0a606da4b1 to your computer and use it in GitHub Desktop.
bash snippets
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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