+ Responder ao Tópico



  1. #1

    Padrão Inicializar programa como serviço

    Bom dia pessoal,

    Estou precisando iniciar um programa no SUSE como daemon. Eu consegui fazer com que o programa suba na inicialização do SUSE colocando os comandos no /etc/init.d/boot.local, porém, preciso que seja como daemon, para que possa utilizar o start, stop, restart e etc. Da forma que coloquei, não consigo, ele apenas sobe e da o PID. Alguém poderia me ajudar a subir programas como daemon? Desde já agradeço.

    Atenciosamente,

  2. #2

    Padrão Re: Inicializar programa como serviço

    Citação Postado originalmente por tifoski Ver Post
    ...Estou precisando iniciar um programa no SUSE como daemon. Eu consegui fazer com que o programa suba na inicialização do SUSE colocando os comandos no /etc/init.d/boot.local, porém, preciso que seja como daemon, para que possa utilizar o start, stop, restart e etc. Da forma que coloquei, não consigo, ele apenas sobe e da o PID. Alguém poderia me ajudar a subir programas como daemon?
    Você pode seguir as sugestões do template[1] de script de inicialização, ou também seguir tutoriais[2][3] que atendem especificamente sua necessidade.

    Um dos tutoriais[2] demonstra como instanciar uma aplicação Java, como serviço, no OpenSUSE. Com pequenos ajustes, é possível alterar para qualquer outro executável, diferente da aplicação Java, proposta originalmente no tutorial. Em outro tutorial[3], o exemplo é semelhante, entretanto de propósito geral.

    Citação Postado originalmente por tifoski Ver Post
    Desde já agradeço.
    Mantenha-nos informado sobre seu progresso

    [1] /etc/init.d/skeleton
    [2] http://www.source-code.biz/snippets/java/7.htm
    [3] http://www.novell.com/coolsolutions/feature/15380.html



  3. #3

    Padrão Re: Inicializar programa como serviço

    Citação Postado originalmente por trober Ver Post
    Você pode seguir as sugestões do template[1] de script de inicialização, ou também seguir tutoriais[2][3] que atendem especificamente sua necessidade.

    Um dos tutoriais[2] demonstra como instanciar uma aplicação Java, como serviço, no OpenSUSE. Com pequenos ajustes, é possível alterar para qualquer outro executável, diferente da aplicação Java, proposta originalmente no tutorial. Em outro tutorial[3], o exemplo é semelhante, entretanto de propósito geral.



    Mantenha-nos informado sobre seu progresso

    [1] /etc/init.d/skeleton
    [2] http://www.source-code.biz/snippets/java/7.htm
    [3] http://www.novell.com/coolsolutions/feature/15380.html



    Bom dia,

    Cara, consegui fazer funcionar, ele sobe certinho, consigo dar start, ver o status, mas não estou conseguindo dar um stop no serviço. Já fiz diversas modificações para dar o stop mas ele não da este stop. Segue o meu script para ter uma noção dele como um todo:

    Código :
    [FONT=arial]### BEGIN INIT INFO[/FONT]
    [FONT=arial]# Provides:          TRANSX[/FONT]
    [FONT=arial]# Required-Start:    $syslog $remote_fs[/FONT]
    [FONT=arial]# Required-Stop:     $syslog [/FONT]
    [FONT=arial]# Default-Start:     3 5[/FONT]
    [FONT=arial]# Default-Stop:      [/FONT]
    [FONT=arial]# Description:       Servico TRANSX[/FONT]
    [FONT=arial]### END INIT INFO[/FONT]
    [FONT=arial]
    [/FONT]
    [FONT=arial]
    [/FONT]
    [FONT=arial]
    [/FONT]
    [FONT=arial]
    [/FONT]
    [FONT=arial]SERV=transx[/FONT]
    [FONT=arial]APPPATH="/transx/recargametro"[/FONT]
    [FONT=arial]JAVA_BIN="/root/jdk1.7.0_25/bin/java"[/FONT]
    [FONT=arial]
    [/FONT]
    [FONT=arial]
    [/FONT]
    [FONT=arial]PAYLOAD="transx-1.0.103.jar"[/FONT]
    [FONT=arial]PIDFILE="/var/run/$SERV.pid"[/FONT]
    [FONT=arial]
    [/FONT]
    [FONT=arial]start() {[/FONT]
    [FONT=arial]        echo -n "Starting $SERV: "[/FONT]
    [FONT=arial]        if [ -f $PIDFILE ]; then[/FONT]
    [FONT=arial]                PID=`cat $PIDFILE`[/FONT]
    [FONT=arial]                echo $SERV already running $PID.[/FONT]
    [FONT=arial]                exit 2;[/FONT]
    [FONT=arial]        else[/FONT]
    [FONT=arial]                cd $APPPATH[/FONT]
    [FONT=arial]                nohup $JAVA_BIN -jar $PAYLOAD &> /dev/null &[/FONT]
    [FONT=arial]                RETVAL=$?[/FONT]
    [FONT=arial]                [ $RETVAL -eq 0 ] && touch $PIDFILE && echo `ps aux | grep $PAYLOAD | grep -v grep | awk {'print $2'}` > $PIDFILE[/FONT]
    [FONT=arial]                                echo OK[/FONT]
    [FONT=arial]                return $RETVAL[/FONT]
    [FONT=arial]        fi[/FONT]
    [FONT=arial]
    [/FONT]
    [FONT=arial]}[/FONT]
    [FONT=arial]
    [/FONT]
    [FONT=arial]stop() {[/FONT]
    [FONT=arial]        echo -n "Stopping $SERV: "[/FONT]
    [FONT=arial]                if [ -f $PIDFILE ]; then[/FONT]
    [FONT=arial]                        PID=`cat $PIDFILE`[/FONT]
    [FONT=arial]                kill $PID && rm -f $PIDFILE[/FONT]
    [FONT=arial]                        echo OK[/FONT]
    [FONT=arial]                return 0[/FONT]
    [FONT=arial]                else[/FONT]
    [FONT=arial]                        echo "not running or pid file is gone."[/FONT]
    [FONT=arial]                fi[/FONT]
    [FONT=arial]}[/FONT]
    [FONT=arial]
    [/FONT]
    [FONT=arial]status() {
                    if [ -f $PIDFILE ]; then
                           echo "running"
                            return 0
                    else
                            echo "not running"
                            return 1
                    fi
     
     
    }
     
     
     
     
    case "$1" in
        start)
            start
            ;;
        stop)
            stop
            ;;
        status)
            status
            ;;
            restart)
                stop
                    start
                ;;
        *)
            echo "Usage:  {start|stop|restart}"
            exit 1
            ;;
    esac
    exit $?
    [/FONT]
    Última edição por trober; 28-01-2016 às 10:32. Razão: ajustes na formatação (uso de tag CODE)

  4. #4

    Padrão Re: Inicializar programa como serviço

    Citação Postado originalmente por tifoski Ver Post
    Bom dia,

    Cara, consegui fazer funcionar, ele sobe certinho, consigo dar start, ver o status, mas não estou conseguindo dar um stop no serviço. Já fiz diversas modificações para dar o stop mas ele não da este stop. Segue o meu script para ter uma noção dele como um todo:

    Código :
    ### BEGIN INIT INFO
    # Provides:          TRANSX
    # Required-Start:    $syslog $remote_fs
    # Required-Stop:     $syslog 
    # Default-Start:     3 5
    # Default-Stop:      
    # Description:       Servico TRANSX
    ### END INIT INFO
     
    SERV=transx
    APPPATH="/transx/recargametro"
    JAVA_BIN="/root/jdk1.7.0_25/bin/java"
     
    PAYLOAD="transx-1.0.103.jar"
    PIDFILE="/var/run/$SERV.pid"
     
    start() {
         echo -n "Starting $SERV: "
         if [ -f $PIDFILE ]; then
             PID=`cat $PIDFILE`
             echo $SERV already running $PID.
             exit 2;
         else
             cd $APPPATH
             nohup $JAVA_BIN -jar $PAYLOAD &> /dev/null &
             RETVAL=$?
             [ $RETVAL -eq 0 ] && touch $PIDFILE && echo `ps aux | grep $PAYLOAD | grep -v grep | awk {'print $2'}` > $PIDFILE
             echo OK
             return $RETVAL
         fi
    }
     
     
    stop() {
        echo -n "Stopping $SERV: "
        if [ -f $PIDFILE ]; then
            PID=`cat $PIDFILE`
            kill $PID && rm -f $PIDFILE
            echo OK
            return 0
        else
            echo "not running or pid file is gone."
        fi
    }
     
     
    status() {
        if [ -f $PIDFILE ]; then
            echo "running"
            return 0
        else
            echo "not running"
            return 1
        fi
    }
     
    case "$1" in
             start)
                     start
        ;;
        stop)
            stop
        ;;
        status)
            status
        ;;
        restart)
            stop
            start
        ;;
        *)
            echo "Usage:  {start|stop|restart}"
            exit 1
        ;;
    esac
     
    exit $?
    Ao publicar códigos e porções de script, recomendo usar a TAG CODE, para formatar a aparência, promovendo assim maior legibilidade

    Em relação a impossibilidade de parar o serviço, faço as seguintes perguntas:

    1) O arquivo /var/run/transx.pid está sendo criado?

    2) Se a resposta for sim, para a pergunta anterior, o PID é condizente com o PID do processo de "recargametro"?

    3) Não é redundante o uso de 'nohup' num script de serviço?



  5. #5

    Padrão Re: Inicializar programa como serviço

    Citação Postado originalmente por trober Ver Post
    Ao publicar códigos e porções de script, recomendo usar a TAG CODE, para formatar a aparência, promovendo assim maior legibilidade

    Em relação a impossibilidade de parar o serviço, faço as seguintes perguntas:

    1) O arquivo /var/run/transx.pid está sendo criado?

    2) Se a resposta for sim, para a pergunta anterior, o PID é condizente com o PID do processo de "recargametro"?

    3) Não é redundante o uso de 'nohup' num script de serviço?

    Bom dia, desculpe, utilizarei da próxima.

    Resposta para as questões 1 e 2: sim.

    Referente a questão 3: Ainda sou iniciante no linux, então tenho muitas dificuldades. O nohup já era usado para iniciar a aplicação manualmente nos servidores da empresa, por isso continuei utilizando ele. Há alguma forma de colocar este serviço no ar, sem o nohup neste script?

    Atenciosamente,

    Lucas Farias

  6. #6

    Padrão Re: Inicializar programa como serviço

    Citação Postado originalmente por tifoski Ver Post
    ...desculpe, utilizarei da próxima...
    Sem crise Lucas

    Citação Postado originalmente por tifoski Ver Post
    Há alguma forma de colocar este serviço no ar, sem o nohup neste script?
    Abaixo disponho código que testei no Ubuntu. No meu teste, usei Python, em vez de Java, e o payload foi um builtin, sem o parâmetro -jar. Readaptei para seu aplicativo, após ajustes, e publico o script para que faça os devidos testes

    Tirei o "touch", por ser redundante (afinal você já tinha uma saída ">"), e fiz ajustes num grep, que estava dando erro de "invalid max count". Também melhorei o retorno de status, adicionando o número do processo.

    Código :
    ### BEGIN INIT INFO
    # Provides:          TRANSX
    # Required-Start:    $syslog $remote_fs
    # Required-Stop:     $syslog
    # Default-Start:     3 5
    # Default-Stop:
    # Description:       Servico TRANSX
    ### END INIT INFO
     
    SERV=transx
    APPPATH="/transx/recargametro"
    JAVA_BIN="/root/jdk1.7.0_25/bin/java"
     
    PAYLOAD="transx-1.0.103.jar"
    PIDFILE="/var/run/$SERV.pid"
     
     
    start() {
         echo -n "Starting $SERV: "
         if [ -f $PIDFILE ]; then
             PID=`cat $PIDFILE`
             echo $SERV already running $PID.
             exit 2;
         else
             cd $APPPATH
             $JAVA_BIN -jar $PAYLOAD &> /dev/null &
             RETVAL=$?
             [ $RETVAL -eq 0 ] && echo `ps aux | grep -- "$PAYLOAD" | grep -v grep | awk {'print $2'}` > $PIDFILE
             echo OK
             return $RETVAL
         fi
    }
     
    stop() {
        echo -n "Stopping $SERV: "
        if [ -f $PIDFILE ]; then
            PID=`cat $PIDFILE`
            kill $PID && rm -f $PIDFILE
            echo OK
            return 0
        else
            echo "not running or pid file is gone."
        fi
    }
     
    status() {
        if [ -f $PIDFILE ]; then
            PID=`cat $PIDFILE`
            echo "running at PID" $PID.
            return 0
        else
            echo "not running"
            return 1
        fi
    }
     
    case "$1" in
             start)
                     start
        ;;
        stop)
            stop
        ;;
        status)
            status
        ;;
        restart)
            stop
            start
        ;;
        *)
            echo "Usage:  {start|stop|restart}"
            exit 1
        ;;
    esac
     
    exit $?

    Faça o teste, e mantenha-nos informado



  7. #7

    Padrão Re: Inicializar programa como serviço

    Citação Postado originalmente por trober Ver Post
    Sem crise Lucas



    Abaixo disponho código que testei no Ubuntu. No meu teste, usei Python, em vez de Java, e o payload foi um builtin, sem o parâmetro -jar. Readaptei para seu aplicativo, após ajustes, e publico o script para que faça os devidos testes

    Tirei o "touch", por ser redundante (afinal você já tinha uma saída ">"), e fiz ajustes num grep, que estava dando erro de "invalid max count". Também melhorei o retorno de status, adicionando o número do processo.

    Código :
    ### BEGIN INIT INFO
    # Provides:          TRANSX
    # Required-Start:    $syslog $remote_fs
    # Required-Stop:     $syslog
    # Default-Start:     3 5
    # Default-Stop:
    # Description:       Servico TRANSX
    ### END INIT INFO
     
    SERV=transx
    APPPATH="/transx/recargametro"
    JAVA_BIN="/root/jdk1.7.0_25/bin/java"
     
    PAYLOAD="transx-1.0.103.jar"
    PIDFILE="/var/run/$SERV.pid"
     
     
    start() {
         echo -n "Starting $SERV: "
         if [ -f $PIDFILE ]; then
             PID=`cat $PIDFILE`
             echo $SERV already running $PID.
             exit 2;
         else
             cd $APPPATH
             $JAVA_BIN -jar $PAYLOAD &> /dev/null &
             RETVAL=$?
             [ $RETVAL -eq 0 ] && echo `ps aux | grep -- "$PAYLOAD" | grep -v grep | awk {'print $2'}` > $PIDFILE
             echo OK
             return $RETVAL
         fi
    }
     
    stop() {
        echo -n "Stopping $SERV: "
        if [ -f $PIDFILE ]; then
            PID=`cat $PIDFILE`
            kill $PID && rm -f $PIDFILE
            echo OK
            return 0
        else
            echo "not running or pid file is gone."
        fi
    }
     
    status() {
        if [ -f $PIDFILE ]; then
            PID=`cat $PIDFILE`
            echo "running at PID" $PID.
            return 0
        else
            echo "not running"
            return 1
        fi
    }
     
    case "$1" in
             start)
                     start
        ;;
        stop)
            stop
        ;;
        status)
            status
        ;;
        restart)
            stop
            start
        ;;
        *)
            echo "Usage:  {start|stop|restart}"
            exit 1
        ;;
    esac
     
    exit $?

    Faça o teste, e mantenha-nos informado

    Com estes ajustes o Stop não está funcionando e o PID não aparece, apenas aparece a palavra PID, mas não o número do processo. Quando dou um cat /var/run/transx.pid, ele retorna em branco :/ sabe o que pode ser?

  8. #8

    Padrão Re: Inicializar programa como serviço

    Citação Postado originalmente por tifoski Ver Post
    Com estes ajustes o Stop não está funcionando e o PID não aparece, apenas aparece a palavra PID, mas não o número do processo. Quando dou um cat /var/run/transx.pid, ele retorna em branco :/ sabe o que pode ser?
    Roda "na mão" o comando abaixo, substituindo seu $PAYLOAD, e diga o que aparece. Mantenha as aspas duplas (double quotes).

    Código :
    ps aux | grep -- "$PAYLOAD" | grep -v grep | awk {'print $2'}



  9. #9

    Padrão Re: Inicializar programa como serviço

    Citação Postado originalmente por trober Ver Post
    Roda "na mão" o comando abaixo, substituindo seu $PAYLOAD, e diga o que aparece. Mantenha as aspas duplas (double quotes).

    Código :
    ps aux | grep -- "$PAYLOAD" | grep -v grep | awk {'print $2'}

    Olha,

    Deixei da seguinte forma e funcionou:

    Código :
     ps aux | grep $PAYLOAD | grep -v grep | awk {'print $2'}
    [/QUOTE]

    O unico problema agora é o Stop, está acontecendo da seguinte forma. Eu dou o comando /etc/init.d/transx stop e ele me retorna a seguinte mensagem:

    Código :
     Stopping transx: /etc/init.d/transx: Line 38: kill: 2909 (PID):Invalid signal specification OK
    [QUOTE]

    Após isso, vou no script, altero o kill para kill -l, ele retorna a mensagem, quando retorno para kill apenas, ele começa a dar o stop normalmente, mas se reinicio o server, volta a dar a mesma mensagem.

    Atenciosamente,

    Lucas Farias

  10. #10

    Padrão Re: Inicializar programa como serviço

    Citação Postado originalmente por tifoski Ver Post
    ...altero o kill para kill -l, ele retorna a mensagem, quando retorno para kill apenas, ele começa a dar o stop normalmente, mas se reinicio o server, volta a dar a mesma mensagem.
    Lucas, experimenta "kill -9".



  11. #11

    Padrão Re: Inicializar programa como serviço

    Citação Postado originalmente por trober Ver Post
    Lucas, experimenta "kill -9".

    Agora da a seguinte mensagem:

    Código :
    Stopping transx: kill: usage: kill [-s sigspec | -n signum | -sigspec] pid | jobspec ... or kill -l [sigspec]

    E o problema do pid voltou, ele aparece apenas: Running at PID .

    Ta funcionando mas ta doido isso hahaahha

    Atenciosamente,

    Lucas Farias

  12. #12

    Padrão Re: Inicializar programa como serviço

    Citação Postado originalmente por trober Ver Post
    Lucas, experimenta "kill -9".

    Arrumei da seguinte forma:

    Código :
     
    start() {
     19      echo -n "Starting $SERV: "
     20      if [ -f $PIDFILE ]; then
     21          PID=`cat $PIDFILE`
     22          echo $SERV already running $PID
     23          exit 2;
     24      else
     25 
    26          cd $APPPATH
    27 
    28          $JAVA_BIN -jar $PAYLOAD &> log/Saida.txt &
    29          PID=`echo $!` (encontra o ultimo PID que foi startado)
    30          echo $PID > $PIDFILE
    31          RETVAL=$?
    32          [ $RETVAL -eq 0 ]
    33          #echo `ps aux | grep "$PAYLOAD" | grep -v grep | awk {'print $2'}` > $PIDFILE
    34          echo OK
    35          return $RETVAL


    Desta forma ele está capturando o pid certinho e consegue dar o kill na aplicação. Está funcionando corretamente. Muito obrigado pela grande ajuda.

    Atenciosamente,

    Lucas Farias
    Última edição por tifoski; 05-09-2013 às 08:50.



  13. #13

    Padrão Re: Inicializar programa como serviço

    Citação Postado originalmente por tifoski Ver Post
    Está funcionando corretamente.
    Que boa notícia Lucas

    Tem como dispor o código na íntegra, aqui no Under-Linux, em mensagem formatada, ou dispor ad eternum no Pastebin[1]?

    [1] http://pastebin.com

  14. #14

    Padrão Re: Inicializar programa como serviço

    Citação Postado originalmente por trober Ver Post
    Que boa notícia Lucas

    Tem como dispor o código na íntegra, aqui no Under-Linux, em mensagem formatada, ou dispor ad eternum no Pastebin[1]?

    [1] http://pastebin.com

    Estou disponibilizando aqui e também disponibilizarei no pastebin. Segue:

    Código :
     
    ###BEGIN INIT INFO
      # Provides:          TRANSX
      # Required-Start:    $syslog $remote_fs
      # Required-Stop:     $syslog
      # Default-Start:     3 5
      # Default-Stop:
      # Description:       Servico TRANSX
      ### END INIT INFO
     
     SERV=transx
     APPPATH="/transx/recargametro"
     JAVA_BIN="/root/jdk1.7.0_25/bin/java"
     
     PAYLOAD="transx-1.0.103.jar"
     PIDFILE="/var/run/$SERV.pid"
     
     
     start() {
          echo -n "Starting $SERV: "
          if [ -f $PIDFILE ]; then
              PID=`cat $PIDFILE`
              echo $SERV already running $PID
              exit 2;
          else
     
              cd $APPPATH
     
              $JAVA_BIN -jar $PAYLOAD &>log/Saida.txt &
              PID=`echo $!`
              echo $PID > $PIDFILE
              RETVAL=$?
              [ $RETVAL -eq 0 ]
              #echo `ps aux | grep "$PAYLOAD" |grep -v grep | awk {'print $2'}` > $PIDFILE
              echo OK
              return $RETVAL
          fi
     }
     
     stop() {
         echo -n "Stopping $SERV: "
         if [ -f $PIDFILE ]; then
             PID=`cat $PIDFILE`
             kill $PID
             rm -f $PIDFILE
            #echo kill $PID  rm -f $PIDFILE
             echo OK
             return 0
         else
             echo "not running or pid file is gone."
         fi
     }
     
     status() {
         if [ -f $PIDFILE ]; then
             PID=`cat $PIDFILE`
                echo "running at PID" $PID.
             return 0
         else
             echo "not running"
             return 1
         fi
     }
     
     case "$1" in
              start)
                      start
         ;;
         stop)
             stop
         ;;
         status)
             status
         ;;
         restart)
             stop
             start
         ;;
         *)
             echo "Usage:  {start|stop|restart}"
             exit 1
         ;;
     esac
     
     exit $?