[python-users] ueber Python gestartete Programme weiterlaufen lassen

Carsten Reimer creimer at xs4all.nl
Sa Feb 24 16:52:26 CET 2007


MoinMoin,

> Ich bin absoluter Python Anfänger und habe hier ein Problem bezüglich des 
> Startens von Programmen aus einem Python-Script (oder Programm?) heraus.
> 
> Es geht um ein Programm, welches mehrere Gameserver überwacht und
> nach einem Crash eines Gameservers diesen wieder startet.
> 
> Das funktioniert auch wunderbar ueber os.system("sudo -u user ... ' command' 
> &").
> 
> Wenn ich das Python-Programm beende/unterbreche, sind aber leider auch die vom 
> Programm gestarteten Gameserver wieder tot, obwohl sie mit & im Hintergrund 
> gestartet werden.
> 
> Ob das & nun auf sudo selbst oder auf das abgesetzte command bezogen ist, 
> gleiches Ergebnis.
> 
> Wie kann ich es nun anstellen, dass die Gameserver weiterhin laufen?


die Vorschläge die hier bislang gemacht wurden mit screen und nohup sind
sicherlich alle richtig, ich denke aber, man könnte auch Python-eigene
Mittel benutzen, nämlich die os.spawn-Familie (s.
http://www.python.org/doc/2.4.4/lib/os-process.html)

Ich hatte das schon mal im Rahmen eines Programmes, welches von einem
Mailserver gestartet wurde, ausprobiert (dieser beendet nämlich nach 10
Minuten das Programm - es mußte aber länger laufen).

Als Testszenario vielleicht folgende Dateien:

Ein Shellskript (test.sh), welches unendlich lange das den aktuellen
Timestamp in eine Datei schreibt (der Dateiname wird auf der
Kommandozeile übergeben):

#!/bin/bash

while [ 1 -eq 1 ]
do
        date >> $1
done


Dann ein Python-Skript (spawn_test.py), welches obiges Shellskript
aufruft (mit dem Dateinamen der Datei, in welche die Timestamps
geschrieben werden sollen, als Parameter):


#!/usr/bin/python

import os, sys, os.path

# Das Shellskript
shellcmd = './test.sh'

# Die Argumente fuer das Shellskript. Das erste Argument muss dabei der
# Name des Skriptes sein (argv[0] oder $0 eben)
args = [shellcmd, 'meinedatei']


spath = os.getcwd()

# Starten des Shellskripts. os.P_NOWAIT bewirkt, dass das Skkript
# in einem neuen Prozess ausgefuehrt wird, und das Python-Programm
# weiterlaufen und sich ggf auch beenden kann. Wenn das zu startende
# Programm nich im Unix-PATH liegt, muss der Pfad zum Programm 
# (relativ oder absolute angegeben werden (s. Python-Doku)
# Die Funktion liefert die PID des gestarteten Programmes
pid = os.spawnv(os.P_NOWAIT, os.path.join(spath, shellcmd), args)

# Damit man weiss, dass das Python-Programm auch wirklich zuende ist
print 'Shell-Programme started with PID %s' % pid
print 'Python-programme now terminating'
sys.exit(0)


Nach dem Starten des Programmes kannst Du Dir mittels tail -f meineDatei
die Arbeit des weiterlaufenden Shellskriptes anschauen.

hth

Gruß

Carsten




Mehr Informationen über die Mailingliste python-users