Fork me on GitHub

标签 shell 下的文章

并行执行任务的 shell 脚本

工作中有时会需要跑一些任务处理的脚本,其处理的任务相对单一,但数据量大,导致单次运行脚本的时间比较长,如果任务是互相独立并且是可以分片的,那么,并行处理无疑是更快的方式。

在 shell 中,可以使用管道,生产者-消费者模型来实现任务的并行处理。下面提供一个 shell 脚本,自定义其中的 run 函数,可以实现指定并发度的并行:

#!/bin/sh

# 定义同时执行的任务数量,相当于并发度
SUB_PROCESS_NUM=20

# 参数解析,-s: 设置SUB_PROCESS_NUM,即并发度; -h: 输出帮助信息
while getopts :s:h opt
do
    case $opt in
        s) let SUB_PROCESS_NUM=OPTARG+0 ;;
        h) echo -e "Usage\n"
           echo -e "\t$0\t-s\tCocurrnet subprocess num\n"
           echo -e "\t\t\t-h\tPrint this help info\n"
           echo -e "\tAny questions pls feel free to contact  frostmourn716@gmail.com\n"
           exit 0;;
        *) echo "unknown option: $opt" ;;
    esac
done

#准备命名管道
tmpfile="$$.fifo"
mkfifo $tmpfile
exec 6<>$tmpfile
rm -rf $tmpfile

#producer写入任务标记
for ((i=1; i<=$SUB_PROCESS_NUM; i++))
do
    echo "sub job"
done >&6

# 需要自定义的任务函数,比如这里是发送请求
run(){
    ts=`date +%y%m%d%H%I%S`
    echo -e "$ts\tprocess $1"
    curl -s -X POST --data-urlencode "content@$1" --data-urlencode "id=$RANDOM" "http://*.*.*.*:8080/test.php" >/dev/null 2>&1
}

# 具体分配执行任务的代码,以处理图片为例,遍历图片,以指定的并发度处理任务
# 每个任务执行结束之后会将标记写入管道,当管道中存在任务标记时,代码会读出并且启动下一个任务
for image in `ls ./images/*`
do
    read line
    (run "${image}" >> ./log 2>&1; echo "sub job") >&6 &
done <&6

一些 shell 片段

记录一些 shell 片段,日常运维开发工作中方便使用:

  1. IP 列表排序

    sort -t'.' -k1,1n -k2,2n -k3,3n -k4,4n
  2. shell 命令获取唯一 id 的一种方法

    openssl rand -hex 12
  3. 获取使用了特定文件的进程 ID

    /sbin/fuser -v [文件路径]
  4. 添加帐号与删除帐号

    #!/bin/bash
    USERNAME=$1
    PASSWD=$2
    echo "adding user ${USERNAME}..."
    useradd -d /data/${USERNAME} -m ${USERNAME} && echo ${PASSWD} | passwd --stdin ${USERNAME} && chmod 755 /data/${USERNAME} && echo "succeed"
    userdel -r ${USERNAME}
  5. 转置文件(每行列数相同)

    #!/bin/bash
    awk 'BEGIN{ORS=""} {
        for(i=1;i<=NF;++i){
            contents[i,NR]=$i;}
        } 
        END{for(x=1;x<=NF;++x){
                for(y=1;y<=FNR;++y){
                    print contents[x,y];
                    if(y<FNR){print " ";
                }
            };
            if(x<NF){print "\n";}
    }}' file.txt

一些有用的 Github 小项目

记录一些有用的 Github 工具类型的项目,经常需要的时候找不到,现找又很费时间,记录在此:

  • 代理列表:https://github.com/fate0/proxylist,包含国内外的透明、匿名、高匿的 http 和 https 代理,7分钟更新一次。顺道提供一段脚本,自动解析属地在中国的高匿 https 代理,如下:

    #!/bin/sh
    curl -s 'https://raw.githubusercontent.com/fate0/proxylist/master/proxy.list#' | grep 'high_anonymous' | grep '"CN"' | grep '"https"' | awk 'BEGIN{OFS=":"} {if(match($0, /\"host\": \"([0-9\.]+)\".*\"port\": ([0-9]+)/, a)){print a[1], a[2]}; if(match($0, /\"port\": ([0-9]+),.*\"host\": \"([0-9\.]+)\"/, a)){print a[2], a[1]};}'
  • 超级速查表:https://github.com/skywind3000/awesome-cheatsheets,常用命令小卡片,主要包括 Bash,GDB,VIM 等
  • 待更新...