• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

init.d Reihenfolge festlegen

chakaa

Member
Hallo,

ich möchte zwei Scripts im init.d nacheinander starten.
Kein Problem? Dann bitte ich um Lösung :roll:

Script 1: Name "vmware". LSB-Definitionen
Code:
# chkconfig: 235 19 08
# description: Manages the services needed to run VMware software
###

# Basic support for the Linux Standard Base Specification 1.3
# Used by insserv and other LSB compliant tools.
### BEGIN INIT INFO
# Provides: VMware
# Required-Start: $network $syslog
# Required-Stop:
# Default-Start: 2 3 5
# Default-Stop: 0 6
# Short-Description: Manages the services needed to run VMware software
# Description: Manages the services needed to run VMware software
### END INIT INFO

Jetzt möchte ich ein anderes Script "vmware-suspend" mit dem Parameter "stop" laufen lassen, bevor vmware beendet wird. Also quasi
Code:
vmware-suspend stop
vmware stop

Die LSB-Header von "vmware-suspend":
Code:
# chkconfig: 0356 19 07
# description: Stopping this service will suspend all running vmware guests
# (chkconfig vmware = 235 19 08)

### BEGIN INIT INFO
# Provides:                                     vmsuspend
# Required-Start:               $network
# ("vmware" throws error)
# Should-Start:
# Required-Stop:                vmware
# Should-Stop:
# Default-Start:                3 5
# Default-Stop:                 0 6
# Short-Description: Suspends running vmware guests
# Description:       Stopping this service will suspend all running vmware guests
### END INIT INFO

So, jetzt das Problem :/
Egal, was ich in der "vmware-suspend" rumprobiere (chkconfig:, Required-Stop usw.), die Ausgabe von
Code:
linux:/etc/init.d # chkconfig --del vmware* && chkconfig --add vmware* && d rc5.d/ | grep vmware
vmware                    0:off  1:off  2:off  3:off  4:off  5:off  6:off
vmware-suspend            0:off  1:off  2:off  3:off  4:off  5:off  6:off
vmware                    0:off  1:off  2:on   3:on   4:off  5:on   6:off
vmware-suspend            0:off  1:off  2:off  3:on   4:off  5:on   6:off
lrwxrwxrwx 1 root root  9  8. Okt 15:17 K15vmware -> ../vmware
lrwxrwxrwx 1 root root 17  8. Okt 15:17 K16vmware-suspend -> ../vmware-suspend
lrwxrwxrwx 1 root root 17  8. Okt 15:17 S06vmware-suspend -> ../vmware-suspend
lrwxrwxrwx 1 root root  9  8. Okt 15:17 S07vmware -> ../vmware

bleibt immer gleich, d.h. vmware-suspend wird immer nach vmware geKillt. Und es muss eben genau andersrum sein.

In "vmware" will ich nichts ändern. Vielleicht liegt es ja am fehlenden "Required-Stop"? Aber ich will bei einem Update nicht wieder daran denken müssen.
Und ich will nicht manuell die "Kxx"-Links umbenennen, sondern ganz standardkonform vorgehen.

Habe ich was übersehen, was mache ich falsch?
Für Hilfe wäre ich sehr dankbar.
 
A

Anonymous

Gast
chakaa schrieb:
lrwxrwxrwx 1 root root 9 8. Okt 15:17 K15vmware -> ../vmware
lrwxrwxrwx 1 root root 17 8. Okt 15:17 K16vmware-suspend -> ../vmware-suspend
lrwxrwxrwx 1 root root 17 8. Okt 15:17 S06vmware-suspend -> ../vmware-suspend
lrwxrwxrwx 1 root root 9 8. Okt 15:17 S07vmware -> ../vmware
erstens an den links brauchst du dich gar nicht zu stören, das ist nur noch Makulatur und wird so nur noch aus "nostalgischen Gründen" geführt und eventuell nur dann noch genutzt wenn die Scripte expiziede eben nicht paralell ausgeführt werden sollen. Ein manuelles Ändern hier ist Nonsens, das hat nicht lange Bestand und der nächste Durchlauf von insserv wird das sowieso wieder ändern.

