/Etc/init.d komut dosyasında daemon çağrısı engelleniyor, arka planda çalışmıyor


9

Daemonize etmek istediğim bir Perl betiğim var. Temel olarak bu perl betiği her 30 saniyede bir bir dizini okuyacak, bulduğu dosyaları okuyacak ve daha sonra verileri işleyecektir. Burada basit tutmak için aşağıdaki Perl betiğini düşünün (synpipe_server olarak adlandırılır, bu betiğin sembolik bir bağlantısı vardır /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;
}

Yani bu script temel olarak her 3 saniyede bir baskı yapıyor.

Sonra, bu betiği daemonize etmek istediğim gibi, bu bash betiğini de (synpipe_server olarak da bilinir) koydum /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

Yani, (ben daemon için dokümanı iyi anladıysanız) Perl betiği arka planda çalışmalı ve yürütürsem çıkış yeniden yönlendirilmelidir /dev/null:

service synpipe_server start

Ama bunun yerine ne olsun:

[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]# 

Bu yüzden Perl betiğini başlatır, ancak geçerli terminal oturumundan ayırmadan çalıştırır ve konsolumdaki çıktıyı görebiliyorum ... Bu beklediğim gibi değil. Ayrıca, PID dosyası boş (veya yalnızca satır beslemesiyle, daemon tarafından döndürülen pid yok ).

Herkesin neyi yanlış yaptığım hakkında bir fikri var mı?

EDIT: belki bir Red Hat makinesinde olduğumu söylemeliyim.

Scientific Linux SL release 5.4 (Boron)

Daemon işlevini kullanmak yerine, şöyle bir şey kullanırsam işi yapardı:

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

init betiğinde?

Yanıtlar:


4

Redhat init script daemonfonksiyonunun ekstra katmanını eklemek yerine perl betiğini doğrudan daemonize etmenizi öneririz . Kendi başınıza yazmaya çalışırsanız, cinleri doğru bir şekilde bulmak zor. Proc :: Daemon oldukça basittir.

Ayrıca, perl cinlerinin nasıl yazılacağı üzerine bir tartışma .

Bonus cevap: Daemontools ve Proc :: Daemontools kullanın . Bu kapsamlı bir daemon yönetim sistemi sağlar ve muhtemelen zaten zaten daemontools yüklüdür. Bazı insanlar daemontools'u sevmez, ancak işi halleder.

Daemon yazdığım zaman ne olursa olsun hala garip görünüyor. Belki de sadece dæmon kullanmalýyým.


2

Debian ve türevlerini kullanıyorsanız start-stop-daemon, işleminizi sorunsuz başlatmak için -b seçeneğiyle kullanın.


Bu RedHat makinesi, bu yüzden kullanmalı daemonve killprocbunun yerine
MariuszS

1
Bu bugün sorunumu çözdü. Ubuntu'da /etc/init.d/skeleton kopyaladım ve neden arka planda çalışmadığını anlayamadım. Zaten arka plan için ayarlanmış olduğunu varsaydım, ama öyle değil.
Ryan
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.