在perl或python中启动停止守护程序库

时间:2013-01-08 01:21:38

标签: python perl process daemon

  

可能重复:
  How can I run a Perl script as a system daemon in linux?

我正在编写的许多维护shell脚本需要进行守护,我想要一个类似以下内容的库:

script

#!/usr/bin/...

use daemonize;

...

或者

daemonize('/path/to/external/script/or/program');

然后:

./script start
./script status
./script stop

这必须以非root身份运行,而不是init进程的一部分。

我更喜欢Perl中的库或Python。

我考虑过libslack.org的"daemon",但这需要在C中编写脚本并编译它们。我还需要编写代码来处理命令行参数。另一种选择是调用“守护进程”的编译版本,但这看起来很混乱。就像我说的那样,首选一个简单的Perl或Python解决方案。

3 个答案:

答案 0 :(得分:2)

您是否调查了Proc::Daemon

  

Proc :: Daemon - 将Perl程序作为守护程序进程运行。

另外还有Working::Daemon

  

工作::守护进程 - 用于转动脚本进入守护进程的Perl扩展。
  它还支持启动,停止,状态和重启。

还在How can I run a Perl script as a system daemon in linux?

进行了讨论

其他参考: http://www.perlmonks.org/?node_id=478839 http://erwan.lemonnier.se/talks/working_daemon.pdf

答案 1 :(得分:2)

Karthik T给出了perl的答案。或者更确切地说,一些最好的答案,因为当然有很多方法可以做到这一点。当然,对于Python来说,应该只有一种方法可以做到。

幸运的是,PEP 3143指定了Python守护程序库应该做什么,并且python-daemon处有一个参考实现,希望在将来的3.x版本中可以使用标准库。

如果出于某种原因这对你不起作用(例如,IIRC,它需要2.6+或3.1+,你可能有2.5或3.0),PEP最后会链接到各种其他模块和配方。

答案 2 :(得分:1)

这与您与库的接口方式不完全吻合,但supervisord是一个在Web操作中广泛使用的系统。不是在脚本中包含对它的引用,而是为要守护的每个程序编写一个配置(调用一个server),在其中指定要运行的脚本,各种环境变量,甚至是要运行的程序的实例。然后按如下方式向它发出命令:

$ supervisorctl start server
$ supervisorctl stop server

您还可以告诉supervisord启动或停止它管理的所有进程:

$ supervisorctl start all
$ supervisorctl stop all

这种方法非常棒,因为它不需要您修改自己的代码。因此,它与您编写程序的语言无关,这是另一种特权。