Помогите запустить его в фоновом режиме - PullRequest
2 голосов
/ 25 апреля 2010

Вот простой демон python, который я не могу запустить как фоновый процесс:

#!/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()

Это файловый сервер с политикой сокетов (возможно, вы слышали об ограничении Adope, установленном для подключения к сокету - http://www.adobe.com/devnet/flashplayer/articles/socket_policy_files.html);, которое хорошо работает, когда запускается как "обычный" процесс - "python that_server.py", - но у меня проблема, чтобы запустить его в фоновом режиме.

Работает так: «that_server.py &», - не работает.

РЕДАКТИРОВАТЬ: Вот что я получил от оболочки:

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:~$

Я запускаю его, затем просто нажимаю кнопку ввода - и он говорит «остановился». В чем проблема?

Без команды sudo похожее происходит:

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:~$

РЕДАКТИРОВАТЬ 2: Я нашел это в файле nohup.out:

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

ОБНОВЛЕНИЕ: мне удалось запустить его, используя учетную запись root, но не смог как пользователь ircd (который принадлежит suddoers). И вопрос теперь, почему нет?

Ответы [ 5 ]

1 голос
/ 25 апреля 2010

Проблема, вероятно, в разрешениях, как отмечено в вашем обновлении. Вы подключаетесь к порту 843, который является привилегированным портом - вам нужно быть пользователем root, чтобы открыть его (ищите переполнение стека для других методов). Sudoers не имеет значения, так как вы не используете sudo.

Настоящая проблема здесь в том, что вы не видите ошибку, которая, вероятно, облегчила бы ее определение (или, по крайней мере, указала бы на правильную проблему). Возможно, вы захотите сделать:

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

Это перенаправит вывод в файл перед тем, как переведет процесс в фоновый режим.

1 голос
/ 25 апреля 2010

Куда идет выход? nohup.out? Что там? Есть ли трассировка исключений?

1 голос
/ 25 апреля 2010

Я инструментировал ваш код, и он прекрасно работает здесь:

$ 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
1 голос
/ 25 апреля 2010

Попробуйте

nohup python that_server.py &

Кроме того,

Вы пытаетесь использовать порт ниже 1024, для которого потребуется привилегированный / root-доступ. Попробуйте порт более высокого уровня.

0 голосов
/ 25 апреля 2010

Если корень этой проблемы заключается в запуске сценария даже после выхода из сеанса, вы можете использовать экранную команду. С помощью экрана вы можете прикреплять и отключать сеансы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...