下面的几个小问题是今年暑假在做项目的时候遇到的,当时也花了不少的时间去把这些问题搞清了,现在有些遗忘,把那几个问题重新翻出来,和大家一起分享一下。
经过这几天的努力,可能有那么一小点的收获,但是和实际要求可能查得还远些。下面是昨天我遇到的问题的解决,这三个问题花费的时间比较多些。
问题1总结:
在源代码中是
D = os:cmd("get_node_resource.sh") -- "\n"
但是在我的机子上是用问题的,但在我们测试的虚拟机上是正确的,后来我改成了这样:
D = os:cmd("bash /home/sunny/ECP/NodeController/priv/script/get_node_resource.sh") -- " \n\r",
在不同机子上的结果是不一样的,是版本问题,还是?
\n\r 的问题。
还有:
D = os:cmd("bash /home/sunny/ECP/NodeController/priv/script/create_vm.sh") -- "\n\r",
问题2总结:
在create_vm_cmd.erl中的
check_parm(Content)->
ture.
这里的返回结果是有问题的,不是ture,而是true.是true......
单词写错了,这个问题我花了一晚上时间找出来了,我的速度太慢了,唉。
这些细节上,我的速度有些慢。
问题3总结:
关于列表和元组的区别。
这个问题也比较纠结些,对于Resource,我发现代码中有的地方用的是列表,有的地方用的是元组,所以这个是有问题的,这个问题上我花费的时间也比较多些。
而且特别注意一下这个东西:
D = os:cmd("bash /home/sunny/ECP/NodeController/priv/script/get_node_resource.sh") -- "\n\r",
case io_lib:fread("~s~s~d~d~d~d~d", D) of
{ok,[ParseRes],_} ->
{ok,ParseRes};
这里的[ParseRes]中,不能加列表。原因是列表的个数都是固定的,所以这样是不行的。
后来,我改成了这样:
D = os:cmd("bash /home/sunny/ECP/NodeController/priv/script/get_node_resource.sh") -- "\n\r",
case io_lib:fread("~s~s~d~d~d~d~d", D) of
{ok,ParseRes,_} ->
[HostName,IpAddr,VcpuCount,StorageSize,MemorySize,FreeStorageSize,FreeMemorySize] = ParseRes,
Resource = {HostName,IpAddr,VcpuCount,StorageSize,MemorySize,FreeStorageSize,FreeMemorySize},
{ok,Resource};
这样来做的话,也有些问题,那就是如果参数发生变化的话,就要修改。但是我也没有想到什么其他解决方法。
问题4总结:
% Params = integer_to_list(VcpuCount) ++ " " ++
% integer_to_list(MemSize) ++ " " ++
% integer_to_list(DiskSize) ++ " " ++
% IpAddr ++ " " ++
% MacAddr ++ " " ++
% integer_to_list(VncPort) ++ " " ++
% integer_to_list(VmId),
% io:format("Params ~p ~n", [Params]),
这里要注意:++和--是用在列表的操作,其他的使用不了,所以这里是有问题的。
这里我改成了:
Params = lists:concat([integer_to_list(VcpuCount)," ",
integer_to_list(MemSize), " ",
integer_to_list(DiskSize)," ",
IpAddr," ",
MacAddr," ",
VncPass," ",
integer_to_list(VncPort)," ",
VmUser," ",
VmUserPass," ",
integer_to_list(VmId)]),
D = os:cmd("create_vm.sh" ++ " " ++ Params),
但是在os:cmd中++又一次可以使用了,我不清楚这个是为什么?
问题5总结:
关于erlang与shell交互,我原先以为通过接口那种形式进行交互,没有想到有现成的os:cmd可以调用,这样的话,erlang与shell交互就方便许多了,也就不需要原先那种比较复杂的程序了,呵呵~~
这个是对问题4的补充:在os:cmd()中++仍然是不能使用的,不同的版本可能结果会有写区别,但我觉得那只是巧合,昨天晚上在我的机子上运行正确的那个命令,今天在实验室机子上就出现问题了,应该这样改:
Params = lists:concat([“bash create_vm.sh ”
integer_to_list(VcpuCount)," ",
integer_to_list(MemSize), " ",
integer_to_list(DiskSize)," ",
IpAddr," ",
MacAddr," ",
VncPass," ",
integer_to_list(VncPort)," ",
VmUser," ",
VmUserPass," ",
integer_to_list(VmId)]),
D = os:cmd(Params),