今天看到项目里的代码,功能就是服务器到某一个地方重新下载工程文件,然后删除原来的文件,新文件解压,替换原来文件。根据不同平台做了不同的处理erlang的os:type()区分开来,window的机器就是使用的erlang的函数对文件的解压、删除、拷贝做的操作,但是在unix服务器解压成功、删除原来的文件之后,使用了linux命令,调用了os_uti模块的cmd_ansync(“***”)函数。
这样就有问题了,我们调用os_util:ansync("mv ../server_new ../")只是希望拷贝文件,然后返回了“ok”,函数返回ok的时候可能拷贝还没有完成,但是我们收到了ok这一返回值,就认为已经拷贝完成了,更新服务器文件,那么就要重启服务器了,这样就会出现问题,出现问题是乐观的情况,如果多数情况下文件拷贝完成了,这个问题就隐藏了,不知道什么时候惹出大祸。
以后自己写代码的时候一定要注意,涉及到同步、异步以及一些有严格的执行顺序的代码,一定要控制好,那怕让一个进程多等一些时间,或者等待一个返回信息。同步异步甚至都可以在函数命名中体现出来,如os_util:cmd_ansync(“***”),os_uti这些都是老板亲自写额,以后好好看看,多学习才是。