Im Normalfall zählen nur die drei versteckten Dateien .depend.boot .depend.start und .depend.stop
In deinen Scripten steht doch alles drin ;) . Sowohl die Orginalscripte von VMware als auch dein vmware haben alle.

Code:
# Provides : VMware
bei dir wartet jedoch
Code:
# Required-Stop:                vmware
also auf etwas was dem System gar nicht als abhängiger Dienst gemeldet ist. Aus diesem Grunde werden sie eben unabhängig voneinander gestopt. Hier nicht den Dateinamen mit den zugewiesenen Dienstenamen verwechseln. Also "VM" groß schreiben und dann sollte das auch funktionieren.

robi
 
OP
C

chakaa

Member
Hallo robi,

danke für deine Antwort.

robi schrieb:
erstens an den links brauchst du dich gar nicht zu stören, das ist nur noch Makulatur und wird so nur noch aus "nostalgischen Gründen" geführt und eventuell nur dann noch genutzt wenn die Scripte expiziede eben nicht paralell ausgeführt werden sollen.

öcht? Das wußte ich noch garnicht. :???:
In allen Quellen (und ich habe etliche gelesen) wird immer nur der Sxx/Kxx Mechanismus beschrieben. Aber ich glaube dir :D

Im Normalfall zählen nur die drei versteckten Dateien .depend.boot .depend.start und .depend.stop

..womit das nächste Problem auftaucht.
Erstens ist es für mich noch schwerer zu durchschauen, in welcher Reihenfolge das abläuft.

Kannst du hier erkennen, ob vmware-suspend vor vmware beendet wird?
linux:/etc/init.d # cat .depend.stop | grep vmware
TARGETS = splash smbfs fbset kbd irq_balancer stopblktrace splash_early network syslog alsasound resmgr consolekit dbus earlysyslog vmware acpid cron postfix cups portmap mysql haldaemon SuSEfirewall2_init Mounter powersaved smpppd webmin smartd nmb zm apache2 avahi-daemon SuSEfirewall2_setup vmware-suspend avahi-dnsconfd fetchmail smb xinetd nscd sshd auditd inadyn xdm earlyxdm single reboot halt random
syslog: splash_early kill-2 vmware cron cups powersaved smpppd webmin smartd smbfs zm portmap nmb fetchmail postfix smb nscd auditd xdm clamd cyrus freshclam autoyast ntp spamd winbind rsyncd bluetooth multipathd rpasswdd pcscd gpm mailman icecream clamav-milter vsftpd openct svnserve skeleton.compat autofs powerd snmpd
network: splash_early kill-2 syslog vmware cron cups mysql Mounter smpppd webmin smbfs avahi-daemon portmap vmware-suspend nmb fetchmail postfix smb xinetd apache2 nscd sshd inadyn cyrus saslauthd ripngd autoyast ntp winbind ospfd inn nfs zebra mailman waitfornm icecream nfsserver bgpd ripd autofs ospf6d snmpd xfs amavis

Und zweitens bemerke ich, dass ein Test-Eintrag auftaucht (kill-2), den ich auch durch chkconfig -del nicht rauskriege.

Hier nicht den Dateinamen mit den zugewiesenen Dienstenamen verwechseln. Also "VM" groß schreiben und dann sollte das auch funktionieren.

..habe ich korrigiert, aber ich bin nicht sicher, ob das in .depend.stop berücksichtigt wurde (siehe kill-2)


Code:
In deinen Scripten steht doch alles drin   ;)

Stimmt schon - jetzt wäre es noch schön, wenn mein Linux das auch so sehen würde :/
 
A

Anonymous

Gast
zugegeben das ist wirklich nicht so ganz einfach zu verstehen. zwar steht in den Scripten /etc/init.d/skeleton +( skeleton.compat) ein paar wirklich hilfreiche Bemerkungen wie das zu konfigurieren ist, aber letztlich musste ich auch feststellen das das beim stopen dennoch nicht ganz so einfach geht wie man dort vermuten würden und man in vielen Fällen dann doch einiges probieren muss weil der Rechner trotzdem scheinbar macht was er will.

