كيف يمكنني تشغيل برنامج نصي بيرل كخفي نظام في لينكس؟

StackOverflow https://stackoverflow.com/questions/766397

سؤال

ما هي طريقة بسيطة للحصول على برنامج نصي بيرل يعمل كخفي في Linux؟

حاليا، هذا في Centos. أريد أن تبدأ مع النظام وإغلاق النظام، لذلك البعض /etc/rc.d/init.d سيكون التكامل لطيفا أيضا، لكنني يمكن أن أضيف دائما خط مخصص /etc/rc.d/rc.local.

هل كانت مفيدة؟

المحلول

أسهل طريقة هي استخدام بروك :: الخفي.

#!/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. أغلق جميع واصفات الملف المفتوح.

دمج مع نظام runlevel سهل. تحتاج إلى نص مثل ما يلي (استبدال XXXXXXXXXXXX مع اسم البرنامج النصي بيرل، YYYYYYYYYYYYYYYYYYY مع وصف لما يفعله، و /path/to مع المسار إلى البرنامج النصي بيرل) في /etc/init.d. وبعد نظرا لأنك تستخدم CENTOS، بمجرد أن يكون لديك البرنامج النصي /etc/init.d, ، يمكنك فقط استخدام Chkconfig لإيقاف تشغيله أو في مختلف Runlevels.

#!/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

نصائح أخرى

إذا لم يكن لديك بروك :: الخفي كما اقترح من قبل تشاس. أوينز، إليك كيف يمكنك أن تفعل ذلك باليد:

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");
 }

أعتقد أن أسهل طريقة هي استخدام مخفي. وبعد يسمح لك بتشغيل أي عملية كخفي. هذا يعني أنك لا داعي للقلق بشأن المكتبات إذا قررت أنت، على سبيل المثال، بالتغيير إلى Python. لاستخدامها، فقط استخدم:

daemon myscript args

يجب أن يكون ذلك متاحا على معظم distros، ولكن قد لا يتم تثبيته بشكل افتراضي.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top