¿Cómo hacer que un archivo jar se ejecute en el inicio y cuando cierra la sesión?

30

No tengo idea por dónde empezar a buscar. He estado leyendo sobre demonios y no entendí el concepto.

Más detalles :

  • He estado escribiendo un rastreador que nunca se detiene y rastreadores a través de RSS en Internet.
  • El rastreador se ha escrito en Java, por lo tanto, es un jar en este momento.
  • Soy administrador en una máquina que tiene Ubuntu 11.04.
  • Hay algunas posibilidades de que la máquina se bloquee, por lo que me gustaría que el rastreador se ejecute cada vez que inicie la máquina.
  • Además, me gustaría que siguiera funcionando incluso cuando me desconectara. No estoy seguro de que esto sea posible, pero la mayoría de las veces estoy desconectado y todavía quiero rastrearlo.

¿Algunas ideas? ¿Alguien me puede apuntar en la dirección correcta?

Solo busco la solución más simple.

RanZilber
fuente

Respuestas:

32

Aquí hay una manera fácil de hacerlo usando SysVInit. Instrucciones:

  1. Cree el guión de inicio y detención de su aplicación. Póngalo en algún directorio, en nuestro ejemplo es:

    • Iniciar secuencia de comandos: /usr/local/bin/myapp-start.sh
    • Detener secuencia de comandos: /usr/local/bin/myapp-stop.sh

    Cada uno proporcionará las instrucciones para ejecutar / detener la aplicación. Por ejemplo, el myapp-start.shcontenido puede ser tan simple como el siguiente:

    #!/bin/bash
    
    java -jar myapp.jar 

    Para el script de parada puede ser algo como esto:

    #!/bin/bash
    # Grabs and kill a process from the pidlist that has the word myapp
    
    pid=`ps aux | grep myapp | awk '{print $2}'`
    kill -9 $pid
  2. Cree el siguiente script ( myscript) y póngalo /etc/init.d.

    /etc/init.d/myscript contenido:

    #!/bin/bash
    # MyApp
    #
    # description: bla bla
    
    case $1 in
        start)
            /bin/bash /usr/local/bin/myapp-start.sh
        ;;
        stop)
            /bin/bash /usr/local/bin/myapp-stop.sh
        ;;
        restart)
            /bin/bash /usr/local/bin/myapp-stop.sh
            /bin/bash /usr/local/bin/myapp-start.sh
        ;;
    esac
    exit 0
  3. Ponga el script para comenzar con el sistema (usando SysV). Simplemente ejecute el siguiente comando ( como root ):

    update-rc.d myscript defaults 

PD: Sé que Upstart es genial y bla bla, pero prefiero el antiguo sistema de inicio SysV.

Marcos Roriz Junior
fuente
1
Pero, ¿cómo sabrá el sistema qué parámetro usará? Cómo configurar para ser el "inicio". Intenté aquí y no funcionó.
John John Pichler
1
Esto funciona, pero el comando "service myapp start" no sale del comando.
Tobia
Ahora, ¿cómo usar las opciones de inicio | detención | reinicio en MyScript?
Codevalley
Además, incluso después de hacer los 3 pasos, mi jar no se está ejecutando en el inicio. ¿Estás seguro de si tenemos que cambiar los permisos, la ruta o algo así?
Codevalley
@Codevalley, como mencioné, este método es para el inicio SysV. Para utilizar el servicio u otro comando, deberá escribir un trabajo inicial. Pero si va a hacer esto, debe escribir uno de sistema (ya que se está convirtiendo en el estándar)
Marcos Roriz Junior
6

¡Sí! Es posible. :) Upstart es el camino a seguir para asegurarse de que el servicio se mantenga en ejecución. Tiene cinco paquetes, todos instalados por defecto:

  • Upstart init daemon y utilidad initctl
  • upstart-logd proporciona el demonio logd y el archivo de definición de trabajo para el servicio logd
  • upstart-compat-sysv proporciona archivos de definición de trabajo para las tareas de rc y las herramientas de reinicio, nivel de ejecución, apagado y telinit que proporcionan compatibilidad con SysVinit
  • startup-task proporciona archivos de definición de trabajo para tareas de inicio del sistema
  • system-services proporciona archivos de definición de trabajo para servicios tty

El aprendizaje es muy agradable y vale la pena. Upstart tiene un sitio web: http://upstart.ubuntu.com/


fuente
Desde el sitio web de Upstart, a partir de 2019: "El proyecto está en modo de mantenimiento solamente. No se están desarrollando nuevas características y el consejo general sería pasar a otro sistema de inicio mínimo o systemd"
Nav
2

3 sugerencias rápidas ...

  1. Cree una secuencia de comandos S tart en /etc/rc3.d(modo de consola multiusuario) con las secuencias de comandos K ill correspondientes /etc/rc.0y /etc/rc6.delimine su programa Java de forma controlada cuando el sistema se apaga (nivel de ejecución 0) o se reinicia (nivel de ejecución 6) Vea una introducción a los niveles de ejecución .

    Es posible que pueda iniciar su aplicación Java en el nivel de ejecución 2 (rc2.d) pero, como rastreador, necesitará TCP / IP. Así que asegúrese de que su servicio de red esté disponible / iniciado en su nivel de ejecución 2 de antemano. La creación de redes está definitivamente en el nivel de ejecución 3.

    /etc/init.dcontiene todos los scripts de inicio / eliminación reales. /etc/rcN.dlos directorios solo contienen enlaces a ellos, con el prefijo S o K para iniciarlos o eliminarlos respectivamente, por nivel de ejecución N.

  2. Un proceso ejecutado por cronddebe persistir entre los cierres de sesión. Quizás lo agregue a su crontab.

  3. Un proceso ejecutado con nohuptambién debe persistir. Ver nohup: ejecuta un comando incluso después de cerrar sesión .

    $ nohup java -jar myapp.jar &

    De manera predeterminada, myapp.jarla salida estándar de irá a un archivo llamado ./nohup.out, o $HOME/nohup.outsi el primero no se puede escribir.


fuente
Y cuando cierre la sesión, ¿seguirá ejecutándose en segundo plano?
RanZilber
0

También tenga en cuenta al hacer aplicaciones con:

  update-rc.d myscript defaults 

Tener permisos 0755 y usar u obtener antes de su .sh la ruta. Digamos que su script está en /root/test.sh, primero debe cambiar a CD /root/antes de accedertest.sh .

Entonces, la mejor manera es hacer un SH en init.d y allí cambiar la ruta a su shy ejecutarlo en la función de inicio.

Şήøωў
fuente