Jika Anda tidak memiliki Proc::Daemon seperti yang disarankan oleh Chas. Owens, begini cara melakukannya dengan tangan:
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");
}
Saya pikir cara termudah adalah dengan menggunakan daemon. Ini memungkinkan Anda untuk menjalankan proses apa pun sebagai daemon. Ini berarti Anda tidak perlu khawatir tentang pustaka jika Anda, misalnya, memutuskan untuk beralih ke python. Untuk menggunakannya, cukup gunakan:
daemon myscript args
Ini seharusnya tersedia di sebagian besar distro, tetapi mungkin tidak diinstal secara default.
Cara termudah adalah dengan menggunakan 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
}
Sebagai alternatif, Anda dapat melakukan semua hal yang dilakukan Proc::Daemon:
- Percabangan anak dan keluar dari proses induk.
- Menjadi pemimpin sesi (yang melepaskan program dari terminal pengendali).
- Percabangan proses anak lain dan keluar dari anak pertama. Ini mencegah kemungkinan memperoleh terminal pengendali.
- Ubah direktori kerja saat ini ke
"/"
. - Hapus topeng pembuatan file.
- Tutup semua deskriptor file yang terbuka.
Mengintegrasikan dengan sistem runlevel itu mudah. Anda memerlukan skrip seperti berikut (ganti XXXXXXXXXXXX
dengan nama skrip Perl, YYYYYYYYYYYYYYYYYYY
dengan deskripsi tentang fungsinya, dan /path/to
dengan jalur ke skrip Perl) di /etc/init.d
. Karena Anda menggunakan CentOS, setelah Anda memiliki skrip di /etc/init.d
, Anda cukup menggunakan chkconfig untuk mematikan atau menghidupkannya di berbagai runlevel.
#!/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