Jak uruchomić program jako usługę (cichy)?

23

Mam serwer oparty na języku python, który uruchamiam z terminala. Ta konkretna instancja terminala daje następnie kontrolę programowi, a program używa go jako swego rodzaju okna rejestrowania, aż do jego zamknięcia. Czy to normalne, czy powinienem w jakiś sposób spróbować uruchomić program w inny sposób, w jaki będzie on po prostu pokazywany jako aktywny proces? Jeśli zamknę terminal, od którego uruchomiłem program, program umiera wraz z nim.

Dziękuję Ci

U2ros
źródło
PHP jest wspomniane w tej odpowiedzi, ale dotyczy to również Pythona: askubuntu.com/questions/26555/running-php-cli-server/…

Odpowiedzi:

9

Nawet stary bash używa & do wysyłania procesów do tła, ale jest też kilka innych sposobów ... ale podstawowe są dwa:

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

Kilka innych przydatnych poleceń:

   $~ jobs
        # will show you all processes running right now, but without PID
   $~ ps
        # will show you all processes for actual terminal window
lukassos
źródło
Hmmm,
używałem
Świetne rozwiązanie. Czy istnieje sposób zmodyfikowania opcji 1., aby pid był zapisywany w pliku. Tak więc generowany jest plik dziennika i plik pid.
Oguz Bilgic,
27

Zmień go w demona (usługa)
daemon --name="yourservicename" --output=log.txt sh yourscript.sh


źródło
7
$ servicename &

Użycie &powoduje, że program działa w tle, zamiast blokować powłokę aż do zakończenia programu.

dixoncx
źródło
Nie, nie ma. Na przykład. dixon@dixon-vaio:~$ nautilus & [1] 11835. Zwraca identyfikator procesu, a pojawi się nowy monit powłoki. Sprawdź to także: http://unix.stackexchange.com/questions/3886/difference-between-nohup-disown-and .
dixoncx,
1
Poprawiono mnie. Usunięto głosowanie w dół.
Scott Severance
0

Z terminalu możesz także uruchomić screenlub wykonać polecenie, używając &. Łatwy sposób na prowadzenie ciągłych procesów.

Nicholas Porter
źródło
&w moim przypadku tylko użycie tła w tym przypadku jest za mało. OP stwierdza, że ​​jego serwer loguje się na standardowe wyjście, więc &jego terminal będzie zaśmiecony danymi wyjściowymi. Ponadto, ponieważ OP wspomina o zamknięciu terminala , OP nie będzie w stanie ponownie wysunąć na pierwszy plan procesu i wszystkie dane wyjściowe dziennika zostaną utracone. Przynajmniej lepiej, aby przekierować go do pliku dziennika lub pozostać przy screeninstalacji - ale proszę wyjaśnić podstawy screenOP (odłącz / dołącz / etc)
Robert Riedl