{"id":823,"date":"2005-08-10T02:00:00","date_gmt":"2005-08-10T09:00:00","guid":{"rendered":"http:\/\/kodegeek.com\/blog\/?p=823"},"modified":"2005-08-10T02:00:00","modified_gmt":"2005-08-10T09:00:00","slug":"echando-codigo-%c2%bfcomo-hacer-para-que-rsync-sea-mas-inteligente","status":"publish","type":"post","link":"http:\/\/kodegeek.com\/blog\/2005\/08\/10\/echando-codigo-%c2%bfcomo-hacer-para-que-rsync-sea-mas-inteligente\/","title":{"rendered":"Echando c\u00f3digo: \u00bfComo hacer para que rsync sea m\u00e1s inteligente?"},"content":{"rendered":"<p><a href=\"http:\/\/www.flickr.com\/photos\/josevnz\/31861647\/\" title=\"Photo Sharing\"><img decoding=\"async\" loading=\"lazy\" src=\"http:\/\/photos23.flickr.com\/31861647_f76153a484.jpg\" alt=\"NYC Fifth Avenue\" height=\"375\" width=\"500\" \/><br \/>Rsync es como un tren eficiente el cual lleva informaci\u00f3n de un sitio a otro.<\/a><\/p>\n<p><a href=\"http:\/\/samba.anu.edu.au\/rsync\/\">Rsync<\/a>, uno de los mejores inventos \ud83d\ude42<\/p>\n<p>En otra oportunidad (y en otro blog) <a href=\"http:\/\/elangelnegro.blogspot.com\/2005\/02\/trucos-de-unix-como-copiar-gigabytes.html\">les coment\u00e9 de que era Rsync<\/a> y como utilizarlo para copiar largas cantidades de informaci\u00f3n, pero de manera inteligente; Hace poco me encontre con el siguiente problema:<\/p>\n<ul>\n<li>Se est\u00e1 utilizando Rsync para replicar datos, pero si hay una falla queremos que Rsync reintente la conexi\u00f3n<\/li>\n<li>No queremos que Rsync copie archivos &#8216;<span style=\"font-style: italic;\">core<\/span>&#8216; ya que son muy grandes y va a hacer que la copiada tarde mucho. La opci\u00f3n &#8216;<a href=\"http:\/\/optics.ph.unimelb.edu.au\/help\/rsync\/rsync.html\">-C<\/a>&#8216; nos ayuda con eso ya que utiliza los mismos par\u00e1metros que CVS para ignorar archivos. El problema es que queremos copiar librer\u00edas din\u00e1micas (<span style=\"font-style: italic;\">shared libraries, *.so<\/span>) y <span style=\"font-style: italic;\">-C<\/span> las excluye autom\u00e1ticamente.<\/li>\n<\/ul>\n<p> \u00bfQue podemos hacer?, Sencillo, <span style=\"font-style: italic;\">s\u00f3lo envenenamos a Rsyn<\/span>c con un wrapper escrito en <a href=\"http:\/\/www.gnu.org\/software\/bash\/bash.html\">Bash<\/a>.<\/p>\n<style type=\"text\/css\"><!-- .syntax0 { color: #000000; } .syntax1 { color: #cc0000; } .syntax2 { color: #ff8400; } .syntax3 { color: #6600cc; } .syntax4 { color: #cc6600; } .syntax5 { color: #ff0000; } .syntax6 { color: #9966ff; } .syntax7 { background: #ffffcc; color: #ff0066; } .syntax8 { color: #006699; font-weight: bold; } .syntax9 { color: #009966; font-weight: bold; } .syntax10 { color: #0099ff; font-weight: bold; } .syntax11 { color: #66ccff; font-weight: bold; } .syntax12 { color: #02b902; } .syntax13 { color: #ff00cc; } .syntax14 { color: #cc00cc; } .syntax15 { color: #9900cc; } .syntax16 { color: #6600cc; } .syntax17 { color: #0000ff; } .syntax18 { color: #000000; font-weight: bold; } .gutter { background: #dbdbdb; color: #000000; } .gutterH { background: #dbdbdb; color: #990066; } --><br \/><\/style>\n<p><\/p>\n<pre><span class=\"gutter\">   1:<\/span><span class=\"syntax2\">#!<\/span><span class=\"syntax2\">\/bin\/bash<\/span><br \/><span class=\"gutter\">   2:<\/span><span class=\"syntax1\">#<\/span><br \/><span class=\"gutter\">   3:<\/span><span class=\"syntax1\">#<\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\">This<\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\">small<\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\">script<\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\">is<\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\">an<\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\">\"safer\"<\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\">version<\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\">of<\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\">rsync<\/span><br \/><span class=\"gutter\">   4:<\/span><span class=\"syntax1\">#<\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\">License:<\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\">GPL<\/span><br \/><span class=\"gutterH\">   5:<\/span><span class=\"syntax1\">#<\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\">Author:<\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\">josevnz@yahoo.com<\/span><br \/><span class=\"gutter\">   6:<\/span><span class=\"syntax1\">#<\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\">Blog:<\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\">KodeGeek.com<\/span><br \/><span class=\"gutter\">   7:<\/span><span class=\"syntax1\">#<\/span><br \/><span class=\"gutter\">   8:<\/span>declare -i <span class=\"syntax9\">counter<\/span>=<span class=\"syntax5\">0<\/span><br \/><span class=\"gutter\">   9:<\/span>declare -ri <span class=\"syntax9\">MAX<\/span>=<span class=\"syntax5\">3<\/span><br \/><span class=\"gutterH\">  10:<\/span>declare -ri <span class=\"syntax9\">ERROR<\/span>=<span class=\"syntax5\">192<\/span><br \/><span class=\"gutter\">  11:<\/span><br \/><span class=\"gutter\">  12:<\/span><span class=\"syntax8\">if<\/span> [ -z <span class=\"syntax13\">\"<\/span><span class=\"syntax9\">$<\/span><span class=\"syntax13\">*<\/span><span class=\"syntax13\">\"<\/span> ]; <span class=\"syntax8\">then<\/span><br \/><span class=\"gutter\">  13:<\/span>        exit <span class=\"syntax9\">$<\/span><span class=\"syntax9\">ERROR<\/span><br \/><span class=\"gutter\">  14:<\/span><span class=\"syntax8\">fi<\/span><br \/><span class=\"gutterH\">  15:<\/span><br \/><span class=\"gutter\">  16:<\/span>function my_rsync {<br \/><span class=\"gutter\">  17:<\/span>        rsync --<span class=\"syntax9\">include<\/span>=<span class=\"syntax13\">'<\/span><span class=\"syntax13\">*.so<\/span><span class=\"syntax13\">'<\/span> <span class=\"syntax9\">$*<\/span><br \/><span class=\"gutter\">  18:<\/span>        <span class=\"syntax8\">return<\/span> <span class=\"syntax9\">$?<\/span><br \/><span class=\"gutter\">  19:<\/span>}<br \/><span class=\"gutterH\">  20:<\/span><br \/><span class=\"gutter\">  21:<\/span><span class=\"syntax8\">for<\/span> ((<span class=\"syntax9\">counter<\/span>=0; counter <span class=\"syntax18\">&lt;<\/span> MAX; counter++ ))<br \/><span class=\"gutter\">  22:<\/span><span class=\"syntax8\">do<\/span><br \/><span class=\"gutter\">  23:<\/span>        my_rsync <span class=\"syntax9\">$*<\/span><br \/><span class=\"gutter\">  24:<\/span>        <span class=\"syntax8\">if<\/span> [ <span class=\"syntax9\">$?<\/span> <span class=\"syntax18\">!<\/span>= <span class=\"syntax5\">0<\/span> ]; <span class=\"syntax8\">then<\/span><br \/><span class=\"gutterH\">  25:<\/span>                exit <span class=\"syntax9\">$?<\/span><br \/><span class=\"gutter\">  26:<\/span>        <span class=\"syntax8\">else<\/span><br \/><span class=\"gutter\">  27:<\/span>                break<br \/><span class=\"gutter\">  28:<\/span>        <span class=\"syntax8\">fi<\/span><br \/><span class=\"gutter\">  29:<\/span><span class=\"syntax8\">done; exit $?<\/span><br \/><\/pre>\n<p>Usted puede agregar cualquier par\u00e1metro por la linea de comandos, como incrementar el tiempo de espera (&#8211;timeout); La idea es mantener al script flexible mientras le agregamos las partes que consideramos son importantes (lease los dos requisitos anteriores). Usted puede cambiar cuantas veces se debe reintentar el comando si este falla la primera vez.<\/p>\n<p>Una salida de ejemplo:<\/p>\n<blockquote style=\"font-family: courier new;\"><p>[josevnz@localhost bash]$ .\/safe_rsync.sh -Czv * \/tmp\/bash\/<br \/>backup_mysql.sh<br \/>data.dat<br \/>disk-usage.sh<br \/>download_fedora.bsh<br \/>fedora_isos.txt<br \/>getautomount<br \/>host.bsh<br \/>minute_risk.pl<br \/>openldap.conf<br \/>raid-grub.sh<br \/>safe_rsync.sh<br \/>test_bc.sh<\/p>\n<p>sent 7088 bytes  received 284 bytes  4914.67 bytes\/sec<br \/>total size is 15247  speedup is 2.07<\/p><\/blockquote>\n<p>Si est\u00e1 interesado, hagamelo saber y con gusto les doy m\u00e1s ejemplos de como Rsync puede hacer su vida m\u00e1s f\u00e1cil en el trabajo. Puede <a href=\"http:\/\/prdownloads.sourceforge.net\/elangelnegro\/safe_rsync.sh?download\">bajarse el c\u00f3digo de el script desde ac\u00e1<\/a> como siempre.<\/p>\n<p><span style=\"font-weight: bold;\">\u00bfComo mejorar\u00eda el script?<\/span><\/p>\n<p>Buscar en Technorati: <a href=\"http:\/\/technorati.com\/tag\/rsync\" rel=\"tag\">rsync<\/a>, <a href=\"http:\/\/technorati.com\/tag\/sourceforge\" rel=\"tag\">sourceforge<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Rsync es como un tren eficiente el cual lleva informaci\u00f3n de un sitio a otro. Rsync, uno de los mejores inventos \ud83d\ude42 En otra oportunidad (y en otro blog) les coment\u00e9 de que era Rsync y como utilizarlo para copiar largas cantidades de informaci\u00f3n, pero de manera inteligente; Hace poco me encontre con el siguiente <a class=\"read-more\" href=\"http:\/\/kodegeek.com\/blog\/2005\/08\/10\/echando-codigo-%c2%bfcomo-hacer-para-que-rsync-sea-mas-inteligente\/\">[&hellip;]<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[],"tags":[],"_links":{"self":[{"href":"http:\/\/kodegeek.com\/blog\/wp-json\/wp\/v2\/posts\/823"}],"collection":[{"href":"http:\/\/kodegeek.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/kodegeek.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/kodegeek.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/kodegeek.com\/blog\/wp-json\/wp\/v2\/comments?post=823"}],"version-history":[{"count":0,"href":"http:\/\/kodegeek.com\/blog\/wp-json\/wp\/v2\/posts\/823\/revisions"}],"wp:attachment":[{"href":"http:\/\/kodegeek.com\/blog\/wp-json\/wp\/v2\/media?parent=823"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/kodegeek.com\/blog\/wp-json\/wp\/v2\/categories?post=823"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/kodegeek.com\/blog\/wp-json\/wp\/v2\/tags?post=823"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}