Ich habe ein Shell-Skript, das im Wesentlichen einzeilig ist und Protokollierung enthält. Ich versuche, dieses Skript über ein Init-Skript auszuführen. Ich benutze die daemon
Funktion innerhalb von /etc/init.d/functions
, um es auszuführen, da Redhat anscheinend nicht start-stop-daemon
verfügbar ist. Wenn ich das init-Skript ( /etc/init.d/script start
) aufrufe, bleibt es im Vordergrund, anstatt den Prozess abzuschließen und laufen zu lassen. Wie kann ich dieses Skript ordnungsgemäß dämonisieren?
Auszuführendes Skript:
# 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
Init-Skript:
#!/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
Letzte ~ 20 Zeilen der Ausführung mit 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
quelle
quelle
bash -vx ...
und die letzten Zeilen posten, damit wir sehen können, was im Vordergrund bleibt.daemon
gibt auch ein RPM-Paket . Übrigens, es gibt viele Tools zur Protokollüberwachung ( hier starten ).#!/bin/bash -vx
? Ich habe versucht, dies zu tun, aber es wurde nicht die gleiche Ausgabe vom Init-Skript erzeugt, wie wenn ich das Shell-Skript direkt ausführen würde.bash -vx
, z.bash -vx /etc/init.d/script start
.Antworten:
Ich habe unter http://www.linuxforums.org/forum/programming-scripting/190279-daemon-etc-init-d-functions-does-not-return-launching-process.html#post897522 ein Skript gefunden, das ich ausführen konnte an meine Bedürfnisse anzupassen. Es verfolgt die PID manuell und erstellt eine PID-Datei mit
pidof
. Ich musste dies ändern, um es zu verwendenpgrep
dapidof
die PID meines Skripts nicht angezeigt werden konnte. Nach dieser Änderung hat es gut funktioniert. * Hinweis: pgrep scheint nur zu funktionieren, wenn der vollständige Skriptname weniger als 15 Zeichen lang istFolgendes ist mir eingefallen:
quelle
Ich kenne Redhat nicht, sehe aber
daemon $prog &
seltsam aus. Wenn es bereits eine Funktion zum Daemonisieren gibt, warum sollte es notwendig (und nützlich) sein, diese Funktion selbst in den Hintergrund zu stellen? Also ohne die probieren&
.quelle
/etc/init.d/functions
definiert einedaemon
Funktion, die erwartet, dass ihr Argument sich selbst dämonisiert, es kümmert sich nur um Dinge wie das Ändern des Benutzers, das Setzen von Ulimits, das Prüfen (nicht das Erstellen!) einer Pid-Datei ... Die beste Verwendung dieserdaemon
Funktion ist es, sie durch libslacksdaemon
zu ersetzen ;)