program tip

Linux에서 Perl 스크립트를 시스템 데몬으로 실행하려면 어떻게해야합니까?

radiobox 2020. 12. 15. 18:54
반응형

Linux에서 Perl 스크립트를 시스템 데몬으로 실행하려면 어떻게해야합니까?


Linux에서 데몬으로 실행할 Perl 스크립트를 얻는 간단한 방법은 무엇입니까?

현재 이것은 CentOS에 있습니다. 시스템과 함께 시작하고 시스템과 함께 종료하기를 원하므로 일부 /etc/rc.d/init.d통합도 좋지만 항상 사용자 지정 줄을 /etc/rc.d/rc.local.


가장 쉬운 방법은 Proc :: Daemon 을 사용하는 것입니다 .

#!/usr/bin/perl

use strict;
use warnings;
use Proc::Daemon;

Proc::Daemon::Init;

my $continue = 1;
$SIG{TERM} = sub { $continue = 0 };

while ($continue) {
     #do stuff
}

또는 Proc :: Daemon이 수행하는 모든 작업을 수행 할 수 있습니다.

  1. 자식을 포크하고 부모 프로세스를 종료합니다.
  2. 세션 리더가 되십시오 (제어 터미널에서 프로그램을 분리).
  3. 다른 자식 프로세스를 포크하고 첫 번째 자식을 종료합니다. 이것은 제어 터미널을 획득 할 가능성을 방지합니다.
  4. 현재 작업 디렉토리를 "/".
  5. 파일 생성 마스크를 지 웁니다.
  6. 열려있는 모든 파일 설명자를 닫습니다.

런레벨 시스템과의 통합은 쉽습니다. 에서 다음과 같은 스크립트가 필요합니다 ( XXXXXXXXXXXXPerl 스크립트의 이름, 기능 YYYYYYYYYYYYYYYYYYY에 대한 설명 및 /path/toPerl 스크립트 경로로 대체 ) /etc/init.d. CentOS를 사용하고 있으므로에서 스크립트가 /etc/init.d있으면 chkconfig를 사용하여 다양한 런레벨에서 켜거나 끌 수 있습니다.

#!/bin/bash
#
# XXXXXXXXXXXX This starts and stops XXXXXXXXXXXX
#
# chkconfig: 2345 12 88
# description: XXXXXXXXXXXX is YYYYYYYYYYYYYYYYYYY
# processname: XXXXXXXXXXXX
# pidfile: /var/run/XXXXXXXXXXXX.pid
### BEGIN INIT INFO
# Provides: $XXXXXXXXXXXX
### END INIT INFO

# Source function library.
. /etc/init.d/functions

binary="/path/to/XXXXXXXXXXXX"

[ -x $binary ] || exit 0

RETVAL=0

start() {
    echo -n "Starting XXXXXXXXXXXX: "
    daemon $binary
    RETVAL=$?
    PID=$!
    echo
    [ $RETVAL -eq 0 ] && touch /var/lock/subsys/XXXXXXXXXXXX

    echo $PID > /var/run/XXXXXXXXXXXX.pid
}

stop() {
    echo -n "Shutting down XXXXXXXXXXXX: "
    killproc XXXXXXXXXXXX
    RETVAL=$?
    echo
    if [ $RETVAL -eq 0 ]; then
        rm -f /var/lock/subsys/XXXXXXXXXXXX
        rm -f /var/run/XXXXXXXXXXXX.pid
    fi
}

restart() {
    echo -n "Restarting XXXXXXXXXXXX: "
    stop
    sleep 2
    start
}

case "$1" in
    start)
        start
    ;;
    stop)
        stop
    ;;
    status)
        status XXXXXXXXXXXX
    ;;
    restart)
        restart
    ;;
    *)
        echo "Usage: $0 {start|stop|status|restart}"
    ;;
esac

exit 0

Chas가 제안한 Proc :: Daemon 이없는 경우 . Owens, 다음은 수작업으로 수행하는 방법입니다.

sub daemonize {
   use POSIX;
   POSIX::setsid or die "setsid: $!";
   my $pid = fork() // die $!; #//
   exit(0) if $pid;

   chdir "/";
   umask 0;
   for (0 .. (POSIX::sysconf (&POSIX::_SC_OPEN_MAX) || 1024))
      { POSIX::close $_ }
   open (STDIN, "</dev/null");
   open (STDOUT, ">/dev/null");
   open (STDERR, ">&STDOUT");
 }

가장 쉬운 방법은 daemon 을 사용하는 것 입니다. 모든 프로세스를 데몬으로 실행할 수 있습니다. 이것은 예를 들어 파이썬으로 변경하기로 결정한 경우 라이브러리에 대해 걱정할 필요가 없음을 의미합니다. 그것을 사용하려면 다음을 사용하십시오.

daemon myscript args

This should be available on most distros, but it might not be installed by default.

ReferenceURL : https://stackoverflow.com/questions/766397/how-can-i-run-a-perl-script-as-a-system-daemon-in-linux

반응형