<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Consultoría informática: obras selectas &#187; Linux/Unix</title>
	<atom:link href="http://xand.es/category/linuxunix/feed" rel="self" type="application/rss+xml" />
	<link>http://xand.es</link>
	<description>¿Tonterías? Todas las que quieras</description>
	<lastBuildDate>Tue, 18 May 2010 19:54:35 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Ejecutar comandos Linux desde Java (I)</title>
		<link>http://xand.es/ejecutar-comandos-linux-desde-java_20090816</link>
		<comments>http://xand.es/ejecutar-comandos-linux-desde-java_20090816#comments</comments>
		<pubDate>Sun, 16 Aug 2009 11:04:47 +0000</pubDate>
		<dc:creator>Alex</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Linux/Unix]]></category>
		<category><![CDATA[Soluciones]]></category>

		<guid isPermaLink="false">http://xand.es/?p=134</guid>
		<description><![CDATA[Muchas veces hay una necesidad de ejecutar un comando Linux (o Windows) desde Java. Las razones pueden ser varias, a veces conviene usar una cosa que ya está disponible en forma de comando (imaginaros el prototipo de un programa con el presupuesto aún sin aprobar) o a lo mejor simplemente porque una utilidad de consola [...]]]></description>
			<content:encoded><![CDATA[<p>Muchas veces hay una necesidad de <strong>ejecutar un comando Linux (o Windows) desde Java</strong>. Las razones pueden ser varias, a veces conviene usar una cosa que ya está disponible en forma de comando (imaginaros el prototipo de un programa con el presupuesto aún sin aprobar) o a lo mejor simplemente porque una utilidad de consola consume mucho menos recursos que Java (supongamos que tenemos que recodificar avi -> fla muchos videos que nos han subido). El caso es que Java sirve perfectamente para ello, teniendo en cuenta ciertas consideraciones.</p>
<p>Veamos el código:</p>
<p><code><br />
Process proc = Runtime.getRuntime().exec("ls -la");<br />
InputStream is = proc.getInputStream();<br />
int size;<br />
String s;<br />
int exCode = proc.waitFor();<br />
StringBuffer ret = new StringBuffer();<br />
while((size = is.available()) != 0) {<br />
	byte[] b = new byte[size];<br />
	is.read(b);<br />
	s = new String(b);<br />
	ret.append(s);<br />
}<br />
System.out.println(ret.toString());<br />
</code></p>
<p>La primera línea nos crea un <strong>proceso dentro de nuestro Runtime</strong>, con el comando <em>ls -la</em> dentro. Acto seguido obtenemos un <strong>InputStream</strong> para poder ver la salida estándar del programa. Y aquí viene la primera consideración, en el momento de lanzar el proceso con <strong>Runtime.getRuntime().exec()</strong> arranca un subproceso que sigue a su ritmo completamente. Quiero decir, si nada más arrancar el proceso intentamos leer lo que ha devuelto tendremos un <strong>String</strong> vacío, ya que de momento el processo no ha sacado nada por la salida estándar.</p>
<p>La solución para eso es esperar hasta que el proceso termine. Esto lo hacemos con la siguiente línea: <strong>proc.waitFor();</strong> Lo que hace es que detiene el <strong>Thread</strong> dentro del cual hemos lanzado el proceso y espera hasta que termine el proceso (cuidado con los bloqueos). Como resultado devuelve un número entero con el <strong>código de terminación del proceso lanzado</strong>. Normalmente el código 0 significa OK, en caso de que se haya producido algún error lo normal es que devuelva otro valor.</p>
<p>Las siguientes líneas simplemente leen lo que el proceso ha enviado por la salida estándar y sacan el resultado por pantalla.</p>
<p>Otra consideración de la que no debemos olvidarnos es que un proceso tiene los siguientes flujos (dos de ellos para leer y uno para escribir):</p>
<ol>
<li>STDIN &#8211; flujo de entrada estándar. Mediante este flujo podemos enviarle datos al comando. Se obtiene mediante <strong>Process.getOutputStream()</strong>.</li>
<li>STDOUT &#8211; flujo de salida estándar. Es el que hemos usado en nuestro ejemplo.</li>
<li>STDERR &#8211; flujo para la salida de errores. Se obtiene mediante <strong>Process.getErrorStream()</strong>.</li>
</ol>
<p><a href="http://xand.es/ejecutar-comandos-linux-desde-java-ii_20090817">Segunda parte</a> &#8212; como hacer lo mismo pero <strong>sin bloquear el Thread</strong>.</p>
]]></content:encoded>
			<wfw:commentRss>http://xand.es/ejecutar-comandos-linux-desde-java_20090816/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Copias de seguridad de MySQL con mysqldump</title>
		<link>http://xand.es/copias-de-seguridad-de-mysql-con-mysqldump_20090815</link>
		<comments>http://xand.es/copias-de-seguridad-de-mysql-con-mysqldump_20090815#comments</comments>
		<pubDate>Sat, 15 Aug 2009 09:07:42 +0000</pubDate>
		<dc:creator>Alex</dc:creator>
				<category><![CDATA[Linux/Unix]]></category>
		<category><![CDATA[Soluciones]]></category>
		<category><![CDATA[mysql]]></category>

		<guid isPermaLink="false">http://xand.es/?p=130</guid>
		<description><![CDATA[Hace tiempo leí que cada buen administrador de sistemas tiene que recordar tres reglas de oro: copias de seguridad, copias de seguridad y copias de seguridad. De eso voy a hablar en este post, ¿cómo de una forma sencilla podemos organizar el tema de las copias de seguridad usando las herramientas estándar que cualquier sistema [...]]]></description>
			<content:encoded><![CDATA[<p>Hace tiempo leí que cada buen administrador de sistemas tiene que recordar tres reglas de oro: <strong>copias de seguridad, copias de seguridad y copias de seguridad</strong>. De eso voy a hablar en este post, ¿cómo de una forma sencilla podemos organizar el tema de las copias de seguridad usando las herramientas estándar que cualquier sistema Linux ofrece?</p>
<p>Casi siempre que instalamos el <strong>servidor de las bases de datos MySQL</strong> junto a él viene la utilidad llamada <strong>mysqldump</strong>. Se trata precisamente de eso, es un programa para sacar las copias de seguridad de la base de datos. Yo lo hago de la forma más sencilla que se me ha ocurrido, en mi <strong>crontab</strong> (como root) añado la siguiente entrada:</p>
<p><code><br />
59 23 * * *     /usr/bin/mysqldump -u root xand_prod | /bin/gzip -9 -c > /www/xand/backup/xand_prod-`/bin/date +\%Y\%m\%d`.gz<br />
</code></p>
<p>¿Qué hace este código? Cada día a las 23 59 se lanza el comando <strong>mysqldump</strong> (accede a la base de datos como root) y saca una copia de la BBDD <em>xand_prod</em> por la salida estándar. Como podeis ver, la salida se redirecciona mediante un pipe al <strong>gzip</strong>. Este a su vez lo comprime y lo guarda en el fichero que hemos indicado. Con el <strong>/bin/date</strong> pongo la fecha de cada fichero en el nombre del mismo.</p>
]]></content:encoded>
			<wfw:commentRss>http://xand.es/copias-de-seguridad-de-mysql-con-mysqldump_20090815/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
