Wie führe ich ein Programm als Dienst aus (unbeaufsichtigt)?

23

Ich habe einen Python-basierten Server, den ich vom Terminal aus starte. Diese spezielle Instanz des Terminals gibt dann dem Programm die Kontrolle und das Programm verwendet es als eine Art Protokollierungsfenster, bis es geschlossen wird. Ist das normal, oder sollte ich irgendwie versuchen, das Programm auf eine andere Weise zu starten, in der es einfach als aktiver Prozess angezeigt wird? Wenn ich das Terminal schließe, von dem aus ich das Programm gestartet habe, stirbt das Programm damit.

Vielen Dank

U2ros
quelle
PHP wird in dieser Antwort erwähnt, gilt aber auch für Python: askubuntu.com/questions/26555/running-php-cli-server/…

Antworten:

9

Sogar alte Bash verwendet &, um Prozesse in den Hintergrund zu senden, aber es gibt auch einige andere Möglichkeiten. Aber grundlegende zwei sind diese:

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

Einige andere nützliche Befehle:

   $~ jobs
        # will show you all processes running right now, but without PID
   $~ ps
        # will show you all processes for actual terminal window
Lukassos
quelle
Hmmm, ich habe bisher den Befehl 'top' verwendet, um Prozesse
anzuzeigen
Großartige Lösung. Gibt es eine Möglichkeit, die Option 1. so zu ändern, dass die PID in einer Datei gespeichert wird. So werden eine Protokolldatei und eine PID-Datei generiert.
Oguz Bilgic
27

Verwandle es in einen Daemon (Dienst)
daemon --name="yourservicename" --output=log.txt sh yourscript.sh


quelle
7
$ servicename &

Bei Verwendung von &wird das Programm im Hintergrund ausgeführt, anstatt die Shell zu blockieren, bis das Programm endet.

dixoncx
quelle
Nein, das tut es nicht. Z.B. dixon@dixon-vaio:~$ nautilus & [1] 11835. Es gibt die Prozess-ID zurück und Sie erhalten eine neue Shell-Eingabeaufforderung. Überprüfen Sie auch Folgendes : http://unix.stackexchange.com/questions/3886/difference-between-nohup-disown-and .
Dixoncx
1
Ich stehe korrigiert. Abwahl entfernt.
Scott Severance
0

Vom Terminal aus screenkönnen Sie auch den Befehl ausführen oder ihn verfolgen &. Einfache Möglichkeit, kontinuierliche Prozesse auszuführen.

Nicholas Porter
quelle
Nur &um den Hintergrund zu benutzen , ist der Prozess in diesem Fall meiner Meinung nach zu wenig. OP gibt an, dass sein Server sich so auf stdout anmeldet, wobei &sein Terminal mit Ausgabe überfüllt sein wird. Da OP das Schließen des Terminals erwähnt , kann OP den Vorgang nicht erneut in den Vordergrund stellen und alle Protokollausgaben gehen verloren. Besser zumindest, es in eine Protokolldatei umzuleiten oder beim screenSetup zu bleiben - aber dann erklären Sie screenOP bitte die Grundlagen (trennen / anhängen / etc)
Robert Riedl