Linux定时增量更新文件--转
http://my.oschina.net/immk/blog/193926
動(dòng)機(jī)與需求:現(xiàn)在有兩臺(tái)服務(wù)器A和B,由于A的存儲(chǔ)隨時(shí)會(huì)掛(某些原因),所以需要B機(jī)器上有A的備份,并且能夠與A同步更新
一、crontab定時(shí)任務(wù)
發(fā)現(xiàn)了crontab這個(gè)東西
簡(jiǎn)單實(shí)踐了一下,把使用的過程寫到下面:
首先是編輯一個(gè)文件,這個(gè)文件在一個(gè)很不好找的位置,但crontab提供了一個(gè)命令可以直接用vi打開這個(gè)文件
crontab -e
文件打開以后要在文件末尾加上一行:
* * * * * mkdir /usr/local/test >/home/log.txt 2>&1
總共分為三個(gè)部分,首先是5個(gè)星星,格式是?分鐘?小時(shí)?日期?月份?星期幾
舉個(gè)例子應(yīng)該就明白了:
59 23 * * 5
這個(gè)意思是每周五的23點(diǎn)59分執(zhí)行一下后面的這個(gè)命令
mkdir /usr/local/test
就是要執(zhí)行的命令
>/home/log.txt 2>&1
則是指定命令執(zhí)行時(shí)輸出的信息放到/home/log.txt這個(gè)文件里,2>&1是指將標(biāo)準(zhǔn)輸出轉(zhuǎn)換到文件流
?
如果只有命令而不指定輸出日志文件的話,在crontab的日志里可能會(huì)報(bào)錯(cuò):
?(CRON) info (No MTA installed, discarding output)
這是因?yàn)槟愕臋C(jī)器沒有安裝任何的郵件發(fā)送的軟件,也就是MTA,而crontab是默認(rèn)要將輸出的信息以郵件的形式發(fā)送的,所以就會(huì)有這樣的錯(cuò)誤
?
說到crontab的日志,系統(tǒng)是ubuntu12.04
默認(rèn)位置是/var/log/cron.log這個(gè)文件
如果沒有,那么可能要修改一下rsyslog里的配置文件,文件位置是
/etc/rsyslog.d/50-default.conf
將這一行注釋前面的“#”去掉即可(原來是注釋掉的,所以沒有日志文件)
#cron.* ? /var/log/cron.log
然后重啟rsyslog服務(wù)
service rsyslog restart
?
對(duì)于CentOS,rsyslog的配置文件是/etc/rsyslog.conf,里面關(guān)于cron的日志輸出這一項(xiàng)沒有被注釋掉
所以不用改,默認(rèn)的執(zhí)行日志文件為:/var/log/cron
?
二、rsync增量更新
然后是文件的增量更新,主要解決的問題是現(xiàn)在有兩臺(tái)服務(wù)器A和B,要將A服務(wù)器上的test目錄增量復(fù)制到B服務(wù)器上的test目錄(所謂增量更新就是指B服務(wù)器原來已經(jīng)有的文件不再傳了,只傳送那些A有的而B沒有的),這樣使得B服務(wù)器上的test文件夾保持與A同步
這就需要用到rsync這個(gè)命令,這個(gè)命令的用法跟scp是一樣的
比如在A服務(wù)器下執(zhí)行命令:rsync -r /home/test/ user@B:/home/test 即可實(shí)現(xiàn)增量更新
注意:這里有一個(gè)問題需要詳細(xì)說明一下:
假如test目錄下有1.txt,2.txt這兩個(gè)文件
如果命令中源目錄那里寫成這樣:/home/test/
那么rsync準(zhǔn)備更新的文件列表就是
1.txt
2.txt
然后就會(huì)在B機(jī)器的/home/test目錄下找這兩個(gè)文件并做增量更新,這樣能夠滿足需求
但如果源目錄寫成這樣:/home/test
那么rsync準(zhǔn)備增量更新的文件列表就會(huì)是這樣:
test/1.txt
test/2.txt
然后在B機(jī)器的/home/test目錄下尋找test/1.txt,發(fā)現(xiàn)沒有test文件夾,于是又創(chuàng)建了test文件夾,所以這樣執(zhí)行的結(jié)果就是B機(jī)器的目錄結(jié)構(gòu)就會(huì)有這兩個(gè)文件,而這不是希望看到的
/home/test/test/1.txt
/home/test/test/2.txt
所以要注意這個(gè)問題。下面兩種寫法是正確的:
rsync -r /home/test/ user@B:/home/test?
或者
rsync -r /home/test user@B:/home
?
具體的關(guān)于rsync的詳細(xì)參數(shù)的設(shè)置這里就不說了,這里只把一種推薦的命令運(yùn)行方式記錄下來:
rsync -rtv /home/test/ user@B:/home/test
-t是指判斷文件是否已有的時(shí)候只判斷文件的時(shí)間戳和文件的大小,如果都一樣就把這個(gè)文件跳過(這是一種不夠嚴(yán)謹(jǐn)?shù)銐蚩斓姆椒?#xff09;
-v是指輸出一下執(zhí)行的日志,其實(shí)可以加很多v,v越多,輸出的日志越多
?
三、免驗(yàn)證訪問
現(xiàn)在就可以將crontab和rsync結(jié)合一下了,當(dāng)然首先需要解決兩個(gè)機(jī)器之間rsync免驗(yàn)證的問題,也就是命令可以直接這樣寫(不需要B機(jī)器的用戶名和密碼):
rsync -rtv /home/test user@B:/home/test
關(guān)于這個(gè)網(wǎng)上看了一些rsync的配置,但是覺得太麻煩了,想到這個(gè)跟scp差不多,是不是也可以直接ssh免驗(yàn)證的那種方式解決,試了一下,可行
關(guān)于ssh免驗(yàn)證登錄,是這樣做的(這里的用戶全部用root,當(dāng)然可以用其他的):
在A機(jī)器下:
首先生成秘鑰文件
ssh-keygen?-t?rsa?-P ''
注意‘’是兩個(gè)單引號(hào),表示密碼為空
然后將生成的id_rsa.pub文件復(fù)制到B服務(wù)器上(注意文件的位置為/root/.ssh,如果是其他用戶應(yīng)該是/home/user/.ssh,即為當(dāng)前用戶的主目錄)
scp /root/.ssh/id_rsa.pub root@B:/root/
(因?yàn)椴僮鬟€沒有完成,這里還要輸入密碼)
然后在B機(jī)器上操作:
如果/root/.ssh/里沒有authorized_keys這個(gè)文件,那么將從A機(jī)器scp過來的id_rsa.pub文件移動(dòng)并重命名成authorized_keys即可
mv /root/id_rsa.pub /root/.ssh/authorized_keys
如果這個(gè)authorized_keys文件已經(jīng)存在,那么將id_rsa.pub這個(gè)文件的內(nèi)容追加到authorized_keys即可
cat /root/id_rsa.pub >> /root/.ssh/authorized_keys
此時(shí)就可以在A機(jī)器上免密碼訪問B機(jī)器了,注意別搞反了
在A機(jī)器上測(cè)試一下:
ssh root@B
如果不需要輸入密碼就可以登錄,說明配置成功
?
四、綜合
OK,準(zhǔn)備工作都完成了,下面就可以實(shí)現(xiàn)需求了,在A機(jī)器下:
1、crontab -e打開crontab的配置文件
2、在最后一行加入下面的代碼
0 0,6,12,18 * * * rsync -rvt /app/elearndata/ root@inc204:/home/elearndata >>/home/updateLog.txt 2>&1
注意inc204是我的B機(jī)器名,需要在A機(jī)器的hosts下面配置其IP映射,當(dāng)然也可以直接用ip代替
這句代碼的意思是每6個(gè)小時(shí)(在0點(diǎn),6點(diǎn),12點(diǎn),18點(diǎn))對(duì)elearndata這個(gè)文件夾進(jìn)行從A到B的增量更新,并將rsync的日志輸出到/home/updateLog.txt這個(gè)文件里,‘>>’是追加輸出的意思
3、保存即可,大功告成
?
經(jīng)測(cè)試,可滿足需求
轉(zhuǎn)載于:https://www.cnblogs.com/davidwang456/p/3526436.html
總結(jié)
以上是生活随笔為你收集整理的Linux定时增量更新文件--转的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Redis双机热备方案--转
- 下一篇: Linux服务器性能评估与优化--转