公司内网一台服务器需要向外网服务器上传文件,为方便操作,所以做了个用PHP和SHELL管理RSYNC同步上传的东西
用户选择本地目录中需要上传的文件或文件夹,点击“传送”,然后PHP脚本将这些文件保存入库,将其状态改为“等待”,之后执行SHELL脚本,该脚本将连接数据库,查询状态为“等待”的文件后,依次执行RSYNC,并将其状态改为“传送中”,待传送完成后将其状态改为“完成”,并且该脚本开始时还将其本身的进程ID等信息存入库中,并将该条记录状态改为“执行中”,待该SHELL执行到最后将其状态改为“完成”
由于用户在传送过程中,可能“传送中”的文件需要更新,或继续添加传送文件,所以用户可以点击“中断传送”,然后将执行中断传送的SHELL脚本,该脚本将查询出当前“执行中”的脚本进程号,并且根据进程号,KILL掉该进程及其派生出来的所有子进程,并将该脚本进程记录修改为“用户中止”,以及将“传送中”文件的状态修改为“传送中止”(方便再次传送时优先上传,以及删除时执行删除脚本),“等待”的文件修改为“等待中止”。
用户在中止上传过程中,可能正好需要更新当前“传送中”的文件,则可以删除该文件,并且重新选择上传,删除时,将执行一个删除脚本,直接将远程服务器的该文件删除掉(这里由于RSYNC的remove-sent-files需要同步本地,则直接采用rm操作),再将库中该条记录删除掉,而“等待中止”的文件删除直接将库中记录删除。