كيف يمكنني تشغيل برنامج نصي بيرل كخفي نظام في لينكس؟
سؤال
ما هي طريقة بسيطة للحصول على برنامج نصي بيرل يعمل كخفي في 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 يفعل:
- شوكة طفل ويخرج العملية الأصلية.
- تصبح زعيم الجلسة (الذي ينفصل البرنامج من محطة التحكم).
- شوكة عملية طفل أخرى والخروج من الطفل الأول. هذا يمنع إمكانات الحصول على محطة التحكم.
- تغيير دليل العمل الحالي إلى
"/"
. - امسح قناع إنشاء الملفات.
- أغلق جميع واصفات الملف المفتوح.
دمج مع نظام 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، ولكن قد لا يتم تثبيته بشكل افتراضي.