我正在编写一个应该启动分布式erlang应用程序的几个节点的脚本(尽管在同一台机器上)。这是代码的精简示例:
start_extra_node() {
echo "starting node $1"
port=$((14195+$1))
mystartcommand -p $port -n node$1 --daemonize
res=$?
if [ $res -ne 0 ]; then
echo "ERROR: could not start extra VM node $1"
exit
fi
return $res
}
make_run() {
echo " "
echo "----------------------------------------------"
echo "making run with $3 nodes"
start=$2
end=$(($3-1))
echo "$start $end"
for i in $(seq -s " " $start $end); do
echo "start node $i"
start_extra_node $i
done
}
case $# in
0)
usage;;
1)
echo "starting node that runs the function st:$1 ..."
start_api_node $1;;
2)
echo "running evaluation on 1 to $2 nodes"
for i in `seq -s " " 1 $2`; do
echo "make_run $1 1 $i"
make_run $1 1 $i
done
;;
esac
使用2个参数调用脚本:第一个参数在此处不重要。第二个参数是最大节点数。该脚本应该在1到2个节点上运行一个函数。
假设我使用bash myscript foo 3
启动脚本:
根据mystartcommand -p $port -n node$1 --deamonize
中start_extra_node
的存在,make_run
中的for循环表现不同。
如果我将其留在port=$((14195+$1))
失败,因为$ 1评估为1 2
。如果我注释掉mystart...
,则算术表达式不会失败,因为$ 1会按预期评估为1
然后2
。
以下是mystartcommand...
的示例输出:
>bash myscript foo 3
...[snip]
making run with 3 nodes
1 2
start node 1 2
starting node 1 2
eval_mr.sh: Zeile 17: 14195+1 2: Syntaxerror in expression.
和mystart...
被注释掉的地方:
>bash myscript foo 3
...[snip]
making run with 3 nodes
1 2
start node 1
starting node 1
start node 2
starting node 2
我不知道如何进一步调试这个。我会感谢任何领导。
编辑 deamonize to daemonize
答案 0 :(得分:2)
很难想象这真的来自遗漏mystartcommand
。它必须与$IFS
内容有关。
您可以尝试替换
for i in $(seq -s " " $start $end); do
与
for ((i=$start; i<=$end; $i++)); do
为了有一个真正的循环。