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/null
jika 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?
daemon
dankillproc
sebagai gantinya