所谓服务器,大致也就是这个样子了。接下来还需要实现一个协议,待续
写这个东西的初衷,是为了解决任务的调度问题。
任务依赖资源,任务也会产生资源。client在server上注册“interesting some resources”;client产生资源后,给server “resource ready”通知,server转发 notify给所有的关注者
直接可运行的示例脚本见附件,我的运行环境centOS5.5
#!/bin/sh #这个是服务器和客户端都需要的,绑定通信通道 Q="/tmp/Q$$" if [ -p $Q ] then echo "fifo [$Q] already exists" exit -1 fi #只能由服务器端来创建(mkfifo) mkfifo $Q #服务器的部分,listen负责接收请求,并作简单的处理(如协议解析之类的工作) listen(){ while : do read msg if [ "$msg" = "exit" ] then exit 0 elif [ "$msg" = "" ] then continue else accept "$msg" fi done <$Q } #覆盖accept来实现实际的功能 accept(){ echo "recv [$1]" } #启动服务 trap "" HUP INT QUIT TSTP { echo "s: $$.$!" listen }& wait rm -rf $Q echo 'done' exit 0
#客户端的部分,发送请求 send(){ msg=$* if [ -p $Q ] then echo $msg >$Q & else echo "fifo [$Q] no exists" return -1 fi } { echo "c: $$.$!" for i in `seq 0 5` do send "hello ${i}" sleep 3s done # sleep 15s exit 0 }& #echo 'exit' >$Q &
工具utils.sh:
left(){ str=$1 len=$2 pad=$3 len=$(($len - `expr length $str`)) while [ $len -gt 0 ] do str="${pad}${str}" len=$(($len - 1)) done #log "[$1] [$2] [$3] > [$str]" echo $str } if [ "$LOG_FILE" == "" ] then echo "LOG_FILE is required" exit -1 fi touch $LOG_FILE log(){ msg=$1 echo "`date '+%Y-%m-%d %H:%M:%S'` - $$ $msg" >> $LOG_FILE return 0 }