Transformando um script em um serviço linux

5

- EDIT, ainda alguns problemas -

OK, meu script usa um loop para aguardar conexões de rede. Então, quando eu o executo, mesmo com o daemon, ele apenas ficará lá e não me levará de volta ao shell. Eu tentei su -c "/home/webreports/report-list &" USER , mas ele tentou ser executado como o usuário & mesmo que eu tenha entre aspas, eu até tentei aspas simples.

- Original - Eu fiz um script (ainda a ser testado) para executar um script bash como um serviço. Eu tenho duas perguntas.

1) como posso executá-lo como um usuário específico? O software que usamos NÃO PODE ser executado como root e falhará horrivelmente se funcionar (software horrível com o qual estamos tristemente presos). Então, como faço para executar o serviço como usuário "JOEBOB", vamos dizer.

2) Acabei de colocar o arquivo de script em "/etc/rc5.d" para poder usar "service report-listen start"?

--- Script -

#!/bin/sh
#
# myservice     This shell script takes care of starting and stopping
#               the /home/webreports/report-listen
#

# Source function library
. /etc/rc.d/init.d/functions


# Do preliminary checks here, if any
#### START of preliminary checks #########


##### END of preliminary checks #######


# Handle manual control parameters like start, stop, status, restart, etc.

case "$1" in
  start)
    # Start daemons.

    echo -n $"Starting report-listen daemon: "
    echo
    daemon /home/webreports/report-listen
    echo
    ;;

  stop)
    # Stop daemons.
    echo -n $"Shutting down report-listen: "
    killproc /home/webreports/report-listen
    echo

    # Do clean-up works here like removing pid files from /var/run, etc.
    ;;
  status)
    status /home/webreports/report-listen

    ;;
  restart)
    $0 stop
    $0 start
    ;;

  *)
    echo $"Usage: $0 {start|stop|status|restart}"
    exit 1
esac

exit 0
    
por The Digital Ninja 07.01.2010 / 16:47

5 respostas

1

Use su para executar o script como um usuário diferente:

daemon su -c /home/webreports/report-listen johndoe

em que johndoe é o usuário que você deseja que seja executado.

Coloque o script em /etc/init.d/myservice e, em seguida, crie uma ligação simbólica para /etc/rc.d/S99myservice.

    
por 07.01.2010 / 16:57
1

apenas copiar não fará o trabalho. Você precisa cuidar para que o programa seja desacoplado de stdin e stdout. Portanto, toda saída deve ser impressa em um arquivo de log. Você também tem que colocar em segundo plano o programa, o que deve ser feito pela função daemon.

    
por 07.01.2010 / 16:59
1

Você não mencionou qual distribuição está usando, mas parece que você está usando uma baseada no Red Hat. Vou basear minha resposta nessa suposição.

Para responder à primeira parte da sua pergunta, sobre a execução do script na inicialização. Você tem que colocar o script em /etc/rc.d/init.d e adicionar uma linha compatível com "chkconfig" para permitir que você o adicione aos níveis corretos com o comando "chkconfig". veja um pergunta anterior sobre essa questão.

Quanto a iniciar o script com um usuário específico. Como você já está usando a função "daemon", pode tentar usar a opção " - user ":

daemon --user=reportsuser /home/webreports/report-listen
    
por 08.01.2010 / 12:12
0

Se você estiver usando o Ubuntu (baseado no Debian), você pode basear seu script em /etc/init.d/skeleton e substituir DAMEON var:

DAEMON=su -c "/home/webreports/report-listen" joebob

Você também terá um arquivo pid para iniciar / parar limpo.

Você pode iniciá-lo automaticamente durante a inicialização com (supondo que seu script de serviço se chame /etc/init.d/my-report-listen):

$ sudo update-rc.d my-report-listen defaults

Este método é apenas uma tentativa, não uma receita que funciona. Espero que ajude

    
por 07.01.2010 / 19:28
0

O código de daemonização é difícil de acertar. Para isso, eu uso daemontools - basicamente ele faz o trabalho pesado de rodar em segundo plano, e você apenas escreve seu script como se fosse executá-lo em primeiro plano, e então diz aos daemontools para executá-lo.

Veja link para todos os documentos impressionantes.

    
por 08.01.2010 / 08:52