Como executar um programa como serviço (silencioso)?

23

Eu tenho um servidor baseado em python que inicio no terminal. Essa instância específica do terminal fornece controle ao programa, e o programa o utiliza como uma espécie de janela de registro, até que seja fechada. Isso é normal ou devo, de alguma forma, tentar iniciar o programa de alguma outra maneira pela qual ele simplesmente aparecerá como um processo ativo? Se eu fechar o terminal a partir do qual iniciei o programa, o programa morrerá com ele.

Obrigado

U2ros
fonte
PHP é mencionado nesta resposta, mas ela se aplica a Python, também: askubuntu.com/questions/26555/running-php-cli-server/...

Respostas:

9

Até o bash antigo está usando & para enviar processos para o plano de fundo, mas existem algumas outras maneiras também ... mas duas básicas são:

1.)$~ your_command > outputfile_for_stdout &
        # runs your command in background, giving you only PID so you can exit that process by `kill -9 PID_of_process`
        # & goes at the end of row      


2.)$~ your_command > outputfile_for_stdout 
        # this will run your program normally
        # press  Ctrl + Z then program will pause
   $~ bg
        # now your program is running in background
   $~ fg
        # now your program came back to foreground
3.)you can run terminal window under screen command so it will live until you either kill it or you reboot your machine
   $~ screen
   $~ run_all_your_commands
       # Ctrl + A + D will then detach this screen
   $~ screen -r will reattach it

Alguns outros comandos úteis:

   $~ jobs
        # will show you all processes running right now, but without PID
   $~ ps
        # will show you all processes for actual terminal window
lukassos
fonte
Hmmm, eu estava usando o comando 'top' para visualizar processos até agora
U2ros
Ótima solução. Existe uma maneira de modificar a opção 1. para que o pid seja salvo em um arquivo. Portanto, um arquivo de log e um arquivo pid são gerados.
Oguz Bilgic
27

Transforme-o em um daemon (serviço)
daemon --name="yourservicename" --output=log.txt sh yourscript.sh


fonte
7
$ servicename &

O uso &faz com que o programa seja executado em segundo plano, em vez de bloquear o shell até que o programa termine.

dixoncx
fonte
Não, não faz. Por exemplo. dixon@dixon-vaio:~$ nautilus & [1] 11835. Ele retorna a identificação do processo e você receberá um novo prompt de shell. Verifique também: http://unix.stackexchange.com/questions/3886/difference-between-nohup-disown-and .
Dixoncx 23/09/12
1
Eu estou corrigido. A votação foi removida.
Scott Severance
0

No terminal, você também pode executar screenou acompanhar o comando &. Maneira fácil de executar processos contínuos.

Nicholas Porter
fonte
apenas usar &como pano de fundo o processo nesse caso é pouco, na minha opinião. OP afirma que seu servidor faz logon no stdout, portanto, com &seu terminal estará cheio de saída. Além disso, como o OP menciona o fechamento do terminal , o OP não poderá voltar ao primeiro plano do processo e toda a saída do log será perdida. Melhor, pelo menos, para redirecioná-lo para um arquivo de log ou vara com a screenconfiguração - mas, por favor, explicar os conceitos básicos de screena OP (detach / attach / etc)
Robert Riedl