2 Stimmen

Hilfe zur Ausführung im Hintergrund

Hier ist ein einfacher Python-Daemon, den ich nicht als Hintergrundprozess laufen lassen kann:

#!/usr/bin/env python 

import socket 

host = '' 
port = 843 
backlog = 5 
size = 1024 
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
s.bind((host,port)) 
s.listen(backlog) 
while 1: 
   client, address = s.accept() 
   data = client.recv(size) 
   if data == '<policy-file-request/>\0': 
       client.send('<?xml version="1.0"?><cross-domain-policy><allow-access-from domain="*" to-ports="*"/></cross-domain-policy>') 
   client.close()

Es handelt sich um einen Socket-Policy-Dateiserver (Sie haben vielleicht schon von der Beschränkung gehört, die Adope für Socket-Verbindungen - http://www.adobe.com/devnet/flashplayer/articles/socket_policy_files.html ); das funktioniert gut, wenn es wie ein "normaler" Prozess ausgeführt wird - "python that_server.py", - aber ich bekomme Probleme, wenn es im Hintergrund läuft.

So läuft das: "that_server.py &", - funktioniert nicht.

EDIT: Hier ist, was ich von der Shell bekommen habe:

ircd@smoky43g:~$ ls
server.py

ircd@smoky43g:~$ sudo nohup python server.py &
[8] 19817
ircd@smoky43g:~$

[8]+  Stopped                 sudo nohup python server.py
ircd@smoky43g:~$

Ich starte es und drücke dann einfach die Eingabetaste - und es sagt 'gestoppt'. Was ist das Problem?

Ohne den sudo-Befehl passiert das Gleiche:

ircd@smoky43g:~$ nohup python server.py &
[9] 20341
ircd@smoky43g:~$ nohup: ignoring input and appending output to `nohup.out'

[9]   Exit 1                  nohup python server.py
ircd@smoky43g:~$

EDIT 2: Ich habe dies in der Datei nohup.out gefunden:

python: can't open file 'sudo': [Errno 2] No such file or directory
Traceback (most recent call last):
  File "server.py", line 10, in <module>
    s.bind((host,port))
  File "<string>", line 1, in bind
socket.error: [Errno 13] Permission denied

UPDATE: Ich habe es geschafft, es mit dem Root-Konto auszuführen, konnte es aber nicht mit dem Benutzer ircd (der zu den suddoers gehört). Und die Frage ist nun, warum nicht?

1voto

sclarson Punkte 4329

Versuchen Sie

nohup python that_server.py &

Auch,

Sie versuchen, einen Port unter 1024 zu verwenden, was einen privilegierten/Root-Zugang erfordert. Versuchen Sie einen höheren Port.

1voto

Oddthinking Punkte 22694

Wohin wird die Ausgabe geleitet? nohup.out? Was steht da drin? Gibt es eine Ausnahmespur?

1voto

msw Punkte 41469

Ich habe Ihren Code instrumentiert und er funktioniert hier einwandfrei:

$ cat server.py
#!/usr/bin/env python 

import socket 
import sys

host = '' 
port = 843 
backlog = 5 
size = 1024 
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
print >> sys.stderr, 'socket'
s.bind((host,port)) 
print >> sys.stderr, 'bind'
s.listen(backlog) 
print >> sys.stderr, 'listen'
while 1: 
    try:
       client, address = s.accept() 
       print >> sys.stderr, 'accept'
       data = client.recv(size) 
       print >> sys.stderr, 'recv'
       # ignore data because I can't type a '\0'
       client.send('<?xml version="1.0"?><cross-domain-policy><allow-access-from domain="*" to-ports="*"/></cross-domain-policy>') 
       client.close()
       print >> sys.stderr, 'close'
    except Exception as e:
        print e;
        s.close();
        print >> sys.stderr, 'close'
        sys.exit(1);
$ sudo nohup python server.py &
[1] 11218
nohup: ignoring input and appending output to `nohup.out'
$ jobs
[1]+  Running                 sudo nohup python server.py &
# a couple of telnets to 843
$ jobs
[1]+  Running                 sudo nohup python server.py &
$ sudo kill 11218
$ sudo cat nohup.out
socket
bind
listen
accept
recv
close
accept
recv
close

1voto

Ian Bicking Punkte 9566

Das Problem liegt wahrscheinlich an den Berechtigungen, wie in Ihrem Update erwähnt. Sie verbinden sich mit Port 843, der ein privilegierter Port ist - Sie müssen Root sein, um ihn zu öffnen (suchen Sie bei Stack Overflow nach anderen Techniken). Sudoers spielt keine Rolle, da Sie kein sudo verwenden.

Das eigentliche Problem hier ist, dass Sie den Fehler nicht sehen, was es wahrscheinlich einfach gemacht hätte, das Problem zu lösen (oder Sie zumindest auf das richtige Problem hinzuweisen). Das sollten Sie vielleicht tun:

(python server.py > output.txt 2>&1) &

Dies leitet die Ausgabe in eine Datei um vor den Prozess in den Hintergrund zu stellen.

0voto

Sairam Punkte 2338

Wenn die Ursache dieses Problems darin besteht, dass das Skript auch nach dem Verlassen der Sitzung ausgeführt werden soll, können Sie einen Bildschirmbefehl verwenden. Mit screen können Sie Sitzungen anhängen und trennen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X