Gọi tới daemon trong tập lệnh /etc/init.d đang chặn, không chạy trong nền


9

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/nullnế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?

Câu trả lời:


4

Tôi đề nghị bạn trực tiếp kích hoạt tập lệnh perl thay vì thêm lớp bổ sung của daemonchức năng tập lệnh init . Thật khó để có được daemon đúng nếu bạn cố gắng tự viết chúng. Proc :: Daemon khá đơn giản.

Ngoài ra, đây là một cuộc thảo luận về cách viết perl daemon .

Phần thưởng trả lời: sử dụng daemontoolsProc :: Daemontools . Điều đó cung cấp một hệ thống quản lý daemon toàn diện và có lẽ bạn đã cài đặt daemontools. Một số người không thích daemontools nhưng nó hoàn thành công việc.

Cho dù tôi viết daemon bao nhiêu lần vẫn có vẻ kỳ lạ. Có lẽ tôi chỉ nên sử dụng dmon.


2

Nếu bạn đang sử dụng Debian và các dẫn xuất của nó, hãy sử dụng start-stop-daemontùy chọn -b để bắt đầu quá trình của bạn mà không gặp vấn đề gì.


Đây là máy RedHat, vì vậy nên sử dụng daemonkillprocthay vào đó
MariuszS

1
Điều này đã giải quyết vấn đề của tôi ngày hôm nay. Trong Ubuntu, tôi đã sao chép /etc/init.d/sk MP và không thể hiểu tại sao nó không chạy trong nền. Tôi cho rằng nó đã được thiết lập cho nền, nhưng hóa ra nó không phải là.
Ryan
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.