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