如何在Linux中将Perl脚本作为系统守护程序运行?

时间:2009-04-19 23:35:59

标签: linux perl startup daemon shutdown

让一个Perl脚本在linux中作为守护进程运行的简单方法是什么?

目前,这是在CentOS上。我希望它启动系统并关闭系统,因此一些/etc/rc.d/init.d集成也会很好,但我总是可以向/etc/rc.d/rc.local添加自定义行。

4 个答案:

答案 0 :(得分:81)

最简单的方法是使用Proc::Daemon

#!/usr/bin/perl

use strict;
use warnings;
use Proc::Daemon;

Proc::Daemon::Init;

my $continue = 1;
$SIG{TERM} = sub { $continue = 0 };

while ($continue) {
     #do stuff
}

或者你可以完成Proc :: Daemon所做的所有事情:

  1. 分叉一个孩子并退出父进程。
  2. 成为会话负责人(将程序与控制终端分离)。
  3. 分叉另一个子进程并退出第一个孩子。这可以防止获得控制终端的可能性。
  4. 将当前工作目录更改为"/"
  5. 清除文件创建掩码。
  6. 关闭所有打开的文件描述符。
  7. 与运行级别系统集成非常简单。您需要一个如下所示的脚本(在{{1中将XXXXXXXXXXXX替换为Perl脚本的名称,YYYYYYYYYYYYYYYYYYY及其作用的描述,以及/path/to,其中包含Perl脚本的路径) }}。由于您使用的是CentOS,因此一旦您在/etc/init.d中拥有该脚本,您就可以使用chkconfig在各种运行级别中将其关闭或打开。

    /etc/init.d

答案 1 :(得分:39)

如果您没有Chas建议的Proc::Daemon。欧文斯,以下是你手工操作的方法:

sub daemonize {
   use POSIX;
   POSIX::setsid or die "setsid: $!";
   my $pid = fork() // die $!; #//
   exit(0) if $pid;

   chdir "/";
   umask 0;
   for (0 .. (POSIX::sysconf (&POSIX::_SC_OPEN_MAX) || 1024))
      { POSIX::close $_ }
   open (STDIN, "</dev/null");
   open (STDOUT, ">/dev/null");
   open (STDERR, ">&STDOUT");
 }

答案 2 :(得分:7)

我认为最简单的方法是使用daemon。它允许您作为守护程序运行任何进程。这意味着,如果您决定更改为python,则不必担心库。要使用它,只需使用:

daemon myscript args

这应该适用于大多数发行版,但默认情况下可能没有安装。

答案 3 :(得分:0)

我使用超级用户来运行perl脚本。

作为系统管理员,我希望最大程度地减少服务器之间的变化和变化,并坚持核心服务或最低限度的要求。

Supervisor已经安装并且可用于python-flask应用程序 在同一个盒子上运行。因此,我只是为要作为服务运行的perl脚本添加了一个conf文件。现在,我可以做

supervisorctl start/stop/restart my_perl_script_supervisor_service_name