在这里插入代码片local.sh的内容如下:
#!/bin/bash
# set -x
if [ $# -lt 3 ]; then
echo "usage: $0 num_servers num_workers bin [args..]"
exit -1;
fi
export DMLC_NUM_SERVER=$1
shift
export DMLC_NUM_WORKER=$1
shift
bin=$1
shift
arg="$@"
# start the scheduler
export DMLC_PS_ROOT_URI='127.0.0.1'
export DMLC_PS_ROOT_PORT=8000
export DMLC_ROLE='scheduler'
${bin} ${arg} &
# start servers
export DMLC_ROLE='server'
for ((i=0; i<${DMLC_NUM_SERVER}; ++i)); do
export HEAPPROFILE=./S${i}
${bin} ${arg} &
done
# start workers
export DMLC_ROLE='worker'
for ((i=0; i<${DMLC_NUM_WORKER}; ++i)); do
export HEAPPROFILE=./W${i}
${bin} ${arg} &
done
wait
分段分析
if [ $# -lt 3 ]; then
echo "usage: $0 num_servers num_workers bin [args..]"
exit -1;
fi
如果命令行输入参数的参数少于3个,就打印usage: $0 num_servers num_workers bin [args..]
,并且退出程序,其中$#代表输入参数个数,$0代表脚本名称
export DMLC_NUM_SERVER=$1
shift
export DMLC_NUM_WORKER=$1
shift
bin=$1
shift
arg="$@"
定义DMLC_NUM_SERVER为输入的第一个参数,并导入,shift
让输入的参数左移,因此export DMLC_NUM_WORKER=$1
代表DMLC_NUM_WORKER为输入的第二个参数。继续左移,第三个参数为运行的二进制程序为,剩下的参数都是args
export DMLC_ROLE='server'
for ((i=0; i<${DMLC_NUM_SERVER}; ++i)); do
export HEAPPROFILE=./S${i}
${bin} ${arg} &
done
以启动server为例,export HEAPPROFILE=.S${i}
是gperftools工具配置分析文件存放位置
${bin} ${arg} &
是启动server进程,& 放在命令后面表示设置此进程为后台进程,如果DMLC_NUM_SERVER=3,那么就会开启子进程,可以看作是多进程并行
默认情况下,进程是前台进程,这时此进程(命令执行相当于本质是开启一个进程)就把Shell给占据了,我们无法进行其他操作,对于那些没有交互的进程,很多时候,我们希望将其在后台启动,可以在启动参数的时候加一个’&'实现这个目的。
wait [作业指示或进程号]
- 等待作业号或者进程号制定的进程退出,返回最后一个作业或进程的退出状态状态。如果没有制定参数,则等待所有子进程的退出,其退出状态为0
- 如果是shell中等待使用wait,则不会等待调用函数中子任务。在函数中使用wait,则只等待函数中启动的后台子任务。
- bash在shell中使用wait命令,相当于高级语言里的多线程同步。
#!/bin/bash
sleep 10 &
sleep 5&
wait
该脚本等待10s后退出