Mam skrypt powłoki, który jest w zasadzie jednostronnym programem z logowaniem, który próbuję uruchomić ze skryptu inicjującego. Korzystam z daemon
funkcji wewnątrz, /etc/init.d/functions
aby go uruchomić, ponieważ wydaje się, że Redhat nie jest start-stop-daemon
dostępny. Kiedy wywołam skrypt skryptowy init ( /etc/init.d/script start
), pozostaje on na pierwszym planie, a nie kończy i nie uruchamia procesu. Jaki jest właściwy sposób demonizacji tego skryptu?
Skrypt do uruchomienia:
# conf file where variables are defined
. /etc/script.conf
echo "Starting..." | logger -i
echo "Monitoring $LOG_LOCATION." | logger -i
echo "Sending to $MONITOR_HOST:$MONITOR_PORT." | logger -i
tail -n 1 -F $LOG_LOCATION |
grep WARN --line-buffered |
/usr/bin/nc -vv $MONITOR_HOST $MONITOR_PORT 2>&1 |
logger -i
skrypt inicjujący:
#!/bin/bash
# Source Defaults
. /etc/default/script
# Source init functions
. /etc/init.d/functions
prog=/usr/local/bin/script.sh
[ -f /etc/script.conf ] || exit 1
RETVAL=0
start()
{
# Quit if disabled
if ! $ENABLED; then
echo "Service Disabled in /etc/default/script"
exit 1
fi
echo "Starting $prog"
daemon $prog
RETVAL=$?
return $RETVAL
}
stop ()
{
echo -n $"Stopping $prog: "
killproc $prog
RETVAL=$?
return $RETVAL
}
reload()
{
echo "Reload command is not implemented for this service."
return $RETVAL
}
restart()
{
stop
start
}
condrestart()
{
echo "Not Implemented."
}
# See how we were called.
case "$1" in
start)
start
;;
stop)
stop
;;
status)
status $prog
;;
restart)
restart
;;
reload)
reload
;;
condrestart)
condrestart
;;
*)
echo $"Usage: $0 {start|stop|status|restart|condrestart|reload}"
RETVAL=1
esac
Ostatnie ~ 20 linii wykonania przy pomocy bash -vx:
+ case "$1" in
+ start
+ true
+ echo 'Starting /usr/local/bin/script.sh'
Starting /usr/local/bin/script.sh
+ daemon /usr/local/bin/script.sh
+ local gotbase= force=
+ local base= user= nice= bg= pid=
+ nicelevel=0
+ '[' /usr/local/bin/script.sh '!=' /usr/local/bin/script.sh ']'
+ '[' -z '' ']'
+ base=script.sh
+ '[' -f /var/run/script.sh.pid ']'
+ '[' -n '' -a -z '' ']'
+ ulimit -S -c 0
+ '[' -n '' ']'
+ '[' color = verbose -a -z '' ']'
+ '[' -z '' ']'
+ initlog -q -c /usr/local/bin/script.sh
shell-script
rhel
init-script
bshacklett
źródło
źródło
bash -vx ...
i publikujesz ostatnie wiersze, abyśmy mogli zobaczyć, co pozostaje na pierwszym planie.daemon
, jest też pakiet RPM . Przy okazji, istnieje wiele narzędzi do monitorowania dzienników ( zacznij tutaj ).#!/bin/bash -vx
? Próbowałem to zrobić, ale nie wytworzyło to takiego samego wyniku ze skryptu inicjującego, jak w przypadku bezpośredniego uruchomienia skryptu powłoki.bash -vx
, tj.bash -vx /etc/init.d/script start
.Odpowiedzi:
Znalazłem skrypt w http://www.linuxforums.org/forum/programming-scripting/190279-daemon-etc-init-d-functions-does-not-return-launching-process.html#post897522 które udało mi modyfikować według własnych potrzeb. Ręcznie śledzi PID i tworzy plik PID za pomocą
pidof
. Skończyło się na tym, że musiałem to zmodyfikować,pgrep
ponieważpidof
nie mogłem zobaczyć PID mojego skryptu. Po tej modyfikacji działało dobrze. * Uwaga: pgrep wydaje się działać tylko wtedy, gdy pełna nazwa skryptu ma mniej niż 15 znakówOto, z czym skończyłem:
źródło
Nie znam Redhata, ale
daemon $prog &
wydaje mi się dziwny. Jeśli istnieje już funkcja do demonizacji, dlaczego konieczne jest (i przydatne) umieszczenie tej funkcji w tle? Dlatego spróbuj bez&
.źródło
/etc/init.d/functions
definiujedaemon
funkcję, która oczekuje, że jej argument się zdemonizuje, zajmuje się tylko takimi rzeczami jak zmiana użytkownika, ustawianie ulimitów, sprawdzanie (nie tworzenie!) pliku pid ... Najlepszym zastosowaniem tejdaemon
funkcji jest zastąpienie jej libslackdaemon
;)