Script Bash como daemon no debian

2

Eu tenho um script curto no bash, que precisa ser executado como daemon no plano de fundo. Ele é baseado em inotifywait, que deve aguardar alterações na pasta especificada e, no caso de qualquer alteração, ele deve executar o processo de cópia.

#! /bin/sh    
case "$1" in
  start)
                dir=/var/www/www/source/
                target=/var/www/www/htdocs/application/cache/target/

                inotifywait -m "$dir" --format '%w%f' -e close_write |
                    while read file; do
                        cp  "$file" "$target"
                    done        
        ;;
  stop)

        ;;
esac

eu já o coloquei em /etc/init.d, depois de salvar execute update-rc.d myscript defaults , mas agora, quando eu tento iniciar ele ative o comando start start ele parou preso nas mensagens de inotifywait.

/etc/init.d/bash start
Setting up watches.
Watches established.

Você pode, por favor, me dar alguma dica de como executá-lo em um processo em background com todas as mensagens de saída (da maneira ideal imediatamente após a inicialização)?

    
por Jiří Valoušek 17.09.2015 / 15:12

3 respostas

1

Então eu tenho isso para funcionar, mas é um hack muito feio. Para saber como escrever corretamente os scripts de inicialização eu sugiro isso link .

O que eu queria fazer era colocar o processo em segundo plano com "&".

/etc/init.d/myinitscript.sh

    #! /bin/sh
    case "$1" in
      start)
        dir=/var/www/www/source/
        target=/var/www/www/htdocs/application/cache/target/

        inotifywait -m "$dir" --format '%w%f' -e close_write |
          while read file; do
            cp  "$file" "$target"
          done & ## <--- why not just put it in the background?
      ;;

      stop)
      ;;
    esac

Isso "funciona" ... para certos valores de "trabalho". "myinitscript.sh" é executado no início e faz o que deve fazer, mas resulta nesse processo interrompido:

$ ps aux | grep -i init
[... snip ...]
root      2341  0.0  0.1   4096   600 ?        Ss   18:02   0:00 startpar -f -- myinitscript.sh
[... snip ...]

A causa e possíveis soluções para esse problema pode ser encontrado aqui .

Minha solução subseqüente é feia, e se você está fazendo isso em produção, então você está fazendo errado.

Estou usando dois scripts, um em /etc/init.d e outro em / root.

/etc/init.d/myinitscript.sh

    #! /bin/sh
    case "$1" in
      start)
        /root/initscriptbody.sh > /dev/null 2>&1
      ;;

      stop)
      ;;
    esac

Não redirecionar stdout e stderr para / dev / null resulta no processo 'starpar' suspenso. O segundo script contém toda a funcionalidade e é aqui que ele pode ser colocado em segundo plano sem resultar no processo 'starpar' suspenso:

/root/initscriptbody.sh

    #! /bin/sh
    dir=/var/www/www/source/
    target=/var/www/www/htdocs/application/cache/target/

    inotifywait -m "$dir" --format '%w%f' -e close_write |
    while read file
    do
        cp  "$file" "$target"
    done & ## <-- no problem backgrounding this now
    
por 18.09.2015 / 03:32
3

Você pode usar a tela , ou como sugerido em um comentário, nohup . Qualquer um pode ser usado de forma automatizada, como com um script de inicialização.

No caso da tela, talvez seja necessário ter um cuidado especial para abrir uma sessão de tela com êxito, se usada a partir de algo como um script de inicialização. Especificamente, definindo o ambiente $ TERM correto e executando-o como um usuário em particular.

Se feito corretamente, tem o benefício adicional de anexar à sessão de tela e desanexá-lo. Embora para o seu propósito particular, a tela pode ser um pouco exagerada.

Também dê uma olhada no /etc/init.d/skeleton , que fornece um modelo para criar scripts de inicialização.

A seguinte linha, parte da função do_start () pode apenas fazer o que você precisa:

start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON

Você só precisa alterar as variáveis no início para apontar para o script e para as coisas relacionadas, e isso pode funcionar como está.

    
por 17.09.2015 / 20:23
1

Uma abordagem possível é usar Daemontools para iniciar seu script bash. Daemontools é um daemon que controla sua execução de script - ouve seu stdout e reinicia se ele sair. Há também algumas alternativas como supervisord ou executando o seu script com Systemd service unit

    
por 18.09.2015 / 06:10