我试图build立一个Sage Cell Server(一个开源的math引擎)作为一个非特权用户运行。 我已经创build了无特权的用户sagecell来完成这项工作。 它正确安装,如果我正常使用它运行
sagecell@primary-server:~/sage/devel/sagecell$ ../../sage web_server.py
那么一切都按预期工作。 这个应用程序的一个有趣的需求(可能相关也可能不相关)是它需要一个无密码的sshlogin(即ssh localhost工作)。 我已经用ssh-key设置了无特权帐户来完成这项工作。
现在,在启动服务器并在屏幕会话中运行它之后,我并没有手动创build一个屏幕会话,而是尝试了一下这个设置:
description "Sage Cell Server Starter" start on runlevel [2345] stop on starting rc runlevel=[016] kill timeout 5 exec su -s /bin/sh -c 'exec "$0" "$@"' sagecell -- /home/sagecell/sage/sage /home/sagecell/sage/devel/sagecell/web_server.py
但是,这不起作用。 查看/var/log/upstart/sagecell.log会出现以下错误:
2013-02-20 00:11:09,665 sagecell:INFO starting tornado web server Traceback (most recent call last): File "/home/sagecell/sage/devel/sagecell/web_server.py", line 78, in <module> application = SageCellServer() File "/home/sagecell/sage/devel/sagecell/web_server.py", line 57, in __init__ kernel_timeout=kernel_timeout) File "/home/sagecell/sage-5.7.rc0/devel/sagecell-main/trusted_kernel_manager.py", line 28, in __init__ self._sender = sender.AsyncSender() # Manages asynchronous communication File "/home/sagecell/sage-5.7.rc0/devel/sagecell-main/sender.py", line 22, in __init__ self.router.bind(self.filename) File "socket.pyx", line 489, in zmq.core.socket.Socket.bind (zmq/core/socket.c:4797) zmq.core.error.ZMQError: Permission denied
编辑:应该指出的是,应用程序绑定到端口8080(据我所知,只有8080)。 重要的是,当我运行它时没有特权,但当Upstart以同一个用户运行时没有特权。
任何人都可以告诉我,为什么一个应用程序在用户sagecell下运行得sagecell无法在运行脚本sagecell的暴发户作业下运行?
仅指定运行级别的开始条件:
start on runlevel [2345]
在启动过程中很早就发生了。 那时通常没有可用的networking设备。 另外,许多其他服务尚未开始。
正如你从这个日志行可以看到的:
File "socket.pyx", line 489, in zmq.core.socket.Socket.bind (zmq/core/socket.c:4797) zmq.core.error.ZMQError: Permission denied
它不能绑定到一个套接字,这表明networking设备还没有启动。
你要做的就是调整启动条件,以便在有足够的基础设施可用的时候启动服务。
这就是我在一个需要启动Web服务的情况下所使用的:
start on (runlevel [2345] and local-filesystems and net-device-up IFACE!=lo)
这可以确保只有在本地文件系统可用时以及networking连接启动时才能启动服务。 这里还定义了一个本地回环设备对于networking连接是不够的。 节要求一个真实的networking接口,如eth0 。
那么可能会有默认的目录问题。 Upstart运行已启动的程序,默认目录设置为/。 以su开头的应用程序可能没有足够的权限来写入文件(日志文件等)
尝试添加以下节:
chdir /home/sagecell/sage/devel/sagecell
这将默认目录更改为sagecell用户具有写入权限的位置。
“启动龙卷风Web服务器”表示它启动自己的Web服务器,在什么端口? 如果正常的端口80,只有root可以做到这一点。 看看http://www.itp.uzh.ch/~dpotter/howto/daemonize ,检查Pyhon是否有这方面的一些指导。 什么Sage文档build议? 这不是一个附带的任何方式,我假设他们build议一些像Ubuntu这样的主stream发行版(如果它已经被打包使用,那就是)。
如果你运行的是新手1.4或更新版本,你可以使用setuid stanza而不是使用su :
setuid sagecell
关于环境新贵运行你的工作,请参阅:
特别要注意,像任何用户一样运行系统作业时,甚至像$HOME这样的variables也不会被默认设置。 作为替代scheme,您可能需要考虑一个用户工作:
如果您想要使用GNU屏幕,请参阅: