帮助在后台运行

2 投票
5 回答
4092 浏览
提问于 2025-04-15 21:59

这是一个简单的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()

它是一个套接字策略文件服务器(你可能听说过Adobe对套接字连接的限制 - 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账户运行它,但作为属于sudoers的ircd用户却无法运行。现在的问题是为什么呢?

5 个回答

1

试试看

nohup python that_server.py &

另外,

你正在尝试使用一个低于1024的端口,这需要特权或管理员权限。试试用一个更高的端口。

1

问题可能出在权限上,正如你更新中提到的。你正在连接到843端口,而这个端口是特权端口——也就是说,你需要以管理员身份才能打开它(可以在Stack Overflow上搜索一些其他的方法)。而sudoers并不重要,因为你并没有使用sudo。

真正的问题是你没有看到错误信息,这可能会让你更容易找到问题所在(或者至少能指引你找到正确的问题)。你可以尝试这样做:

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

这样做会在将进程放到后台之前,把输出重定向到一个文件中。

1

我对你的代码进行了测试,结果在这里运行得很好:

$ 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

撰写回答