可能重复:
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解决方案。
答案 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
这种方法非常棒,因为它不需要您修改自己的代码。因此,它与您编写程序的语言无关,这是另一种特权。