【问题标题】:Daemonizing a python script in debian using virtualenv使用 virtualenv 在 debian 中守护一个 python 脚本
【发布时间】:2011-12-10 01:48:34
【问题描述】:

我已经看到很多用于在 linux 中对 python 脚本进行守护的脚本,但是关于如何使用它们的信息并不多。有人可以指导我吗?

我目前有一个冗长的 python 脚本,它在套接字上侦听传入消息,如果格式正确,则接受它,然后将其存储到数据库中。脚本本身只是打开套接字,然后监听一段时间(它完成了工作!)并在那里完成所有工作。

要守护它,我是否必须修改我当前的脚本或从单独的脚本中调用它?我已经看到了这两个例子,但都没有工作。

另外,我正在使用 virtualenv,这可能是我的问题的根源,关于将它与守护脚本一起使用的任何提示?

【问题讨论】:

  • 守护进程只是一个程序/脚本,它不断运行直到事件发生,如果没有事件发生(或在队列中),它将休眠一段时间......然后重复...... .. 你在做什么就是守护进程做什么。您是否要求使用环境启动它以使其始终运行?
  • 我需要安装在 virtualenv 中的各种东西供脚本使用。我想这就是为什么我还没有让它工作。另外我怎么知道它正在运行?我读过有关调用 ps aux 以显示列表的信息,但我在其中看不到它。

标签: python linux debian daemon virtualenv


【解决方案1】:

创建一个激活虚拟环境的 shell 脚本,并在后台运行您的 Python 脚本。

此外,虚拟环境中应该有一个 python 模块,您也可以从中导入和激活环境。我目前没有 virtualenv 工作,所以我无法检查它在哪里,但在虚拟环境中搜索 activate(或类似的东西),你应该找到它。

编辑:添加了一个最小的 Debian init.d 脚本

计算机启动时启动守护程序所需的绝对最小脚本是:

#!/bin/sh
/path/to/program &

& 使程序在后台运行,因此它不会停止其余的引导过程。

要获得更完整的脚本,请复制 /etc/init.d/skeleton 并编辑新文件。要编辑的重要部分是开头的块(在### BEGIN INIT INFO### END INIT INFO 之间,由update-rc.d 程序使用),以及NAMEDAEMONDAEMON_ARGS 变量。希望这就是制作启动脚本所需的全部内容。

这样激活脚本:

sudo update-rc.d <name of script> defaults
sudo update-rc.d <name of script> enable

然后开始它:

sudo update-rc.d <name of script> start

&lt;name of script&gt; 只是名称,而不是完整路径。

【讨论】:

  • 我有激活文件是的,所以我写了一个 bash 脚本?我如何守护它?
  • @ing0:也许您的意思是如何编写一个在计算机启动时启动的脚本,就像 /etc/init.d 中的所有其他程序一样?然后,这在一定程度上取决于您使用的 Linux 发行版。试试man update-rc.d,如果手册页存在,它应该包含如何操作的指针。也可以尝试谷歌startup script _linuxdist_
  • 目前使用的是debian的变种,我在网上找到的所有东西都提供这样的代码:code.activestate.com/recipes/…这种代码不需要吗?
  • @ing0:我更新了我的答案,简要介绍了如何制作启动脚本。
  • 非常感谢。我会让你知道我是怎么过的! :)
【解决方案2】:
script
  export PYTHONPATH=.:/home/ubuntu/.local/lib/python2.7/site-packages/:/home/ubuntu/python/lib/python2.7/site-packages/
  exec start-stop-daemon --start  --chuid ubuntu --exec /home/ubuntu/python_envs/MyProj/bin/python /home/ubuntu/www/MyProj/MyProj.py -- --config-file-dir=/home/ubuntu/www/MyProj/config/ >> /home/ubuntu/startup.log 2>&1 &
end script

当您需要在 python virtualenv 中运行应用程序时,您可以“激活”该 virtualenv,或使用该环境独特的 python 命令。

根据网站“如果您直接从 virtualenv 的 bin/ 目录运行脚本或 python 解释器(例如 path/to/env/bin/pip 或 /path/to/env/bin/python script.py)不需要激活。” - http://pypi.python.org/pypi/virtualenv

我还有一些从源代码编译的 python 模块。这些需要在 PYTHONPATH 环境变量中。这可能是您的 virtualenv 激活的一部分,使用 virtualwrapper 完成,或显式调用(如下所示)。

从 UPSTART 作业调用程序也可以。我的例子在上面。

在 Amazon EC2 上的 Ubuntu 10.10 实例上,我最好使用 start-stop-daemon 命令。 我还与其他一些新贵的“节”作斗争。我正在调用一个带有特定 virtualenv 和一些参数的 python 应用程序给我执行的程序。

【讨论】:

  • 您是否有任何适用于 upstart 的示例脚本(shell 和/或 python)?您提到“示例如下”。
猜你喜欢
  • 2012-12-06
  • 2015-07-05
  • 2014-06-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多