Tôi có một kịch bản Perl mà tôi muốn trình bày. Về cơ bản tập lệnh perl này sẽ đọc một thư mục cứ sau 30 giây, đọc các tệp mà nó tìm thấy và sau đó xử lý dữ liệu. Để đơn giản ở đây, hãy xem xét tập lệnh Perl sau (được gọi là synpipe_server, có một liên kết tượng trưng của tập lệnh này /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;
}
Vì vậy, kịch bản này về cơ bản in một cái gì đó cứ sau 3 giây.
Sau đó, khi tôi muốn tạo ra tập lệnh này, tôi cũng đã đặt tập lệnh bash này (còn được gọi là 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
Vì vậy, (nếu tôi đã hiểu rõ tài liệu cho daemon), tập lệnh Perl sẽ chạy trong nền và đầu ra sẽ được chuyển hướng đến /dev/null
nếu tôi thực thi:
service synpipe_server start
Nhưng đây là những gì tôi nhận được thay thế:
[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]#
Vì vậy, nó khởi động tập lệnh Perl nhưng chạy nó mà không tách nó ra khỏi phiên cuối cùng hiện tại và tôi có thể thấy đầu ra được in trong bảng điều khiển của mình ... đó không thực sự là điều tôi đang mong đợi. Ngoài ra, tệp PID trống (hoặc chỉ với một nguồn cấp dữ liệu, không có pid nào được trả về bởi daemon ).
Có ai có bất cứ ý tưởng về những gì tôi đang làm sai?
EDIT: có lẽ tôi nên nói rằng tôi đang sử dụng máy Red Hat.
Scientific Linux SL release 5.4 (Boron)
Nó sẽ thực hiện công việc nếu thay vì sử dụng chức năng daemon, tôi sử dụng một cái gì đó như:
nohup ${exe} >/dev/null 2>&1 &
trong tập lệnh init?
daemon
vàkillproc
thay vào đó