Forma facil de daemonizing no CentOS 5.4

2

Eu sei que existe um programa chamado upstart que pode facilitar a criação de pequenos daemons. Não consigo fazer com que este programa seja configurado no CentOS. Eu recebo todos os tipos de erros referentes ao pkg-congfig, libnih e dbus.

Eu estou trabalhando em um aplicativo node.ja e isso é uma dor para iniciar e parar o tempo todo, então eu quero criar um deamon para isso, o que torna fácil iniciar e parar.

Atualização 1
Vou dar um pequeno exemplo do que eu preciso para este projeto, espero que alguém possa ajudar com isso.

Para iniciar o aplicativo node.js, eu tenho que digitar SSH:

# node /path-to-file/filename.js

Agora, quando eu executo este terminal freezez, eu tenho que pressionar CTRL + Z (pc) para obter a entrada de volta.

Agora, quando eu mudei alguma coisa no arquivo, tenho que recarregá-lo novamente

Eu preciso:

# killall -9 node

Isso mata todos os aplicativos do nó que estão sendo executados

Em seguida, tenho que iniciar o script novamente

# node /path-to-file/filename.js

Quero apenas digitar

# myapp restart

E tudo está feito. Esse tipo de configuração me pouparia muito tempo

Atualização 2
Eu encontrei um programa chamado monit. Isso funciona bem e inicia automaticamente o aplicativo em caso de falha, o que é bom. Ele também tem uma interface web agradável que também é útil.

Eu posso digitar

# monit myapp start(start/stop/restart)

Isso funciona bem. Há apenas uma desvantagem, e essa é uma grande desvantagem. Quando inicio o aplicativo myapp, ele não exibe os erros de compilação node.js throws. Então, quando não começar, não saberei qual é o motivo. Eu tenho que digitar todo o '# node / caminho para o arquivo / nome do arquivo' novamente para verificar o erro.

    
por Saif Bechan 30.03.2010 / 11:42

5 respostas

10

Você não precisa de nada especial para fazer um daemon, na verdade. Qualquer programa em qualquer idioma pode "daemonizar" sozinho. Como alternativa, você pode daemonizar um programa existente com um pequeno wrapper de script de shell (por exemplo, o iniciador do programa /etc/init.d pode cuidar disso).

Normalmente, um daemon tem as seguintes propriedades:

  • o diretório de trabalho deve ser /
  • STDIN deve ser / dev / null
  • STDOUT e STDERR devem ser / dev / null ou arquivos de log
  • o ID pai deve ser init (1), facilmente obtido por bifurcação, deixando a saída pai.

Atualização 1

Monit basicamente cuida dos detalhes sangrentos que eu dei aqui. Para os detalhes sobre STDIN / STDOUT, / dev / null etc., esses são conceitos básicos do Unix, então acho que você precisará investigar isso mais cedo ou mais tarde. Veja por exemplo esta Introdução ao Unix .

Atualização 2

Um script de shell que daemoniza um programa seria semelhante ao seguinte. Observe que isso não funcionará para programas que permanecem em primeiro plano.

#!/bin/sh

DAEMON=/some/program/to/run
PARAMETERS="parameters to my program"
LOGFILE=/var/log/somefile.log

start() {
    echo -n "starting up $DAEMON"
    RUN='cd / && $DAEMON $PARAMETERS > $LOGFILE 2>&1'

    if [ "$?" -eq 0 ]; then
        echo "Done."
    else
        echo "FAILED."
    fi
}

stop() {
    killall $DAEMON
}

status() {
    killall -0 $DAEMON

    if [ "$?" -eq 0 ]; then
        echo "Running."
    else
        echo "Not Running."
    fi
}

case "$1" in
    start)
    start
    ;;

    restart)
    stop
    sleep 2
    start
    ;;

    stop)
    stop
    ;;

    status)
    status
    ;;

    *)
    echo "usage : $0 start|restart|stop|status"
    ;;
esac

exit 0
    
por 30.03.2010 / 12:19
3

Para iniciar um script em uma sessão sem interação, use nohup (ele desanexará seu processo em um termo independente).

Para tornar seu script executável, use chmod ugoa+x <script_name> .

O último ponto, não use #!/bin/bash ou #!/bin/sh porque você não sabe se reside em /bin ; tente usar #!/usr/bin/env bash (ou sh ) que força o processo a funcionar sob o ambiente bash (sh). Observe que env existe o tempo todo em /usr/bin e tem todos os caminhos de ambientes (BASH, SH, TCSH ...) registrados nele.

    
por 03.10.2011 / 10:03
2

Se você está tentando daemonizar um programa que não tem um modo daemon, então você pode usar daemonize . Existem pacotes RPM para ele no repositório repoforge .

    
por 19.09.2012 / 02:10
1

O stdout de um daemon não vai para o terminal. Se você quiser simplesmente automatizar o reinício do programa, sugiro escrever um script de shell para executar as etapas exatas que você está executando manualmente agora.

Editar:

Aqui está um script de exemplo simples:

#!/bin/sh
do-start-stuff () {
    stuff-to-do
}

do-stop-stuff () {
    stuff-to-do
}

case "$1" in
    start)
        do-start-stuff
        ;;
    stop)
        do-stop-stuff
        ;;
    restart)
        do-stop-stuff
        do-start-stuff
        ;;
esac
    
por 30.03.2010 / 13:05
0

se você precisar executar um único aplicativo que salta para o console, mas não quiser monopolizar a tela de uso do terminal, desmarque-o - digite na tela, pressione enter, inicie o aplicativo normalmente e, em seguida, pressione f6 para Sair. tela -r volta para o aplicativo

    
por 30.03.2010 / 13:21