AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 480822
Accepted
Logan
Logan
Asked: 2013-02-21 11:32:01 +0800 CST2013-02-21 11:32:01 +0800 CST 2013-02-21 11:32:01 +0800 CST

作为非特权用户的 Upstart Job 因权限被拒绝而失败

  • 772

我正在尝试设置以非特权用户身份运行的 Sage Cell Server(一种开源数学引擎)。我创建了非特权用户sagecell来完成这项工作。它安装正确,如果我正常运行它使用

sagecell@primary-server:~/sage/devel/sagecell$ ../../sage web_server.py

然后一切都按预期工作。这个应用程序的一个有趣要求(可能相关也可能不相关)是它需要无密码 ssh 登录(即ssh localhost有效)。我已经使用 ssh-key 设置了非特权帐户来完成这项工作。

现在,我没有在启动服务器并在屏幕会话中运行它后手动创建屏幕会话,而是尝试使用此设置创建一个 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?

upstart
  • 3 3 个回答
  • 2913 Views

3 个回答

  • Voted
  1. vonbrand
    2013-02-21T11:44:33+08:002013-02-21T11:44:33+08:00

    “启动龙卷风网络服务器”表示它在哪个端口启动自己的网络服务器?如果80端口正常,只有root可以做到。查看http://www.itp.uzh.ch/~dpotter/howto/daemonize,检查 Pyhon 是否对此有一些指导方针。Sage 文档推荐什么?它无论如何都不是一个边缘包,我假设他们建议一些像 Ubuntu 这样的主流发行版(如果它还没有打包使用的话)。

    • 1
  2. Best Answer
    vesako
    2013-02-26T03:21:31+08:002013-02-26T03:21:31+08:00

    仅指定运行级别的启动条件:

    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 用户具有写入权限的位置。

    • 1
  3. jamesodhunt
    2013-02-28T09:17:09+08:002013-02-28T09:17:09+08:00

    如果您正在运行 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诸如此类的变量。作为替代方案,您可能需要考虑用户作业:

    • http://upstart.ubuntu.com/cookbook/#user-job

    如果您确实希望使用 GNU Screen,请参阅:

    • http://upstart.ubuntu.com/cookbook/#run-an-application-through-gnu-screen
    • 0

相关问题

  • 让新贵从 /etc/environment 读取环境以获取服务

  • 新贵脚本:联网后运行任务

  • Ubuntu Server 未重新启动但将关机

  • 使用 Upstart 记录守护进程的输出

  • 使用 upstart 在 ubuntu karmic (9.10) 中重新启动网络

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve