Red Hat'a servis olarak bir program yüklemem gerekiyor. Kendini arka planlamaz, PID dosyasını yönetmez veya kendi günlüklerini yönetmez. Sadece çalışır ve STDOUT ve STDERR'a yazdırır.
Standart init komut dosyalarını kılavuz olarak kullanarak aşağıdakileri geliştirdim:
#!/bin/bash
#
# /etc/rc.d/init.d/someprog
#
# Starts the someprog daemon
#
# chkconfig: 345 80 20
# description: the someprog daemon
# processname: someprog
# config: /etc/someprog.conf
# Source function library.
. /etc/rc.d/init.d/functions
prog="someprog"
exec="/usr/local/bin/$prog"
[ -e "/etc/sysconfig/$prog" ] && . "/etc/sysconfig/$prog"
lockfile="/var/lock/subsys/$prog"
RETVAL=0
check() {
[ `id -u` = 0 ] || exit 4
test -x "$exec" || exit 5
}
start() {
check
if [ ! -f "$lockfile" ]; then
echo -n $"Starting $prog: "
daemon --user someproguser "$exec"
RETVAL=$?
[ $RETVAL -eq 0 ] && touch "$lockfile"
echo
fi
return $RETVAL
}
stop() {
check
echo -n $"Stopping $prog: "
killproc "exec"
RETVAL=$?
[ $RETVAL -eq 0 ] && rm -f "$lockfile"
echo
return $RETVAL
}
restart() {
stop
start
}
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
restart
;;
status)
status "$prog"
RETVAL=$?
;;
*)
echo $"Usage: $0 {start|stop|restart|status}"
RETVAL=2
esac
exit $RETVAL
Benim hatam /etc/init.d dosyasındaki bazı komut dosyalarını kopyalayıp yapıştırmak olabilir. Her durumda, ortaya çıkan hizmet garip davranır:
service someprog start
programı başlattığımda terminale yazdırıyor ve komut tamamlanmıyor.- CTRL-C yaparsam, "Oturum sonlandırıldı, kabuğu öldürüyor ... ... öldürüldü. BAŞARISIZ" yazdırır. Kabuk istemimi tekrar almak için bunu yapmak zorundayım.
- Şimdi çalıştırdığımda
service someprog status
çalıştığını söylüyor ve PID'sini listeliyor. İçinde görebiliyorum,ps
böylece çalışıyor. - şimdi
service someprog stop
koştuğumda durmuyor. Hala çalıştığını doğrulayabilirimps
.
someprog
Arka plana gönderilmesi ve hizmet olarak yönetilmesi için neyi değiştirmem gerekir ?
Düzenleme: Şimdi ne "başka bir şey yapmak" dışında gerçek bir cevap ile ilgili birkaç soru bulduk:
- /Etc/init.d komut dosyasında daemon çağrısı engelleniyor, arka planda çalışmıyor
- Kabuk betiği CentOS'ta bir daemon olarak çalışacak mı?
Düzenleme: çift çatalla ilgili bu cevap sorunumu çözmüş olabilir, ancak şimdi programımın kendisi çift çatal ve işe yarıyor: https://stackoverflow.com/a/9646251/898699