ich würde mal folgendes versuchen
vmsuspend
Code:
### BEGIN INIT INFO
# Provides:                                     vmsuspend
# Required-Start:               $network VMware
# ("vmware" throws error)
# Should-Start:
# Required-Stop:                VMware
# Should-Stop:
# Default-Start:                 2 3 5
# Default-Stop:                 0 6
# Short-Description: Suspends running vmware guests

vmware
Code:
## BEGIN INIT INFO
# Provides: VMware
# Required-Start: $network $syslog
# Required-Stop:
# Default-Start: 2 3 5
# Default-Stop: 0 6
# Short-Description: Manages the services needed to run VMware software
# Description: Manages the services needed to run VMware software

Die Grundidee dabei vmsuspend wird von vmware abhängig und beim runterfahren muss vmware warten bis vmsuspend komplett fertig ist. (Achtung habe vmsuspend noch im Runleve 2 zusätzlich mit hineingenommen)
Wenn beide Dateien geändert sind dann in folgender Reihenfolge noch mal alles neu konfigurieren lassen.
Code:
cd /etc/init.d
insserv -r vmsuspend
insserv -r vmware
insserv vmware
insserv vmsuspend

Wenn du das so machst, dann solltest du auch die Abhängigkeiten in den .depend.* Dateien dann besser sehen

robi
 
OP
C

chakaa

Member
Hurra, es klappt
show.php


Hier mal das Script /etc/init.d/vmware-suspend

Code:
#!/usr/bin/bash
# /etc/init.d/vmsuspend
#
# chkconfig: 0356 19 07
# description: Stopping this service will suspend all running vmware guests
# (chkconfig vmware = 235 19 08)

### BEGIN INIT INFO
# Provides:					vmsuspend
# Required-Start: $network VMware
# Should-Start:
# Required-Stop:	VMware
# Should-Stop:
# Default-Start:	2 3 5
# Default-Stop:	0 6
# Short-Description: Suspends running vmware guests
# Description:       Stopping this service will suspend all running vmware guests
### END INIT INFO

########################### syslog

SYSLOG=1
VERBOSE=0
LOGGER="/bin/logger"
FACILITY=`basename $0 | cut -d '.' -f1`

LOG() {
PRIORITY="`echo $* | cut -d ':' -f1`"
LOGMESSAGE="`echo $* | cut -d ':' -f2-`"
LOGMESSAGE="[$$]:$LOGMESSAGE"
if [ $VERBOSE ]; then
	echo "`date '+%b %e %H:%M:%S'`: $LOGMESSAGE"
	[ "$SYSLOG" = 1 ] && $LOGGER -t $FACILITY $LOGMESSAGE
else
	[ "$SYSLOG" = 1 ] && $LOGGER -t $FACILITY $LOGMESSAGE
fi
}
########################### eof syslog

VMRUN_BIN=/usr/bin/vmrun

VM_TYPE=server
HOST="https://localhost:8333/sdk"

# vmx=$(echo ${VMX} | sed 's/ /\\ /g')
# vmx="${VMX// /\\ }"

# read username=.., password=..
. /root/.auth/vmware-auth


test -x $VMRUN_BIN || {
	echo "$VMRUN_BIN not installed";
	if [ "$1" = "stop" ]; then exit 0;
	else exit 5; fi
}

. /etc/rc.status
rc_reset


case "$1" in
	start)
		echo -n "Starting vmsuspend (nothing to do) "
		rc_status -v
	;;

	stop)
		echo -n "vmsuspend: suspending vmware guests..."
		# LOG LIST=$($VMRUN_BIN -T $VM_TYPE -h "$HOST" -u """$username""" -p """$password""" list 2>>/dev/null | grep "\.vmx")
		for VMX in """$($VMRUN_BIN -T $VM_TYPE -h """$HOST""" -u """$username""" -p """$password""" list 2>>/dev/null | grep "\.vmx")"""
		do 
			if [ -n "$VMX" ]
			then
				$VMRUN_BIN -T $VM_TYPE -h """$HOST""" -u """$username""" -p """$password""" suspend """$VMX"""
				LOG "suspend $VMX (ExitCode=$?)"
			fi
		done
		rc_status -v
	;;

	*)
		echo "Usage: $0 {start|stop|}"
		exit 1
	;;

esac
rc_exit

Dieses mit insserv einbinden, wie robi oben geschrieben hat. Und funkt :D
 
Oben