0

可能重复:
如何在 linux 中将 Perl 脚本作为系统守护进程运行?

我正在编写的许多维护 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 的 “守护进程”,但这需要用 C 语言编写我的脚本并编译它们。我还必须编写代码来处理命令行参数。另一种选择是调用“守护程序”的编译版本,但这似乎很混乱。就像我说的,一个简单的 Perl 或 Python 解决方案将是首选。

4

3 回答 3

2

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

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

如果由于某种原因这对您不起作用(例如,IIRC,它需要 2.6+ 或 3.1+,而您可能拥有 2.5 或 3.0),那么 PEP 最后会提供指向各种其他模块和配方的链接。

于 2013-01-08T01:32:21.990 回答
2

您是否调查过Proc::Daemon

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

或者有Working::Daemon

Working::Daemon - 用于将脚本变成守护进程的 Perl 扩展。
它还支持启动、停止、状态和重新启动。

还讨论了如何在 Linux 中将 Perl 脚本作为系统守护进程运行?

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

于 2013-01-08T01:25:55.253 回答
1

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

$ supervisorctl start server
$ supervisorctl stop server

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

$ supervisorctl start all
$ supervisorctl stop all

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

于 2013-01-08T01:38:41.560 回答