我怎样才能在Linux中运行一个Perl脚本作为系统守护进程?

在Linux中获取Perl脚本作为守护进程运行的简单方法是什么?

目前,这是在CentOS上。 我希望它启动与系统和closures与系统,所以一些/etc/rc.d/init.d集成也不错,但我总是可以添加一个自定义行到/etc/rc.d/rc.local

最简单的方法是使用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. 成为会议的领导者(从控制terminal上分离程序)。
  3. 叉另一个孩子的过程,并退出第一个孩子。 这防止了获取控制terminal的可能性。
  4. 将当前工作目录更改为"/"
  5. 清除文件创build掩码。
  6. closures所有打开的文件描述符。

与运行级系统集成非常简单。 你需要一个像下面这样的脚本(用Perl脚本的名字YYYYYYYYYYYYYYYYYYYreplace为XXXXXXXXXXXX ,并用/etc/init.d /path/to来指代Perl脚本的path)。 既然你正在使用CentOS,那么一旦你在/etc/init.d有脚本,你可以使用chkconfig在不同的运行级别closures或打开它。

 #!/bin/bash # # XXXXXXXXXXXX This starts and stops XXXXXXXXXXXX # # chkconfig: 2345 12 88 # description: XXXXXXXXXXXX is YYYYYYYYYYYYYYYYYYY # processname: XXXXXXXXXXXX # pidfile: /var/run/XXXXXXXXXXXX.pid ### BEGIN INIT INFO # Provides: $XXXXXXXXXXXX ### END INIT INFO # Source function library. . /etc/init.d/functions binary="/path/to/XXXXXXXXXXXX" [ -x $binary ] || exit 0 RETVAL=0 start() { echo -n "Starting XXXXXXXXXXXX: " daemon $binary RETVAL=$? PID=$! echo [ $RETVAL -eq 0 ] && touch /var/lock/subsys/XXXXXXXXXXXX echo $PID > /var/run/XXXXXXXXXXXX.pid } stop() { echo -n "Shutting down XXXXXXXXXXXX: " killproc XXXXXXXXXXXX RETVAL=$? echo if [ $RETVAL -eq 0 ]; then rm -f /var/lock/subsys/XXXXXXXXXXXX rm -f /var/run/XXXXXXXXXXXX.pid fi } restart() { echo -n "Restarting XXXXXXXXXXXX: " stop sleep 2 start } case "$1" in start) start ;; stop) stop ;; status) status XXXXXXXXXXXX ;; restart) restart ;; *) echo "Usage: $0 {start|stop|status|restart}" ;; esac exit 0 

如果您没有Chasbuild议的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"); } 

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

 daemon myscript args 

这应该在大多数发行版上可用,但可能不会默认安装。