Python Script beim starten von Debian laden

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
defiance
User
Beiträge: 6
Registriert: Montag 21. April 2008, 02:29

Hallo,

beim Starten von Debian soll immer mein Pythonscript gestartet werden. Dazu haben ich in der init.d unten aufgeführtes Skript eingefügt. Des weiteren habe ich in der rc5.d unter dem Namen S92script einen Softlink darauf gelegt.

Leider wird das Programm nicht geladen, egal ob eine Konsole geöffnet ist oder nicht.

Muss bei Pythonskripten noch etwas spezielles beim Laden beachtet werden? Der manuelle Aufruf über /etc/init.d/script funktioniert problemlos.

Hier das Startskript

Code: Alles auswählen

#! /bin/sh
# Author: defiance <defiance at XYZ .de>

# Do NOT "set -e"

# PATH should only include /usr/* if it runs after the mountnfs.sh script
PATH=/sbin:/usr/sbin:/bin:/usr/bin
DESC="Mein Python Skript"
NAME=script
DAEMON=/usr/local/sbin/$NAME.py
DAEMON_ARGS="--options args"
PIDFILE=/var/run/$NAME.pid
SCRIPTNAME=/etc/init.d/$NAME

# Exit if the package is not installed
[ -x "$DAEMON" ] || exit 0

# Read configuration variable file if it is present
[ -r /etc/default/$NAME ] && . /etc/default/$NAME

# Load the VERBOSE setting and other rcS variables
. /lib/init/vars.sh

# Define LSB log_* functions.
# Depend on lsb-base (>= 3.0-6) to ensure that this file is present.
. /lib/lsb/init-functions

#
# Function that starts the daemon/service
#
do_start()
{
	# Return
	#   0 if daemon has been started
	#   1 if daemon was already running
	#   2 if daemon could not be started
	start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON --test > /dev/null \
		|| return 1
	start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON -- \
		$DAEMON_ARGS \
		|| return 2
	# Add code here, if necessary, that waits for the process to be ready
	# to handle requests from services started subsequently which depend
	# on this one.  As a last resort, sleep for some time.
}

#
# Function that stops the daemon/service
#
do_stop()
{
	# Return
	#   0 if daemon has been stopped
	#   1 if daemon was already stopped
	#   2 if daemon could not be stopped
	#   other if a failure occurred
	start-stop-daemon --stop --quiet --retry=TERM/30/KILL/5 --pidfile $PIDFILE --name $NAME
	RETVAL="$?"
	[ "$RETVAL" = 2 ] && return 2
	# Wait for children to finish too if this is a daemon that forks
	# and if the daemon is only ever run from this initscript.
	# If the above conditions are not satisfied then add some other code
	# that waits for the process to drop all resources that could be
	# needed by services started subsequently.  A last resort is to
	# sleep for some time.
	start-stop-daemon --stop --quiet --oknodo --retry=0/30/KILL/5 --exec $DAEMON
	[ "$?" = 2 ] && return 2
	# Many daemons don't delete their pidfiles when they exit.
	rm -f $PIDFILE
	return "$RETVAL"
}

#
# Function that sends a SIGHUP to the daemon/service
#
do_reload() {
	#
	# If the daemon can reload its configuration without
	# restarting (for example, when it is sent a SIGHUP),
	# then implement that here.
	#
	start-stop-daemon --stop --signal 1 --quiet --pidfile $PIDFILE --name $NAME
	return 0
}

