Panggilan ke daemon dalam skrip /etc/init.d sedang memblokir, tidak berjalan di latar belakang

9

Saya memiliki skrip Perl yang ingin saya daemonisasi. Pada dasarnya skrip perl ini akan membaca direktori setiap 30 detik, membaca file yang ditemukannya dan kemudian memproses data. Untuk membuatnya lebih sederhana di sini pertimbangkan skrip Perl berikut (disebut synpipe_server, ada tautan simbolis dari skrip ini /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;
}

Jadi skrip ini pada dasarnya mencetak sesuatu setiap 3 detik.

Kemudian, karena saya ingin memonemonikan skrip ini, saya juga meletakkan skrip bash ini (juga disebut synpipe_server) di /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

Jadi, (jika saya mengerti benar doc untuk daemon) skrip Perl harus dijalankan di latar belakang dan hasilnya harus diarahkan ke /dev/nulljika saya menjalankan:

service synpipe_server start

Tapi inilah yang saya dapatkan sebagai gantinya:

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

Jadi ia memulai skrip Perl tetapi menjalankannya tanpa melepaskannya dari sesi terminal saat ini, dan saya dapat melihat output dicetak di konsol saya ... yang sebenarnya bukan yang saya harapkan. Selain itu, file PID kosong (atau hanya dengan umpan baris, tidak ada pid yang dikembalikan oleh daemon ).

Adakah yang tahu kesalahan saya?

EDIT: mungkin saya harus mengatakan bahwa saya menggunakan mesin Red Hat.

Scientific Linux SL release 5.4 (Boron)

Apakah ini akan berfungsi jika alih-alih menggunakan fungsi daemon, saya menggunakan sesuatu seperti:

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

dalam skrip init?

tony
sumber

Jawaban:

4

Saya sarankan Anda mengubah script perl secara langsung alih-alih menambahkan lapisan tambahan daemonfungsi skrip init redhat . Sulit untuk mendapatkan daemon dengan benar jika Anda mencoba menulisnya sendiri. Proc :: Daemon cukup mudah.

Juga, inilah diskusi tentang bagaimana menulis perl daemon .

Jawaban bonus: gunakan daemontools dan Proc :: Daemontools . Itu menyediakan sistem manajemen daemon yang komprehensif dan Anda mungkin sudah menginstal daemontools. Beberapa orang tidak menyukai daemontools tetapi itu menyelesaikan pekerjaan.

Tidak peduli berapa kali saya menulis daemon masih terasa aneh. Mungkin aku harus menggunakan demon.

Phil Hollenback
sumber
2

Jika Anda menggunakan Debian dan turunannya, gunakan start-stop-daemonopsi -b untuk memulai proses Anda tanpa masalah.

Dom
sumber
Ini adalah mesin RedHat, jadi sebaiknya gunakan daemondan killprocsebagai gantinya
MariuszS
1
Ini memecahkan masalah saya hari ini. Di Ubuntu, saya menyalin /etc/init.d/skeleton dan tidak tahu mengapa itu tidak berjalan di latar belakang. Saya berasumsi itu sudah diatur untuk latar belakang, tetapi ternyata tidak.
Ryan