<?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>Linux, Java y programación &#187; unix</title>
	<atom:link href="http://casidiablo.net/tag/unix/feed/" rel="self" type="application/rss+xml" />
	<link>http://casidiablo.net</link>
	<description>Blog de Java, Programación y Linux</description>
	<lastBuildDate>Fri, 11 Nov 2011 05:41:21 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Códigos de shell script útiles en cualquier programa</title>
		<link>http://casidiablo.net/codigos-de-shell-script-utiles/</link>
		<comments>http://casidiablo.net/codigos-de-shell-script-utiles/#comments</comments>
		<pubDate>Wed, 27 Jan 2010 03:23:46 +0000</pubDate>
		<dc:creator>Cristian</dc:creator>
				<category><![CDATA[Arch Linux]]></category>
		<category><![CDATA[bsd]]></category>
		<category><![CDATA[Debian]]></category>
		<category><![CDATA[Fedora]]></category>
		<category><![CDATA[FreeBSD]]></category>
		<category><![CDATA[gentoo]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[tips]]></category>
		<category><![CDATA[ubuntu]]></category>
		<category><![CDATA[comandos]]></category>
		<category><![CDATA[script]]></category>
		<category><![CDATA[shell]]></category>
		<category><![CDATA[unix]]></category>

		<guid isPermaLink="false">http://casidiablo.net/?p=3588</guid>
		<description><![CDATA[A continuación voy a poner algunos snippets de código de shell script que me han sido siempre útiles cuando escribo algún script. La mayoríá funcinoan en cualquier shell de Unix, aunque algunos requieren que sean ejecutados por Bash. Evitar que usuarios sin privilegios ejecuten el script Algunos scripts realizan tareas administrativas por lo cual podríamos [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fcasidiablo.net%252Fcodigos-de-shell-script-utiles%252F%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22C%C3%B3digos%20de%20shell%20script%20%C3%BAtiles%20en%20cualquier%20programa%22%20%7D);"></div>
<p style="text-align: justify;"><img src="http://casidiablo.net/wordpress/wp-content/uploads/2010/01/bash.png" alt="shell script" title="shell script" width="80" height="80" style="float:left;padding:5px;" />A continuación voy a poner algunos snippets de código de shell script que me han sido siempre útiles cuando escribo algún script. La mayoríá funcinoan en cualquier shell de Unix, aunque algunos requieren que sean ejecutados por <strong>Bash</strong>.</p>
<h3>Evitar que usuarios sin privilegios ejecuten el script</h3>
<p style="text-align: justify;">Algunos scripts realizan tareas administrativas por lo cual podríamos querer que solo el usuario root ejecute el script. En ese caso podemos usar algo como esto:</p>
<pre class="brush: bash; title: ; notranslate">#!/bin/bash
if [[ $EUID -ne 0 ]]; then
echo &quot;Este script debe ser ejecutado por el usuario root&quot; 1&gt;&amp;2
    exit 1
fi</pre>
<h3>Permitir la ejecución del script solo a un usuario específico</h3>
<p style="text-align: justify;">De manera similar al código anterior, podríamos querer que solo un usuario específico ejecute el script. Lo hacemos así:</p>
<pre class="brush: bash; title: ; notranslate">#!/bin/bash
AUTHORIZED_USER=&quot;usuario_permitido&quot;
if [ $USER != $AUTHORIZED_USER ]; then
    echo &quot;Este script debe ser ejecutado por el usuario $AUTHORIZED_USER&quot; 1&gt;&amp;2
    exit 1
fi</pre>
<h3>Verificar que un servicio/proceso se está ejecutando</h3>
<p style="text-align: justify;">Si queremos saber si existen procesos de algún servicio o programa ejecutándose podríamos usar este script (en este caso verifica que el demonio de Apache esté corriendo):</p>
<p><span id="more-3588"></span></p>
<pre class="brush: bash; title: ; notranslate">#!/bin/sh
SERVICE='httpd'
if ps ax | grep -v grep | grep $SERVICE &gt; /dev/null
then
    echo &quot;El servicio $SERVICE esta ejecutandose&quot;
else
    echo &quot;Chanfle! El servicio $SERVICE esta detenido&quot;
fi</pre>
<h3>Verificar que una variable esté asignada/tenga datos</h3>
<p style="text-align: justify;">Hay bastantes maneras de hacer esto en shell script&#8230; la que considero más sencilla y concisa es esta:</p>
<pre class="brush: bash; title: ; notranslate">#!/bin/bash
FOO=
: ${FOO:?&quot;No existe la variable FOO o no tiene datos&quot;}
echo &quot;esto nunca se va a imprimir&quot;</pre>
<p style="text-align: justify;">El anterior script verifica si una variable existe y tiene datos; si esto no se cumple, el script se cierra. Podemos usar esta variación en donde solo comprobamos que la variable exista, sin importar si tiene datos o no:</code></p>
<pre class="brush: bash; title: ; notranslate">#!/bin/bash
FOO=
: ${FOO?&quot;No existe la variable FOO&quot;}
echo &quot;esto si se va a imprimir&quot;</pre>
<h3>Crear un archivo de bloqueo</h3>
<p style="text-align: justify;">A veces debemos asegurarnos que el script no se ejecute dos o más veces simultáneas. Para ello podemos hacer uso de los archivos de bloqueo. Esta es una versión sencilla de un script que nos permite hacer esto:</p>
<pre class="brush: bash; title: ; notranslate">#!/bin/bash
lockfile=/var/lock/loquesea.lock
if [ ! -e $lockfile ]; then
   touch $lockfile
   echo &quot;hago muchas cosas importantes aqui&quot;
   rm $lockfile
else
   echo &quot;ya hay otro proceso corriendo&quot;
fi</pre>
<p style="text-align: justify;">En este caso, se verifica que el archivo loquesea.lock exista. En caso de que exista, el script NO ejecuta sus tareas. Si no existe, crea el archivo, ejecuta las tareas que deba ejecutar y lo elimina.</p>
<p style="text-align: justify;">Pero, esto no es del todo fiable. ¿Qué pasaría si mientras nuestro script se está ejecutando es cerrado abruptamente (con Ctrl^c por ejemplo)? En ese caso el archivo de bloqueo no se borraría, y por lo tanto, no nos permitiría ejecutar el script de nuevo.</p>
<p style="text-align: justify;">Para cubrir esos casos, podríamos hacer uso del comando <strong><code>trap</code></strong> que nos permite ejecutar comandos en caso que nuestro script termine de manera inesperada. Esta es una versión más avanzada que además guarda dentro del archivo de bloqueo el PID del script que lo ejecuta:</p>
<pre class="brush: bash; title: ; notranslate">#!/bin/bash
lockfile=/var/lock/loquesea.lock
if ( set -o noclobber; echo &quot;$$&quot; &gt; &quot;$lockfile&quot;) 2&gt; /dev/null;
then
    trap 'rm -f &quot;$lockfile&quot;; exit $?' INT TERM EXIT
    echo &quot;hago muchas cosas aqui tranquilamente&quot;
    rm -f &quot;$lockfile&quot;
    trap - INT TERM EXIT
else
    echo &quot;Ya hay otro proceso de este script ejecutandose&quot;
    echo &quot;corriendo con el PID: $(cat $lockfile)&quot;
fi</pre>
<p style="text-align: justify;">Entendamos un poco mejor el comando <strong><code>trap</code></strong>. La sintaxis del mismo es básicamente esta: <code>trap <strong>comando</strong> signal [signal ...]</code>; donde signal es la señal de terminación que quieres atrapar. Si quieres ver una lista de los signals disponibles puedes ejecutar el comando kill -l. Para el caso anterior se usaron los signals <code><strong>INT</strong></code> (captura la terminación producida por un Ctrl^c), <code><strong>TERM</strong></code> (terminación producida por el comando kill) y <code><strong>EXIT</strong></code> (terminación normal de un script, bien sea porque ya no hay más líneas que ejecutar o porque se encuentra con el comando exit).</p>
<h3>Menú de opciones</h3>
<p style="text-align: justify;">Para hacer un menú en donde permitimos al usuario seleccionar una serie de opciones podemos usar el siguiente esquema:</p>
<pre class="brush: bash; title: ; notranslate">#!/bin/bash
clear
while :
do
 echo &quot; Escoja una opcion &quot;
 echo &quot;1. quien soy?&quot;
 echo &quot;2. cuanto espacio tengo&quot;
 echo &quot;3. que es esto?&quot;
 echo &quot;4. Salir&quot;
 echo -n &quot;Seleccione una opcion [1 - 4]&quot;
 read opcion
 case $opcion in
  1) echo &quot;este eres:&quot;;
     whoami;;
  2) echo &quot;tienes esto&quot;;
     df;;
  3) uname -r;;
  4) echo &quot;chao pues parcero&quot;;
     exit 1;;
  *) echo &quot;$opc es una opcion invalida. Es tan dificil?&quot;;
     echo &quot;Presiona una tecla para continuar...&quot;;
     read foo;;
