一次linux可选择性实时同步
使用到的工具:
python
when-change
可选 expect
下载安装when-changed后用when-change -r -v -1 /home/夏天 python test.py %f
%f 返回发生变化文件的路径
执行发现when-changed的反馈信息格式
==> '/home/f夏天/wc-test/1/2/2a.yml' modified <==
==> '/home/夏天/wc-test/1/2/New File' deleted <==
并且反馈完后端持续在when-change的控制窗口,等待监听下一次文件修改反馈
scp 免密码
给python加上scp执行命令后发现scp通过私钥链接同步机器需要键入密码
故将私钥加入免键入ssh里,执行过程
ssh-agent bash #开启模式?好像是
ssh-add id_dsa #添加私钥
ssh-add -l #查看已添加私钥
###第一次scp新机器时需要手动执行一次并且键入关键词以添加信任###
python input错误
给puthon加上被动同步判断
for i in range(len(path)):
print "%s. %s" % (i, path[i])
try:
line = input("请键入不同步的序号: ")
except SyntaxError, e:
line = ""
if line:
split = line.split(" ")
ids = []
for input in split:
index = int(input)
if index >= len(path):
print "不存在的序号 %s" % index
continue
ids.append(index)
ids.sort(reverse=True)
for id in ids:
del path[id]
执行发现无法获取到input的序号,测试后得出问题为when-changed在包装时把input部分给包装成了str,故将input转换为str
解决方案:
line = str(input("请键入不同步的序号: "))
when-change 参数-1
成功进行单次同步后发现调用python时when-changed就停止截取文件是否更新了
解决方案:去掉when-changed的控制参数-1,此参数意义为:如果在运行命令时文件发生了更改,不重新运行命令
scp上载目标机器无相应目录
多次测试后发现scp上载文件时若目标机器无相应文件目录则会返回未知目录报错
修复方案:
1-1用python的os.system 执行ssh远程指令创建目录
1-2再程序化执行scp指令
ssh user@ftpserver.com 'mkdir -p %s' #%s为pyhon传过来的路径变量
#mkdir的 -p 参数为递归创建目录
无法识别文件更新状态
测试中还发现when-changed返回变量%f只能返回路径,无法返回文件的更新状态【更新状态:创建,删除,修改】,加上变量-vvv后可在控制窗扣内发现when-changed自带控制台返回了
==> '/home/夏天/wc-test/1/2/2t.yml' modified at 2021-05-06 21:09:51.365490, running 'python /home/fuzhu/夏天/testscp.py %f' <==
格式为: 路径-更新状态-修改时间-执行程序- 执行代码
解决方案:
思路python(when-changed(python))
利用python的os.system执行when-changed指令,这样就能get到文件路径更新状态,python判断关键词进行是否执行删除ssh远程指令,否的情况就执行mkdir -p和scp指令
被同步机删除文件出现空文件夹
删除文件行为同步后会出现较多的空文件夹
解决方案:
使用find找出空文件夹并删除
设定crontab定时执行
find /home/夏天 -type d -empty | xargs rm -rf
这样唯一的坏处是无法递归删除空文件夹,可以执行多次也可以另外写递归shell
总结
when-changed最大问题无法检测到创建文件,建议本地构建完成文件后传输到同步机再进行同步;
when-changed可能大概应该还是没有watchman好用