/etc/init.d脚本中对守护程序的调用被阻止,未在后台运行


9

我有一个要守护的Perl脚本。基本上,此perl脚本将每30秒读取一个目录,读取其找到的文件,然后处理数据。为了简单起见,请考虑以下Perl脚本(称为synpipe_server,该脚本中有一个符号链接/usr/sbin/):

#!/usr/bin/perl
use strict;
use warnings;

my $continue = 1;
$SIG{'TERM'}  = sub { $continue = 0; print "Caught TERM signal\n"; };
$SIG{'INT'} = sub { $continue = 0; print "Caught INT signal\n"; };

my $i = 0;
while ($continue) {
     #do stuff
     print "Hello, I am running " . ++$i . "\n";
     sleep 3;
}

因此,该脚本基本上每3秒打印一次。

然后,因为我想守护该脚本,所以我也将此bash脚本(也称为synpipe_server)放在/etc/init.d/

#!/bin/bash
# synpipe_server : This starts and stops synpipe_server
#
# chkconfig: 12345 12 88
# description: Monitors all production pipelines
# processname: synpipe_server
# pidfile: /var/run/synpipe_server.pid
# Source function library.
. /etc/rc.d/init.d/functions

pname="synpipe_server"
exe="/usr/sbin/synpipe_server"
pidfile="/var/run/${pname}.pid"
lockfile="/var/lock/subsys/${pname}"

[ -x $exe ] || exit 0

RETVAL=0

start() {
    echo -n "Starting $pname : "
    daemon ${exe}
    RETVAL=$?
    PID=$!
    echo
    [ $RETVAL -eq 0 ] && touch ${lockfile}
    echo $PID > ${pidfile}
}

stop() {
    echo -n "Shutting down $pname : "
    killproc ${exe}
    RETVAL=$?
    echo
    if [ $RETVAL -eq 0 ]; then
        rm -f ${lockfile}
        rm -f ${pidfile}
    fi
}

restart() {
    echo -n "Restarting $pname : "
    stop
    sleep 2
    start
}

case "$1" in
    start)
        start
    ;;
    stop)
        stop
    ;;
    status)
        status ${pname}
    ;;
    restart)
        restart
    ;;
    *)
        echo "Usage: $0 {start|stop|status|restart}"
    ;; esac

exit 0

因此,(如果我非常了解守护程序的文档)Perl脚本应该在后台运行,并且/dev/null如果执行以下命令,输出应该重定向到:

service synpipe_server start

但是这是我得到的:

[root@master init.d]# service synpipe_server start
Starting synpipe_server : Hello, I am running 1
Hello, I am running 2
Hello, I am running 3
Hello, I am running 4
Caught INT signal
                                                           [  OK  ]
[root@master init.d]# 

因此,它启动了Perl脚本,但是运行了它,而没有将其与当前的终端会话分离,因此我可以在控制台中看到输出的输出……这并不是我真正期望的。而且,PID文件为空(或仅带有换行符,daemon没有返回pid )。

有人知道我在做什么错吗?

编辑:也许我应该说我在Red Hat机器上。

Scientific Linux SL release 5.4 (Boron)

如果我不使用daemon函数,而是使用类似的东西,它将完成这项工作:

nohup ${exe} >/dev/null 2>&1 &

在初始化脚本中?

Answers:


4

我建议您直接守护perl脚本,而不要添加redhat init脚本daemon功能的额外层。如果尝试自己编写守护程序,则很难正确设置它们。Proc :: Daemon非常简单。

另外,这里还讨论了如何编写perl守护程序

奖励答案:使用daemontoolsProc :: Daemontools。这提供了一个全面的守护程序管理系统,并且您可能已经安装了daemontools。有些人不喜欢daemontools,但是可以完成工作。

不管我写多少次守护程序仍然看起来很奇怪。也许我应该只使用dæmon。


2

如果您使用的是Debian及其衍生版本,请使用start-stop-daemon-b选项毫无问题地启动您的进程。


这是RedHat机器,因此应使用daemonkillproc代替
MariuszS 2014年

1
今天,这解决了我的问题。在Ubuntu中,我复制了/etc/init.d/skeleton,无法弄清楚为什么它不在后台运行。我以为它已经设置为背景,但事实并非如此。
瑞安
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.