esac
done</pre>
<h3>Pedir confirmación antes de ejecutar un script</h3>
<p>A veces es útil hacer que el usuario confirme la ejecución de un lote de sentencias, es decir, el típico mensaje que pide al usuario escribir <code><strong>yes</strong></code> o <code><strong>no</strong></code>. Esto lo podemos hacer así:</p>
<pre class="brush: bash; title: ; notranslate">#!/bin/bash
while true; do
    echo
    read -p &quot;esta seguro de hacer lo que sea que vaya a hacer &quot; yn
    case $yn in
        yes ) break;;
        no ) exit;;
        * ) echo &quot;por favor responda yes o no&quot;;;
    esac
done
echo &quot;si se ejecuta esto es que aceptaste&quot;
</pre>
<h3>Fuentes de información</h3>
<ul>
<li><a href="http://stackoverflow.com/">StackOverflow - La más valiosa sin duda alguna</a></li>
<li><a href="http://www.davidpashley.com/articles/writing-robust-shell-scripts.html">Writing Robust Bash Shell Scripts</a></li>
<li><a href="http://www.cyberciti.biz/tips/shell-root-user-check-script.html">nixCraft</a></li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://casidiablo.net/codigos-de-shell-script-utiles/feed/</wfw:commentRss>
		<slash:comments>19</slash:comments>
		</item>
		<item>
		<title>Ejecutar aplicación Java como servicio &#8211; Integración básica</title>
		<link>http://casidiablo.net/correr-programa-java-como-demonio/</link>
		<comments>http://casidiablo.net/correr-programa-java-como-demonio/#comments</comments>
		<pubDate>Sun, 22 Nov 2009 01:16:20 +0000</pubDate>
		<dc:creator>Cristian</dc:creator>
				<category><![CDATA[ejercicios en java]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[programación]]></category>
		<category><![CDATA[daemon]]></category>
		<category><![CDATA[demonio]]></category>
		<category><![CDATA[ejemplo]]></category>
		<category><![CDATA[ide]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[servicio]]></category>
		<category><![CDATA[solaris]]></category>
		<category><![CDATA[tip]]></category>
		<category><![CDATA[unix]]></category>
		<category><![CDATA[Windows]]></category>

		<guid isPermaLink="false">http://casidiablo.net/?p=3407</guid>
		<description><![CDATA[En esta entrada abordaremos un tema bastante interesante: cómo correr un programa en Java como servicio en Windows o demonio en UNIX/Linux. Puesto que el API de Java no proporciona nada para estos casos, utiliza remos una librería llamada Java Service Wrapper. Dicha librería nos ofrece una serie de scripts y binarios preparados para diferentes [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fcasidiablo.net%252Fcorrer-programa-java-como-demonio%252F%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Ejecutar%20aplicaci%C3%B3n%20Java%20como%20servicio%20-%20Integraci%C3%B3n%20b%C3%A1sica%22%20%7D);"></div>
<p style="text-align: justify;">En esta entrada abordaremos un tema bastante interesante: <strong>cómo correr un programa en Java como servicio en Windows o demonio en UNIX/Linux</strong>. Puesto que el API de <a href="http://casidiablo.net/java/">Java</a> no proporciona nada para estos casos, utiliza</p>
<p style="text-align: justify;">remos una librería llamada <a href="http://wrapper.tanukisoftware.org/">Java Service Wrapper</a>. Dicha librería nos ofrece una serie de scripts y binarios preparados para diferentes sistemas operativos y arquitecturas, que nos permitirán correr nuestros programas como un servicio; además ofrece diferentes versiones: Profesional, Estándar y Comunity. En este caso usaremos la versión Comunity que es libre y gratuita.</p>
<p style="text-align: justify;">La mejor manera de aprender a usar dicha librería es con un pequeño laboratorio, así que he preparado uno en donde explico la integración más simple que existe con Java Service Wrapper (existen 4 métodos; unos más avanzados que otros). La integración sencilla que he escogido nos permitirá ejecutar como servicio una aplicación que ya esté creada (probablemente ya empaquetada en un .jar) y a la que no podemos o es difícil hacerle modificaciones. Esta es la manera más sencilla de hacerlo, sin embargo tiene una desventaja: al detener el servicio se envía directamente un System.exit() a la JVM por lo que la aplicación no se cerrará limpiamente.</p>
<p style="text-align: justify;">Si quieres integrar tu aplicación de una manera más segura y estás en la capacidad de prepararla para ello, podrías intentar la integración avanzada en la que utilizas el API de Java Service Wrapper para implementar métodos de inicio, pausa y detención del servicio [<a href="http://casidiablo.net/descargar/Ejemplo+Servicio+Avanzado+Java+src&#8220;>descargar un ejemplo</a>].</p>
<h3>Laboratorio 1 &#8211; Integración Simple (Linux/Windows/Solaris)</h3>
<p style="text-align: justify;">Para este caso utilizaremos una aplicación de ejemplo que recibe un archivo como parámetro y escribe en él <a href="http://casidiablo.net/capturar-informacion-sistema-operativo-java/">información sobre la memoria del sistema</a>, cada 60 segundos. He escogido este ejemplo porque posee varios aspectos interesantes: requiere de librerías externas (tanto JARs como librerías nativas [.so, dll, etc.]) y recibe parámetros.</p>
<p style="text-align: justify;">Puedes descargar la aplicación de ejemplo de haciendo <a class="tooltip" title="Descargar los binarios del ejemplo" href="http://casidiablo.net/descargar/Ejemplo+Servicio+Simple+Java+bin">clic aquí</a>. Si la ejecutáramos de manera convencional veríamos algo de este tipo:</p>
<div class="consola">gentookde@larry bin % java -jar servicio.jar /tmp/log<br />
^C<br />
gentookde@larry bin % cat /tmp/log<br />
======Mon Oct 05 09:42:05 COT 2009=======<br />
Cantidad de memoria RAM: 3952MB<br />
Total: 4042664<br />
Usada: 3509516<br />
Disponible: 533148<br />
Memoria SWAP total: 1052248<br />
Memoria SWAP usada: 0<br />
Memoria SWAP libre: 1052248</div>
<p style="text-align: justify;">Como puedes ver se trata de una aplicación de consola común y corriente. La aplicación consta básicamente de:</p>
<ul style="text-align: justify;">
<li>El ejecutable servicio.jar ubicado en el directorio bin/</li>
<li>La librería sigar.jar en el directorio lib/</li>
<li style="text-align: justify;">Las librerías específicas de cada arquitectura de sigar en lib/</li>
</ul>
<h3>Pasos para la integración</h3>
<p style="text-align: justify; ">Lo primero es descargar el paquete de <a href="http://wrapper.tanukisoftware.org/doc/english/download.jsp">Java Service Wrapper</a> y descomprimirlo<span style="background-color: #ffffff;">. Supondremos que el directorio donde se encuentra Java Service Wrapper es $RUTA_JSW y que el directorio de la aplicación que  vamos a convertir en servicio es </span><span style="background-color: #ffffff;">$RUTA_APP</span><span style="background-color: #ffffff;">.</span></p>
<h4>1. Copiamos los siguentes archivos al directorio bin de nuestra aplicación de ejemplo&#8230;</h4>
<p style="text-align: justify; "><span style="background-color: #ffffff;"><strong>UNIX/Linux</strong><br />
</span></p>
<div class="consola">cp $RUTA_JSW/bin/wrapper $RUTA_APP/bin/<br />
cp $RUTA_JSW/src/bin/sh.script.in $RUTA_APP/bin/<br />
cp $RUTA_JSW/lib/* $RUTA_APP/bin/</div>
<p style="text-align: justify; ">El archivo $RUTA_JSW/bin/wrapper podría no existir; por lo tanto lo que debes copiar es el archivo wrapper-xxx específico para tu plataforma. Por ejemplo, en este caso estoy usando Gentoo Linux de 64bits por lo tanto copiaré el archivo $RUTA_JSW/bin/wrapper-linux-x86-64.</p>
<p style="text-align: justify; "><strong><span style="background-color: #ffffff;">Windows</span></strong></p>
<div class="consola">copy $RUTA_JSW/bin/ wrapper-windows-x86-32.exe $RUTA_APP/bin/<br />
copy $RUTA_JSW/src/bin/ App.bat.in $RUTA_APP/bin/<br />
copy $RUTA_JSW/src/bin/ InstallApp-NT.bat.in $RUTA_APP/bin/<br />
copy $RUTA_JSW/src/bin/ UninstallApp-NT.bat.in $RUTA_APP/bin/<br />
copy $RUTA_JSW/lib/* $RUTA_APP/bin/</div>
<h4>2. Renombramos algunos archivos&#8230;</h4>
<p><strong>UNIX/Linux&#8230;</strong></p>
<p style="text-align: justify;">Ahora debes renombrar el script sh.script.in con el nombre de la aplicación con la que haremos la integración y darle privilegios de ejecución. En este casó se llama simplemente &#8220;servicio&#8221;:</p>
<div class="consola">cd $RUTA_APP/bin<br />
mv sh.script.in servicio<br />
chmod a+x servicio</div>
<p><strong>Windows</strong></p>
<p style="text-align: justify;">Ahora debes renombrar los archivos .bat  para que concuerden con el nombre de la aplicación con la que haremos la integración. En este casó se llama simplemente &#8220;servicio&#8221; (lo puedes hacer usando el explorador si no te gusta usar la consola, pero a mi me daría pena):</p>
<div class="consola">cd $RUTA_APP/bin<br />
move App.bat.in servicio.bat<br />
move InstallApp-NT.bat.in InstallServicio-NT.bat<br />
move UninstallApp-NT.bat.in UninstallServicio-NT.bat</div>
<h4>3. editar archivo de configuración</h4>
<p style="text-align: justify;">Editamos el archivo wrapper.conf y lo dejamos en el directorio $RUTA_APP/conf/. El archivo para este ejemplo tendrá el siguiente contenido (<strong>importante</strong>! lee la explicación si usas Windows):</p>
<pre class="brush: plain; title: ; notranslate"># Comando de Java
wrapper.java.command=java
# Clase que ejecutara el Wrapper
wrapper.java.mainclass=org.tanukisoftware.wrapper.WrapperSimpleApp
# Librerias necesarias para ejecutar el programa
wrapper.java.classpath.1=../lib/wrapper.jar
wrapper.java.classpath.2=servicio.jar
# Java Library Path (ubicacion de las librerias wrapper.dll o wrapper.so)
wrapper.java.library.path.1=../lib
# Java Bits.  On applicable platforms, tells the JVM to run in 32 or 64-bit mode.
wrapper.java.additional.auto_bits=TRUE
# Parametros del programa
wrapper.app.parameter.1=net.casidiablo.servicio.Servicio
wrapper.app.parameter.2=/tmp/log
#********************************************************************
# Wrapper General Properties
#********************************************************************
# Allow for the use of non-contiguous numbered properties
wrapper.ignore_sequence_gaps=TRUE
# Title to use when running as a console
wrapper.console.title=servicio
#********************************************************************
# Wrapper Windows NT/2000/XP Service Properties
#********************************************************************
# Name of the service
wrapper.name=jgossip
# Display name of the service
wrapper.displayname=Servicio
# Description of the service
wrapper.description=Monitor de memoria
# Mode in which the service is installed. AUTO_START or DEMAND_START
wrapper.ntservice.starttype=AUTO_START
# Allow the service to interact with the desktop.
wrapper.ntservice.interactive=false</pre>
<p>Explicación del archivo de configuración:</p>
<ul>
<li style="text-align: justify;"><code>wrapper.java.command=java</code> es el comando para ejecutar java. En este caso es simplemente java porque estoy en Linux y además tengo configurado correctamente el path. En Windows podría ser algo como: c:\archivos de programa\java\jdk1.6\bin\java.exe</li>
<li style="text-align: justify;"><code>wrapper.java.mainclass=org.tanukisoftware.wrapper.WrapperSimpleApp</code> indica el archivo a ejecutar es la clase WrapperSimpleApp que se usa en la integración sencilla. Esta clase envoltorio es la que permite ejecutar la aplicación como servicio.</li>
<li style="text-align: justify;"><code>wrapper.java.classpath.1=../lib/wrapper.jar<br />
wrapper.java.classpath.2=servicio.jar</code> indican las rutas o archivos del classpath.</li>
<li style="text-align: justify;"><code>wrapper.java.library.path.1=../lib</code> indica el directorio donde se encuentran las librerías a usar.</li>
<li style="text-align: justify;"><code>wrapper.app.parameter.1=net.casidiablo.servicio.Servicio<br />
wrapper.app.parameter.2=/tmp/log</code> estos son los parámetros que se pasarán al programa. <strong>Importante</strong>: como estamos haciendo la integración simple, el primer parámetro debe ser la clase que contiene el método main de nuestra aplicación.</li>
<li style="text-align: justify;"><code>wrapper.name=jgossip</code> esta opción es para Windows y define el nombre del servicio en el sistema.</li>
<li style="text-align: justify;"><code>wrapper.ntservice.starttype=AUTO_START</code> si estás en windows, define si el servicio quedará configurado para iniciar automáticamente.</li>
</ul>
<h4>4. Probar/Instalar el servicio&#8230;</h4>
<p style="text-align: justify;">Ahora veremos cómo podemos probar la aplicación para asegurarnos que ha quedado bien configurada antes de proceder con la instalación.</p>
<p><strong>UNIX/Linux</strong></p>
<p style="text-align: justify;">Ejecutamos el script &#8216;servicio&#8217; que configuramos en el paso 1 y 2 con el parámetro console:</p>
<div class="consola">./servicio console</div>
<p>Deberías ver algo como:</p>
<div class="consola">Running un servicio que escribe cosas&#8230;<br />
wrapper  | &#8211;&gt; Wrapper Started as Console<br />
wrapper  | Java Service Wrapper Community Edition 64-bit 3.3.6<br />
wrapper  |   Copyright (C) 1999-2009 Tanuki Software, Ltd.  All Rights Reserved.<br />
wrapper  |     http://wrapper.tanukisoftware.org<br />
wrapper  |<br />
wrapper  | Launching a JVM&#8230;<br />
jvm 1    | WrapperManager: Initializing&#8230;</div>
<p style="text-align: justify;">Lo detienes presionando Ctrl+C. Ahora, si queremos probarlo como demonio basta con ejecutar los comandos típicos de un demonio en UNIX/Linux:</p>
<div class="consola">$ ./servicio start<br />
Starting un servicio que escribe cosas&#8230;<br />
$ ./servicio stop<br />
Stopping un servicio que escribe cosas&#8230;<br />
Stopped un servicio que escribe cosas.</div>
<p style="text-align: justify;">Para instalarlo basta con crear un enlace simbólico del script en el directorio /etc/init.d y añadirlo al listado de servicios a iniciar; por ejemplo:</p>
<div class="consola">sudo ln -sv $RUTA_APP/bin/servicio /etc/init.d/servicio<br />
sudo rc-update add servicio default</div>
<p><strong>Windows</strong></p>
<p style="text-align: justify;">Para instalarlo en Windows basta con ejecutar el archivo InstallServicio-NT.bat. Puedes verificar que fue instalado correctamente accediendo a la consola de administración de servicios de NT (ejecutas el comando services.msc):</p>
<p><a href="http://casidiablo.net/wordpress/wp-content/uploads/2009/11/screenshot_001.png"><img class="aligncenter size-full wp-image-3460" title="servicio windows java" src="http://casidiablo.net/wordpress/wp-content/uploads/2009/11/screenshot_001.png" alt="servicio windows java" width="778" height="566" /></a></p>
<h3>Fuentes y descargas</h3>
<p>Aunque en esta entrada no explico cómo hacer la integración avanzada, he preparado un ejemplo completo que puedes descargar en el listado de abajo.<strong><br />
</strong></p>
<ul>
<li><a href="http://wrapper.tanukisoftware.org/doc/">Puedes encontrar más documentación en la página oficial del proyecto</a></li>
<li><a href="http://casidiablo.net/descargar/Ejemplo+Servicio+Simple+Java+bin">Descargar el laboratorio de esta entrada</a></li>
<li><a href="http://casidiablo.net/descargar/Ejemplo+Servicio+Simple+Java+src">Descargar el código fuente del laboratorio</a></li>
<li><a href="http://casidiablo.net/descargar/Ejemplo+Servicio+Avanzado+Java+src"><strong>Descargar código fuente y laboratorio de la integración avanzada</strong></a></li>
</ul>
<p><br/><br/><br/></p>

]]></content:encoded>
			<wfw:commentRss>http://casidiablo.net/correr-programa-java-como-demonio/feed/</wfw:commentRss>
		<slash:comments>34</slash:comments>
		</item>
		<item>
		<title>UnixPorn.com</title>
		<link>http://casidiablo.net/unix-porn/</link>
		<comments>http://casidiablo.net/unix-porn/#comments</comments>
		<pubDate>Mon, 06 Oct 2008 14:19:01 +0000</pubDate>
		<dc:creator>Cristian</dc:creator>
				<category><![CDATA[linux]]></category>
		<category><![CDATA[off-topic]]></category>
		<category><![CDATA[porn]]></category>
		<category><![CDATA[unix]]></category>

		<guid isPermaLink="false">http://casidiablo.net/?p=1820</guid>
		<description><![CDATA[Me acabo de enterar de este nuevo proyecto, pero&#8230; ¿qué es UnixPorn? Bueno, teniendo en cuenta lo guarros que son todos algunos los linuxeros, en especial los chicos Ubuntu, pensé lo peor al principio&#8230; Incluso antes de entrar completamente a la página te advierten de lo que verás, tal como hacen los típicos sitios porno [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fcasidiablo.net%252Funix-porn%252F%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22UnixPorn.com%22%20%7D);"></div>
<p>Me acabo de enterar de este nuevo proyecto, pero&#8230; ¿qué es <a href="http://unixporn.com">UnixPorn</a>? Bueno, teniendo en cuenta lo guarros que son <span style="text-decoration: line-through;">todos</span> algunos los linuxeros, en especial los chicos Ubuntu, pensé lo peor al principio&#8230;</p>
<p>Incluso <strong>antes de entrar completamente a la página te advierten de lo que verás, tal como hacen los típicos sitios porno</strong> (<em>bueno, no me consta que los sitios porno te adviertan, solo me han contado</em>).</p>

]]></content:encoded>
			<wfw:commentRss>http://casidiablo.net/unix-porn/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>

