আমার একটি পার্ল স্ক্রিপ্ট রয়েছে যা আমি ডিমনাইজ করতে চাই। মূলত এই পার্ল স্ক্রিপ্ট প্রতি 30 সেকেন্ডে একটি ডিরেক্টরি পড়বে, এটি যে ফাইলগুলি খুঁজে পাবে সেগুলি পড়বে এবং তারপরে ডেটা প্রক্রিয়া করবে। এটি সহজ রাখতে এখানে নীচের পার্ল স্ক্রিপ্টটি বিবেচনা করুন (যাকে বলা হয় সিনপাইপ_সার্ভার, এই স্ক্রিপ্টটির একটি প্রতীকী লিঙ্ক এতে রয়েছে /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;
}
সুতরাং এই স্ক্রিপ্টটি মূলত প্রতি 3 সেকেন্ডে কিছু ছাপায়।
তারপরে, আমি যেমন এই স্ক্রিপ্টটি ডিমনাইজ করতে চাইছি, আমি এই ব্যাশ স্ক্রিপ্টটিকে (সিনপাইপ_সভারও বলা হয়) এও রেখেছি /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
সুতরাং, (যদি আমি ডেমনের জন্য ডকটি ভালভাবে বুঝতে পারি) পার্ল স্ক্রিপ্টটি পটভূমিতে চলতে হবে এবং /dev/null
যদি আমি সম্পাদন করি তবে আউটপুটটি পুনঃনির্দেশ করা উচিত :
service synpipe_server start
তবে পরিবর্তে আমি যা পাই তা এখানে:
[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]#
সুতরাং এটি পার্ল স্ক্রিপ্টটি শুরু করে তবে এটি বর্তমান টার্মিনাল অধিবেশন থেকে আলাদা না করে চালায় এবং আমি আমার কনসোলটিতে আউটপুট প্রিন্ট দেখতে পাচ্ছি ... যা আমি প্রত্যাশা করছিলাম তা আসলে এটি নয়। তদুপরি, পিআইডি ফাইলটি খালি (বা কেবল একটি লাইন ফিড সহ, ডেমন দ্বারা কোনও পিড ফেরত দেওয়া হয় না )।
আমি কী ভুল করছি সে সম্পর্কে কারও কি ধারণা আছে?
সম্পাদনা: সম্ভবত আমার বলা উচিত যে আমি রেড হ্যাট মেশিনে আছি।
Scientific Linux SL release 5.4 (Boron)
ডেমন ফাংশনটি ব্যবহার না করে যদি আমি কাজটি করি তবে আমি এই জাতীয় কিছু ব্যবহার করব:
nohup ${exe} >/dev/null 2>&1 &
আরআইডি স্ক্রিপ্টে?
daemon
এবংkillproc
পরিবর্তে