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?
daemon
vekillproc
bunun yerine