case "$1" in
  start)
	[ "$VERBOSE" != no ] && log_daemon_msg "Starting $DESC" "$NAME"
	do_start
	case "$?" in
		0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
		2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
	esac
	;;
  stop)
	[ "$VERBOSE" != no ] && log_daemon_msg "Stopping $DESC" "$NAME"
	do_stop
	case "$?" in
		0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
		2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
	esac
	;;
  #reload|force-reload)
	#
	# If do_reload() is not implemented then leave this commented out
	# and leave 'force-reload' as an alias for 'restart'.
	#
	#log_daemon_msg "Reloading $DESC" "$NAME"
	#do_reload
	#log_end_msg $?
	#;;
  restart|force-reload)
	#
	# If the "reload" option is implemented then remove the
	# 'force-reload' alias
	#
	log_daemon_msg "Restarting $DESC" "$NAME"
	do_stop
	case "$?" in
	  0|1)
		do_start
		case "$?" in
			0) log_end_msg 0 ;;
			1) log_end_msg 1 ;; # Old process is still running
			*) log_end_msg 1 ;; # Failed to start
		esac
		;;
	  *)
	  	# Failed to stop
		log_end_msg 1
		;;
	esac
	;;
  *)
	#echo "Usage: $SCRIPTNAME {start|stop|restart|reload|force-reload}" >&2
	echo "Usage: $SCRIPTNAME {start|stop|restart|force-reload}" >&2
	exit 3
	;;
esac

:

Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Woher weißt Du denn, dass Dein Script nicht geladen wurde? Schreibt es irgendwo rein oder hat es sonst eine persistente Ausgabe?

Ich meine mich zu erinnern, dass es idR Programme gibt, die sich umd ie Einträge in der init.d kümmern und man da nicht unbedingt selber etwas reinschreiben sollte. Du gibst denen die Abhängigkeiten an und den stage, also etwa 3 für Netzwerk usw. Anhand dessen benennt er dann dann Start- bzw. Stop-Script. Da solltest Du noch mal recherchieren.
Benutzeravatar
Trundle
User
Beiträge: 591
Registriert: Dienstag 3. Juli 2007, 16:45

Hyperion hat geschrieben:Ich meine mich zu erinnern, dass es idR Programme gibt, die sich umd ie Einträge in der init.d kümmern und man da nicht unbedingt selber etwas reinschreiben sollte.
``update-rc.d`` z.B. oder simpler und mit TUI ``rcconf``.
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

Debian booted standardmaessig in Runlevel 2 oder 3, da werden die Scripte in rc5.d nicht ausgefuehrt...
Offizielles Python-Tutorial (Deutsche Version)

Urheberrecht, Datenschutz, Informationsfreiheit: Piratenpartei
defiance
User
Beiträge: 6
Registriert: Montag 21. April 2008, 02:29

Danke für die Antworten, der Fehler war der Runlevel. Ich habe das Skript nun in den Runlevel 2 verschoben und es läuft.

@Hyperion mein Programm macht zwar keine Ausgaben, aber stellt eine Netzwerkverbindung her, wenn bestimmte Faktoren eintreffen. Sind diese Faktoren erfüllt und es passiert nix, läuft das Skript nicht :-)

Aber eine weiter Frage hat sich mir jetzt noch gestellt. Unter welchem Benutzer wird das Python Skript ausgeführt wenn ich es beim Systemstart lade und wie kann ich es einem anderen Benutzer zuweisen?

Reicht es dafür aus, den Besitzer der Datei zu Ändern mit chown oder wird das anders geregelt?
Benutzeravatar
Trundle
User
Beiträge: 591
Registriert: Dienstag 3. Juli 2007, 16:45

defiance hat geschrieben:Aber eine weiter Frage hat sich mir jetzt noch gestellt. Unter welchem Benutzer wird das Python Skript ausgeführt wenn ich es beim Systemstart lade und wie kann ich es einem anderen Benutzer zuweisen?
``start-stop-daemon`` kennt ``--user``.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

defiance hat geschrieben: @Hyperion mein Programm macht zwar keine Ausgaben, aber stellt eine Netzwerkverbindung her, wenn bestimmte Faktoren eintreffen. Sind diese Faktoren erfüllt und es passiert nix, läuft das Skript nicht :-)
Ok ;-) Dennoch würde ich da mal einen logging-Mechanismus einbauen - es kann ja auch mal ein anderes Problem auftreten und seien es Fehler im Code ;-)
Antworten