转自:http://blog.chinaunix.net/xmlrpc.php?r=blog/article&uid=26807463&id=4577034

之前写过linux下简单的备份的脚本 , 最开始一直用着, 后来觉得有必要改进下它了, 不管是从操作方式上还是工作方式上。有这样的想法是因为一次备份引起的。 我经历过磁盘损坏的痛苦, 花了1500元才勉强将数据拯救回来, 于是导致我对备份要求更加高了, 我期望尽量每周备份, 期望备份的目的地是当前系统的完整镜像,也就是说我能够从备份盘启动,且启动后
系统的操作方法以及文件和当前的一模一样,每周我只需要增量备份当前的修改的备份盘,这样就安全了很多。于是就有了下面的备份脚本(我不喜欢造轮子,但是在linux下没有现成的适合我的)

NOTE: 当前还没有加入自动镜像系统,所以如果想镜像系统,那么可以手动这样操作, 准备一块大于当前系统盘的移动盘,
分区,注意分区的结构尽量和系统的一模一样, 然后格式化,文件系统也尽量相同, 然后就可以备份了 备份的时候主要有些
目录需要跳过,比如sys dev proc等等,需要跳过的目录可以在backup程序了面设置!
这是脚本程序:

点击(此处)折叠或打开

  1. #!/bin/bash
  2. # This program is free software; you can redistribute it and/or
  3. # modify it under the terms of the GNU General Public License as
  4. # published by the Free Software Foundation; either version 2 of
  5. # the License, or (at your option) any later version.
  6. #
  7. # This program is distributed in the hope that it will be useful,
  8. # but WITHOUT ANY WARRANTY; without even the implied warranty of
  9. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  10. # GNU General Public License for more details.
  11. # Author: rongp
  12. # email: rongpmcu#gmail.com
  13. # Date: 2014/10/26
  14. # 备份程序
  15. # 特点:
  16. # 主要支持unix类系统下, 支持符号链接
  17. # 支持增量备份
  18. # 支持网络备份(由于基于rsync, 很容易加入该功能,但暂时没加入)
  19. # 文件名支持空格 但是不能出现含有@#@的文件名
  20. # 支持备份每次的更新,方便用于人工操作失误后的修复
  21. # 支持添加规则用于剔除某些文件 格式参考rsync的PATTERN部分
  22. SHELL=/bin/bash
  23. backup_cfg_path=/etc
  24. backup_cfg=$backup_cfg_path/backup.cfg
  25. db_path=
  26. db_pathname=
  27. inc_path=
  28. XECHO=1
  29. _help()
  30. {
  31. echo -e "$0 [option]\n"\
  32. "\tOption:\n"\
  33. "\t-h show this help.\n"\
  34. "\t-i perform the installation, and you should use this option\n"\
  35. "\t before using the backup to do something else.\n"\
  36. "\t-u perform the un-installation.\n"
  37. }
  38. help()
  39. {
  40. echo -e "Command action\n"\
  41. "\th show this help.\n"\
  42. "\ta add any file that you want to backup to the database.\n"\
  43. "\td delete any file that you no longer want from the database.\n"\
  44. "\tb start backup.\n"\
  45. "\tbf assume \"yes\" as answer to all prompts and run non-interactively.\n"\
  46. "\tn perform a trial backup with no changes made.\n"\
  47. "\tp print the file record.\n"\
  48. "\tc do some configurations, such as, modifying the path to the\n"\
  49. "\t database or to the incremental backup directory.\n"\
  50. "\ts show the current configuration.\n"\
  51. "\ti perform the installation, and you should use this option\n"\
  52. "\t before using the backup to do something else.\n"\
  53. "\tu perform the un-installation.\n"\
  54. "\tq quit"
  55. }
  56. color_echo()
  57. {
  58. case "$1" in
  59. g)
  60. shift
  61. echo -e "\033[32m"$@"\033[0m"
  62. ;;
  63. gn)
  64. shift
  65. echo -e -n "\033[32m"$@"\033[0m"
  66. ;;
  67. r)
  68. shift
  69. echo -e "\033[31m"$@"\033[0m"
  70. ;;
  71. y)
  72. shift
  73. echo -e "\033[33m"$@"\033[0m"
  74. ;;
  75. yn)
  76. shift
  77. echo -e -n "\033[33m"$@"\033[0m"
  78. ;;
  79. *)
  80. shift
  81. echo $@
  82. ;;
  83. esac
  84. }
  85. XECHO()
  86. {
  87. if [ "$XECHO" = 1 ]; then
  88. echo $@
  89. fi
  90. }
  91. check_src_dst()
  92. {
  93. if ! test -e "$1" || ! test -e "$2"; then
  94. color_echo r "$1" or "$2" does not ignore
  95. return 2
  96. fi
  97. local src_part1=`df "$1" | cut -d ' ' -f 1`
  98. local src_part2=`df "$2" | cut -d ' ' -f 1`
  99. local nsrc_inode=`ls -lid "$1" | cut -d ' ' -f 1`
  100. local ndst_inode=`ls -lid "$2" | cut -d ' ' -f 1`
  101. XECHO nsrc_inode:$nsrc_inode ndst_inode:$ndst_inode
  102. if [ "$src_part1" != "$src_part2" ]; then
  103. return 1
  104. fi
  105. if [ "$nsrc_inode" = "$ndst_inode" ]; then
  106. color_echo r "$src is equivalent to $dst. ignore it!"
  107. return 2
  108. fi
  109. if [ ! -e $db_pathname ]; then
  110. return 1
  111. fi
  112. while read -r tsrc tdst tex_src;
  113. do
  114. tsrc="${tsrc//@#@/ }"
  115. tdst="${tdst//@#@/ }"
  116. tex_src="${tex_src//@#@/ }"
  117. XECHO tsrc:"$tsrc" tdst:"$tdst"
  118. osrc_inode=`ls -lid "$tsrc" | cut -d ' ' -f 1`
  119. odst_inode=`ls -lid "$tdst" | cut -d ' ' -f 1`
  120. XECHO osrc_inode:$osrc_inode odst_inode:$odst_inode
  121. if [ "$nsrc_inode" = "$osrc_inode" -a "$ndst_inode" = "$odst_inode" ]; then
  122. if [ ${1:((${#1}-1))} = '/' -a ${tsrc:((${#tsrc}-1))} != '/' ] \
  123. || [ ${1:((${#1}-1))} != '/' -a ${tsrc:((${#tsrc}-1))} = '/' ]; then #/home and /home/ is very
  124. echo -n "";
  125. else
  126. return 0
  127. fi
  128. fi
  129. done < $db_pathname
  130. return 1
  131. }
  132. extract_src_dst()
  133. {
  134. XECHO "extract src dst from $1"
  135. src="${1%#*}"
  136. dst="${1#$src}"
  137. dst="${dst#\#}"
  138. XECHO "src: $src"
  139. XECHO "dst: $dst"
  140. if [ "$src" = "" -o "$dst" = "" ]; then
  141. return 1
  142. else
  143. return 0
  144. fi
  145. }
  146. fix_path()
  147. {
  148. local srcpath="$1"
  149. if [ "${srcpath:0:1}" = '/' ]; then
  150. echo $srcpath
  151. elif [ "${srcpath:0:2}" = './' ]; then
  152. echo `pwd`/${srcpath:2}
  153. else
  154. echo `pwd`/$srcpath
  155. fi
  156. }
  157. insert_new_item()
  158. {
  159. XECHO add item src:"$1" dst:"$2" exclude:"$3"
  160. tmp1="${1// /@#@}"
  161. tmp2="${2// /@#@}"
  162. tmp3="${3// /@#@}"
  163. echo "$tmp1" "$tmp2" "$tmp3" >> $db_pathname
  164. return $?
  165. }
  166. parse_item()
  167. {
  168. if ! extract_src_dst "$1"; then
  169. color_echo r "src:$src or dst:$dst is illegal!"
  170. return 1
  171. fi
  172. src=`fix_path "$src"`
  173. dst=`fix_path "$dst"`
  174. XECHO after fixed, src:"$src"
  175. XECHO after fixed, src:"$dst"
  176. return 0
  177. }
  178. do_add()
  179. {
  180. local item
  181. color_echo g "Enter the mode of adding files! Some patterns are available, as follows:"
  182. color_echo g "eg: /home/#/tmp/ means we want to backup the whole things which "
  183. color_echo g "are under home directory to /tmp directory."
  184. color_echo g "eg: /home/#/tmp/:/etc/#/tmp/ means we want to backup the whole "
  185. color_echo g "things which are under the home directory and the /etc/ directory "
  186. color_echo g "to the /tmp directory, you can append any item with ':'."
  187. color_echo r "Note: /home and /home/ are quite different, because /home just means "
  188. color_echo r "/home itself while /home/ means the whole contents of /home."
  189. read -p "Please type in file items: " items
  190. items="`echo "$items" | sed "s/'//g"`"
  191. flag=0
  192. while [ $flag = 0 ];
  193. do
  194. item=${items%%:*}
  195. items=${items#$item:}
  196. ex_src=""
  197. if [ "$items" = "$item" ]; then
  198. flag=1
  199. fi
  200. if parse_item "$item"; then
  201. check_src_dst "$src" "$dst"
  202. ret=$?
  203. if [ "$ret" = 0 ]; then
  204. color_echo y "Warning! ""$src#$dst"" is already existed! do not re-submit!"
  205. continue
  206. elif [ "$ret" = 2 ]; then
  207. continue
  208. fi
  209. read -p "Would you like to add some excluding conditions to $src: (y/n)[n] " yn
  210. if [ "$yn" = y ]; then
  211. color_echo r "Note: this is an expert mode, and we don't check your pattern"
  212. color_echo r "is valid or not. Some patterns are available, as follows:"
  213. color_echo r "eg: if your src directory is /home, and your want to exclude"
  214. color_echo r "the directory /home/rongp, then you should type in \"rongp\"."
  215. color_echo r "eg: if your src directory is /home, and your want to exclude"
  216. color_echo r "the directory /home/rongp and /home/test, then you should"
  217. color_echo r "type in \"rongp:test\", and you can append any item with ':' ."
  218. read -p "Please type in paths to the excluding files: " exitem
  219. ex_src="$exitem"
  220. fi
  221. if insert_new_item "$src" "$dst" "$ex_src"; then
  222. echo ""$src"#"$dst" add successed!"
  223. else
  224. echo ""$src"#"$dst" add failed!"
  225. fi
  226. else
  227. read -p "skip it? Yy/Nn:[n] " yn
  228. if [ "$yn" = "y" -o "$yn" = "Y" ]; then
  229. continue
  230. fi
  231. return 1
  232. fi
  233. done
  234. return 0
  235. }
  236. get_choices()
  237. {
  238. local total_line=`wc -l $db_pathname | cut -d ' ' -f 1`
  239. select_tab=
  240. color_echo g "Enter the mode of "$1"! some patterns are available, as follows:"
  241. color_echo g "eg: 1-3 means select no 1 2 3 item"
  242. color_echo g "eg: 1:3:5 means select no 1 3 5 item"
  243. color_echo g "you can append any no with ':' or '-', but don't mix use it."
  244. color_echo g "no 0 means select all."
  245. do_print
  246. read -p "Please type in the number: " NO
  247. if [ "${NO/-/ }" != "$NO" ]; then
  248. num_tab=(${NO//-/ })
  249. [ ${#num_tab[@]} -gt 2 ] && \
  250. echo "Select failed, argument $NO is illegal!" && return 1
  251. num0=${num_tab[0]}
  252. num1=${num_tab[1]}
  253. XECHO num0:$num0 num1:$num1
  254. if [ -z "${num0//[0-9]/}" -a "$num0" -le "$total_line" -a "$num0" -gt "0" ]\
  255. && [ -z "${num1//[0-9]/}" -a "$num1" -le "$total_line" -a "$num1" -gt "0" ]\
  256. && [ "$num0" -lt "$num1" ];
  257. then
  258. select_tab=(`seq $num0 $num1`)
  259. else
  260. echo "Select failed, argument $NO is illegal!" && return 1
  261. fi
  262. elif [ "${NO/:/ }" != "$NO" ]; then
  263. for num in ${NO//:/ }
  264. do
  265. if [ -z "${num//[0-9]/}" ]&&[ "$num" -le "$total_line" ]\
  266. &&[ "$num" -gt "0" ]; then
  267. continue
  268. else
  269. echo "Select failed, argument $num is illegal!" && return 1
  270. fi
  271. done
  272. j=0
  273. for i in ${NO//:/ }
  274. do
  275. select_tab[j]=$i
  276. ((j++))
  277. done
  278. else
  279. if [ "$NO" = 0 ]; then
  280. select_tab=(`seq 1 $total_line`)
  281. elif [ -z "${NO//[0-9]/}" ]&&[ "$NO" -le "$total_line" ]\
  282. &&[ "$NO" -gt "0" ]; then
  283. select_tab[0]=${NO}
  284. else
  285. echo "Select failed, argument $NO is illegal!" && return 1
  286. fi
  287. fi
  288. return 0
  289. }
  290. do_del()
  291. {
  292. if ! get_choices "deleting files"; then
  293. return 1
  294. fi
  295. local total_num=${#select_tab[@]}
  296. if [ "$total_num" = 1 ]; then
  297. nums=${select_tab[0]}d
  298. elif [ "$total_num" = 2 ]; then
  299. nums=${select_tab[0]},${select_tab[1]}d
  300. else
  301. for ((i=0; i<$total_num; ++i))
  302. do
  303. nums+="${select_tab[i]}d;"
  304. done
  305. fi
  306. sed -i "$nums" $db_pathname >/dev/null 2>&1
  307. [ "$?" = 0 ] && echo "$NO delete successed!" || echo "$NO delete failed, delete failed!"
  308. }
  309. do_print()
  310. {
  311. [ ! -s $db_pathname ] && color_echo y "Warning, no record found!" && return 1
  312. echo " no source destination action"
  313. cat -n $db_pathname | sed 's/@#@/ /g'
  314. }
  315. check_in_select_tab()
  316. {
  317. local i
  318. for ((i=0; i<${#select_tab[@]}; ++i))
  319. do
  320. XECHO $1:select_tab[$i]:${select_tab[i]}
  321. if [ "${select_tab[i]}" = "$1" ]; then
  322. return 0
  323. fi
  324. done
  325. return 1
  326. }
  327. do_backup()
  328. {
  329. local ex_file=`mktemp`
  330. local fake="${1/fake/-n}"
  331. local yes="${1/yes/y}"
  332. [ ! -f "$db_pathname" ] && color_echo r "$db_pathname does not exist!" && return 1
  333. if ! get_choices "backup"; then
  334. return 1
  335. fi
  336. local i=0
  337. local k=0
  338. while read -r src dst ex_src;
  339. do
  340. if check_in_select_tab $((i+1)); then
  341. XECHO "$i in select table"
  342. src="${src//@#@/ }"
  343. dst="${dst//@#@/ }"
  344. XECHO src:$src dst:$dst ex_src:$ex_src ex_file:$ex_file
  345. src_tab[k]="$src"
  346. dst_tab[k]="$dst"
  347. ex_src_tab[k]="$ex_src"
  348. ((k++))
  349. fi
  350. ((i++))
  351. done < $db_pathname
  352. for ((j=0; j<$k; ++j))
  353. do
  354. echo src:${src_tab[j]} dst:${dst_tab[j]} ex_src:${ex_src_tab[j]}
  355. src="${src_tab[j]}"
  356. dst="${dst_tab[j]}"
  357. ex_src="${ex_src_tab[j]}"
  358. echo "$ex_src" | awk -F ':' '{for (i=1;i<=NF;++i)print $i}' | sed 's/@#@/ /g' > $ex_file
  359. if [ "$src" = "/" ]; then
  360. tmpsrc=$(blkid `mount | grep "/ " | cut -d ' ' -f 1` | awk -F "\"" '{print $2}')
  361. else
  362. tmpsrc="$src"
  363. fi
  364. if [ "$dst" = "/" ]; then
  365. tmpdst=$(blkid `mount | grep "/ " | cut -d ' ' -f 1` | awk -F "\"" '{print $2}')
  366. else
  367. tmpdst="$dst"
  368. fi
  369. color_echo g "We will start backup from "
  370. color_echo r "$src"
  371. color_echo g to
  372. color_echo r "$dst"
  373. color_echo g "with excluding file or directory"
  374. color_echo r "${ex_src//@#@/ }"
  375. color_echo gn "continue or not? y/n: "
  376. if [ "$yes" = y ]; then
  377. yn=y
  378. else
  379. read yn
  380. fi
  381. if [ "$yn" = y ]; then
  382. echo Start backup "$src" to "$dst" with excluding file or directory "$ex_src"
  383. (
  384. flock -x 200
  385. rsync -avzrtopg $fake --progress --delete --exclude-from=$ex_file \
  386. "$src" "$dst" --backup --backup-dir=$inc_path/$(date +%Y-%m-%d_%H:%M:%S_$(basename ${tmpsrc})_$(basename $tmpdst))
  387. ) 200>/var/lock/abc
  388. echo Backup $src to $dst with excluding file or directory $ex_src
  389. else
  390. echo Skip backup $src to $dst with excluding file or directory $
  391. fi
  392. done
  393. }
  394. get_answer()
  395. {
  396. local ret
  397. if [ "$4" != "" ]; then
  398. tmpbackup="$4"
  399. else
  400. tmpbackup=backup.cfg.bak
  401. fi
  402. while :
  403. do
  404. read -p "Type in $1 path of the backup(default is $2, q for exit): " ans_tmp
  405. if [ "$ans_tmp" = q ]; then
  406. ret=1
  407. break
  408. elif [ "$ans_tmp" != "" ]; then
  409. if [ ! -d "$ans_tmp" ]; then
  410. echo "$1: $ans_tmp is invalid!"
  411. read -p "Would you like to create it now? y/n [y]: " yn
  412. if [ "$yn" = y ]; then
  413. mkdir -p $ans_tmp
  414. else
  415. continue
  416. fi
  417. fi
  418. sed -i "s,$3.*,$3$ans_tmp,g" $tmpbackup
  419. ret=$?
  420. break
  421. else
  422. ans_tmp="$2"
  423. ret=0
  424. break
  425. fi
  426. done
  427. return $ret
  428. }
  429. already_install()
  430. {
  431. if load_cfg $backup_cfg s; then
  432. XECHO "already install"
  433. return 0 #has install
  434. fi
  435. return 1
  436. }
  437. do_install()
  438. {
  439. color_echo g start install
  440. if already_install; then
  441. color_echo y "We check that you have already installed, you should"
  442. color_echo yn "uninstall first, would you want to uninstall it first?y/n[n] "
  443. read yn
  444. if [ "$yn" != y ]; then
  445. color_echo g install
  446. color_echo r install
  447. return 1
  448. else
  449. do_uninstall
  450. fi
  451. fi
  452. cp -f backup.cfg backup.cfg.bak
  453. load_cfg backup.cfg.bak s
  454. if [ "$?" = 1 ]; then
  455. exit
  456. fi
  457. if ! get_answer "executable file backup" "$bin_path" "INSTALL_PATH=";then
  458. color_echo g install
  459. color_echo r install
  460. return 1
  461. fi
  462. install_path=$ans_tmp
  463. color_echo g install path is $install_path
  464. if ! get_answer "database" "$db_path" "DB_PATH=";then
  465. color_echo g install
  466. color_echo r install
  467. return 1
  468. fi
  469. db_path=$ans_tmp
  470. color_echo g database path is $db_path
  471. if ! get_answer "incremental backup" "$inc_path" "INCREMENTAL_BACKUP_PATH=";then
  472. color_echo g install
  473. color_echo r install
  474. return 1
  475. fi
  476. inc_path=$ans_tmp
  477. color_echo g incremental backup path is $inc_path
  478. echo
  479. who=`whoami`
  480. cp backup $install_path
  481. color_echo g install backup to $install_path
  482. ret=$?
  483. mv backup.cfg.bak $backup_cfg
  484. color_echo g install $backup_cfg
  485. ret=$((ret+$?))
  486. mkdir -p $db_path
  487. color_echo g install $db_path
  488. ret=$((ret+$?))
  489. mkdir -p $inc_path
  490. color_echo g install $inc_path
  491. ret=$((ret+$?))
  492. ln -s $db_path $inc_path/db
  493. color_echo g install $inc_path/db
  494. ret=$((ret+$?))
  495. color_echo g install
  496. if [ $ret -gt 0 ]; then
  497. color_echo r install
  498. [ -e $bin_path/backup ] && rm_print $bin_path/backup
  499. [ -e $backup_cfg ] && rm_print $backup_cfg
  500. [ -e $inc_path/db ] && rm_print $inc_path/db && rm_print -rf $inc_path
  501. [ -e $db_pathname ] && rm_print $db_pathname
  502. rm_print -d $db_path
  503. return 1
  504. fi
  505. echo
  506. echo
  507. color_echo y "The installation work is done, and you can remove this package now!"
  508. color_echo y "Note: you should put the executable file \"backup\""
  509. color_echo y "into \$PATH and you need to get \"root\" privileges to execute it."
  510. color_echo y "for example, you can execute it like this in ubuntu: sudo backup"
  511. return 0
  512. }
  513. rm_print()
  514. {
  515. color_echo g remove $@
  516. eval rm $@
  517. }
  518. do_uninstall()
  519. {
  520. XECHO "Perform the un-installation."
  521. color_echo g perform the un-installation...
  522. if ! load_cfg $backup_cfg; then
  523. color_echo g uninstall
  524. fi
  525. [ -e $bin_path/backup ] && rm_print $bin_path/backup
  526. [ -e $backup_cfg ] && rm_print $backup_cfg
  527. [ -e $inc_path/db ] && rm_print $inc_path/db && rm_print -rf $inc_path
  528. [ -e $db_pathname ] && rm_print $db_pathname
  529. rm_print -d $db_path
  530. color_echo g uninstall
  531. color_echo g uninstall
  532. }
  533. load_cfg()
  534. {
  535. if [ ! -e "$1" ]; then
  536. [ "$2" != "s" ] && color_echo r "Error, we can't find the configure file $1, exit now!"
  537. return 1
  538. fi
  539. bin_path=`sed -n 's/INSTALL_PATH=\(.*\)/\1/p' $1`
  540. db_path=`sed -n 's/DB_PATH=\(.*\)/\1/p' $1`
  541. db_pathname=$db_path/backup.db
  542. inc_path=`sed -n 's/INCREMENTAL_BACKUP_PATH=\(.*\)/\1/p' $1`
  543. if [ ! -d "$inc_path" ]; then
  544. [ "$2" != "s" ] && color_echo r Load configuration file your should
  545. [ "$2" != "s" ] && color_echo r check the directory $db_pathname is valid or
  546. return 2
  547. fi
  548. XECHO database path is $db_path
  549. XECHO database file path is $db_pathname
  550. XECHO incremental backup path is $inc_path
  551. return 0
  552. }
  553. show_configure()
  554. {
  555. color_echo g executable backup is in $bin_path
  556. color_echo g database directory is in $db_path
  557. color_echo g incremental backup directory is in $inc_path
  558. }
  559. do_modify_inc_backup_path()
  560. {
  561. if ! get_answer "incremental backup" "$inc_path" \
  562. "INCREMENTAL_BACKUP_PATH=" $backup_cfg;then
  563. return 1
  564. fi
  565. inc_path=$ans_tmp
  566. XECHO incremental backup is $inc_path
  567. return 0
  568. }
  569. do_configure()
  570. {
  571. color_echo g [1] modify incremental backup path
  572. color_echo g [2] ...
  573. read -p "Please type in the no which you are expecting to: " no
  574. if [ "$no" = 1 ]; then
  575. do_modify_inc_backup_path
  576. else
  577. color_echo r Unsupported
  578. fi
  579. }
  580. backup_start()
  581. {
  582. if ! load_cfg $backup_cfg; then
  583. exit
  584. fi
  585. while :
  586. do
  587. read -p "Command (h for help): " cmd
  588. case "$cmd" in
  589. a)
  590. do_add
  591. ;;
  592. d)
  593. do_del
  594. ;;
  595. p)
  596. do_print
  597. ;;
  598. c)
  599. do_configure
  600. ;;
  601. b)
  602. do_backup
  603. ;;
  604. bf)
  605. do_backup yes
  606. ;;
  607. n)
  608. do_backup fake
  609. ;;
  610. s)
  611. show_configure
  612. ;;
  613. i)
  614. do_install
  615. ;;
  616. u)
  617. do_uninstall
  618. exit
  619. ;;
  620. q)
  621. break
  622. ;;
  623. h | *)
  624. help
  625. ;;
  626. esac
  627. done
  628. }
  629. username=`echo $USER`
  630. if [ "$username" != root ]; then
  631. color_echo r "Error, you need to have \"root\" privileges to execute this program."
  632. exit
  633. fi
  634. if [ "$1" = "-i" ]; then
  635. if ! do_install; then
  636. color_echo y "Sorry, We can't continue any more. Exit now!"
  637. fi
  638. exit
  639. elif [ "$1" = "-u" ]; then
  640. do_uninstall
  641. exit
  642. elif [ "$1" = "-h" ]; then
  643. _help
  644. exit
  645. fi
  646. if [ ! -e $backup_cfg ]; then
  647. color_echo r "$backup_cfg does not exist! "
  648. read -p "You need to install the backup first. perform the installation? y/n?[y]: " yn
  649. if [ "$yn" != n ]; then
  650. do_install
  651. else
  652. echo Sorry, we can\'t continue any more. Exit
  653. fi
  654. exit
  655. fi
  656. backup_start

这是配置文件

点击(此处)折叠或打开

  1. #############################
  2. ######
  3. #############################
  4. AUTHOR=rongp
  5. EMAIL=rongpmcu@gmail.com
  6. VERSION=1.0
  7. INSTALL_PATH=/usr/bin/
  8. DB_PATH=/var/lib/backup/
  9. INCREMENTAL_BACKUP_PATH=/var/lib/backup/incr_backup

git路径:git@bitbucket.org:rongpmcu/backup-script-shell.git

linux下简单的备份的脚本 2 【转】的更多相关文章

  1. Linux下简单粗暴使用rsync实现文件同步备份【转】

    这篇来说说如何安全的备份,还有一点不同的是上一篇是备份服务器拉取数据,这里要讲的是主服务器如何推送数据实现备份. 一.备份服务器配置rsync文件 vim /etc/rsyncd.conf #工作中指 ...

  2. Linux 下 简单客户端服务器通讯模型(TCP)

    原文:Linux 下 简单客户端服务器通讯模型(TCP) 服务器端:server.c #include<stdio.h> #include<stdlib.h> #include ...

  3. linux下的数据备份工具rsync讲解

    linux下的数据备份工具 rsync(remote sync 远程同步)   名词解释: sync(Synchronize,即“同步”)为UNIX操作系统的标准系统调用,功能为将内核文件系统缓冲区的 ...

  4. Linux下MySQL的备份与还原

    Linux下MySQL的备份与还原 1. 备份 [root@localhost ~]# cd /var/lib/mysql (进入到MySQL库目录,根据自己的MySQL的安装情况调整目录) [roo ...

  5. linux下mysql定时备份数据库

    linux下mysql定时备份数据库 (2010-10-21 12:40:17) 转载▼ 标签: 杂谈   一.用命令实现备份 首页进入mysql的bin目录 1.备份数据#mysqldump -uu ...

  6. Linux下简单的socket通信实例

    Linux下简单的socket通信实例 If you spend too much time thinking about a thing, you’ll never get it done. —Br ...

  7. Linux下简单的取点阵字模程序

    源:Linux下简单的取点阵字模程序 Linux操作系统下进行简单的图形开发,经常会用到取字模的软件,但是Linux并没有像Windows下的小工具可用,我们也并不希望为了取字模而频繁地切换操作系统. ...

  8. 一个linux下简单的纯C++实现Http请求类(GET,POST,上传,下载)

    目录 一个linux下简单的纯C++实现Http请求类(GET,POST,上传,下载) Http协议简述 HttpRequest类设计 请求部分 接收部分 关于上传和下载 Cpp实现 关于源码中的Lo ...

  9. linux下简单好用的端口映射转发工具rinetd 转

    linux下简单好用的工具rinetd,实现端口映射/转发/重定向 官网地址http://www.boutell.com/rinetd 软件下载 wget http://www.boutell.com ...

随机推荐

  1. 网络助手的NABCD分析

    我们小组这次做的软件名字叫为校园网络助手.本校校园网分为内网与外网认证两种,并且有着流量限制,所以我们设计出来了这项软件,它主要有着两项功能:一键WIFI与校内网盘. N--need.在学校里每当流量 ...

  2. Daily Scrum - 11/25

    今天是Sprint 2的最后一天,我们在下午的课上对之前两个Sprint作了比较详尽的Review,并在课后Daily Scrum上讨论制订了Sprint 3的任务安排.具体Task会在明天更新在TF ...

  3. 两个简单的动态规划问题,0-1背包和最大不相邻数累加和,附递归c代码

    最近面试经常被问到动态规划,所以自己做了一个总结,希望能进行深入的理解然后尝试能不能找到通用的解决手段.我觉得动态规划思想好理解,难的是怎么找出全部并且合理的子问题和出口. 我一般把问题分为两类,一类 ...

  4. Eclipse使用较多的快捷键

    快速修正:Ctrl+1 单词补全:Alt+/ 快速Outline:Ctrl+O 删除行:Ctrl+D 选中到行末/行首:Shift+End/Home 注释:Ctrl+/ 变为大/小写:Ctrl+Shi ...

  5. Java之可变参数方法使用说明

    代码: package test_demo; /* * 可变参数函数说明 * 传入指定数据类型的数组 * 优先匹配固定长度函数 * */ public class VarArgsDemo { // 可 ...

  6. Mobile Phone Network CodeForces - 1023F(并查集lca+修改环)

    题意: 就是有几个点,你掌控了几条路,你的商业对手也掌控了几条路,然后你想让游客都把你的所有路都走完,那么你就有钱了,但你又想挣的钱最多,真是的过分..哈哈 游客肯定要对比一下你的对手的路 看看那个便 ...

  7. MathExam V2.0

    # 隔壁村小学的小朋友都羡慕哭了2.0版 一.预估与实际 PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟) Planning 计划 1 ...

  8. Java IO 类一览表

    下表列出了大多数(非全部)按输/输出,基于字节或字符划分的 Java IO 类.

  9. 图像处理之生成ColorBar

    1 colorBar介绍 colorBar主要是指一些图像处理中使用的常见纯色或者渐变色条.colorBar用途可作为测试样图来验证某些图像算法的效果,从而避免图像内容或者硬件对图像的干扰,使图像算法 ...

  10. JS中的继承链

    我们首先定义一个构造函数Person,然后定义一个对象p,JS代码如下: function Person(name) { this.name = name; } var p = new Person( ...