我正在尝试设置以非特权用户身份运行的 Sage Cell Server(开源数学引擎)。我已创建非特权用户sagecell
来执行此任务。它已正确安装,如果我使用以下命令正常运行它
sagecell@primary-server:~/sage/devel/sagecell$ ../../sage web_server.py
然后一切都按预期工作。此应用程序的一个有趣的要求(可能相关也可能不相关)是它需要无密码 ssh 登录(即ssh localhost
有效)。我已经使用 ssh 密钥设置了非特权帐户来完成这项工作。
现在,我不再在启动服务器并在屏幕会话中运行它之后手动创建屏幕会话,而是尝试使用以下设置创建一个 upstart 作业:
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
却无法在运行脚本 AS 的新贵作业下运行sagecell
吗?
答案1
仅指定运行级别的启动条件:
start on runlevel [2345]
发生在启动过程的早期。此时通常没有可用的网络设备。此外,许多其他服务尚未启动。
从该日志行可以看出:
File "socket.pyx", line 489, in zmq.core.socket.Socket.bind (zmq/core/socket.c:4797) zmq.core.error.ZMQError: Permission denied
它无法绑定到套接字,这表明网络设备尚未启动。
你要做的是调整启动条件,以便当有足够的基础设施可用时,服务稍后启动。
这是我在需要使用 upstart 启动 Web 服务的情况下使用的方法:
start on (runlevel [2345] and local-filesystems and net-device-up IFACE!=lo)
这可确保您的服务仅在本地文件系统可用时启动和当网络连接建立时。这里还定义了本地环回设备不足以进行网络连接。此节要求实际网络接口已启动,如eth0
。
编辑
然后可能存在默认目录问题。Upstart 运行启动的程序时将默认目录设置为 /。启动的应用程序su
可能没有足够的权限来写入其文件(日志文件等)
尝试添加以下节:
chdir /home/sagecell/sage/devel/sagecell
这会将默认目录更改为 sagecell 用户具有写权限的地方。
答案2
“启动 tornado web 服务器”表示它启动了自己的 web 服务器,在哪个端口?如果是普通端口 80,则只有 root 可以执行此操作。查看http://www.itp.uzh.ch/~dpotter/howto/daemonize,检查 Pyhon 是否有这方面的指导方针。Sage 文档推荐了什么?它绝不是一个边缘软件包,我认为他们会为像 Ubuntu 这样的主流发行版推荐一些东西(如果它还没有打包好以供使用的话)。
答案3
如果您运行的是 upstart 1.4 或更新版本,则可以使用 setuid 节,而不是使用su
:
setuid sagecell
关于 upstart 运行你的作业的环境,请参阅:
- http://upstart.ubuntu.com/cookbook/#checking-how-a-service-might-react-when-run-as-a-job
- http://upstart.ubuntu.com/cookbook/#see-the-environment-a-job-runs-in
特别要注意的是,即使像$HOME
will不是以任何用户身份运行系统作业时默认设置。作为替代方案,您可能需要考虑用户作业:
如果您确实希望使用 GNU Screen,请参阅: