[gelöst]Befehl beim runterfahren ausführen

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
clue
Beiträge: 930
Registriert: 08.07.2007 17:36:57

[gelöst]Befehl beim runterfahren ausführen

Beitrag von clue » 17.09.2010 23:21:38

Ok, nun habe ich mich totgegoogelt, aber leider nichts Vernünftiges gefunden.
Ich möchte einfach einen einzigen Befehl sowohl beim reboot als auch beim shutdown ausführen lassen: truecrypt -d.

Ich habe mir sogar das http://www.debian.org/doc/debian-policy ... s-sysvinit angesehen. Aber ein Script zu erstellen, was sowohl einen start-Befehl als auch einen stopp-Befehl entgegen nimmt, ist wohl ein overkill für meinen Anwendungsfall.

Wie kann ich meinem Squeeze beibringen, den Befehl wie gewünscht auszuführen? Es muss doch einen einfacheren Weg geben.
Zuletzt geändert von clue am 21.09.2010 20:59:55, insgesamt 1-mal geändert.
Offenbarung 13 erfüllt sich gerade vor unseren Augen, genießen wir also die letzten Jahre unserer Scheinfreiheit

Benutzeravatar
Six
Beiträge: 8045
Registriert: 21.12.2001 13:39:28
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Siegburg

Re: Befehl beim runterfahren ausführen

Beitrag von Six » 18.09.2010 10:41:06

Schreibe den Befehl in ein Shellskript. Schmeiß das Skript nach /etc/init.d. Benutze update-rc.d oder linke manuell von rc0.d und rc6.d . Fertig.
Be seeing you!

clue
Beiträge: 930
Registriert: 08.07.2007 17:36:57

Re: Befehl beim runterfahren ausführen

Beitrag von clue » 19.09.2010 15:13:13

Danke für Deine Antwort! Aber ich werd noch wahnsinnig. Das klappt einfach nicht.

Ich habe /etc/init.d/tcunmount.sh angelegt. Da drin steht:

Code: Alles auswählen

#! /bin/sh
echo "unmounte truecrypt container ..."
/usr/bin/truecrypt -d
sleep 10
Die habe ich dann auch brav per ln -s /etc/init.d/tcunmount.sh /etc/rc1.d/K02tcunmount verlinkt.
Wenn ich nun auf der Konsole /etc/rc1.d/K02tcunmount eingebe, dann klappts wie geplant: Der Container wird brav ausgehängt und meine echo-Meldung erscheint.

Doch Wehe ich führe ein init 1 aus. Zwar ist mein Container dann nicht mehr gemountet und es läuft auch kein Truecrypt Prozess mehr, aber ob mein Container sauber ausgehängt wurde, weiß ich dann leider nicht. Außerdem existiert weiterhin der Eintrag /dev/mapper/truecrypt1. Wenn mein Skript wie geplant ausgeführt worden wäre, müsste doch normalerweise mein Text nach dem echo zu lesen sein, aber Pustekuchen! Ob ich das Skript nun weglasse oder nicht, das Ergebnis ist in beiden Fällen identisch. Scheinbar wird mein Skript nicht ausgeführt.

Warum klappt das denn nicht?
Offenbarung 13 erfüllt sich gerade vor unseren Augen, genießen wir also die letzten Jahre unserer Scheinfreiheit

Benutzeravatar
debdog
Beiträge: 652
Registriert: 11.02.2007 10:53:12
Wohnort: Do,womrkoihochdeitschko

Re: Befehl beim runterfahren ausführen

Beitrag von debdog » 20.09.2010 22:50:17

clue hat geschrieben:Die habe ich dann auch brav per ln -s /etc/init.d/tcunmount.sh /etc/rc1.d/K02tcunmount verlinkt.
Sind die die mit K beginnen nicht die die nicht ausgeführt werden? Mach da mal testweise ein S draus.
Oben gemachte Angaben, Falls nicht anderweitig Erwähnt, beziehen sich auf Debian Stable (Squeeze) amd64.
"Die Einen glauben zu Wissen, die Anderen wissen zu Glauben."

clue
Beiträge: 930
Registriert: 08.07.2007 17:36:57

Re: Befehl beim runterfahren ausführen

Beitrag von clue » 20.09.2010 23:32:18

:( Schnief! Läuft leider immer noch nicht. Hab ein ln -s /etc/init.d/tcunmount.sh /etc/rc1.d/S02tcunmount gemacht. Danach mal ein init 1: Pustekuchen. Kann es sein, dass Squeeze das Verfahren irgendwie geändert hat? Oder muss ich wirklich das /etc/init.d/skeleton template als Vorlage verwenden?
Offenbarung 13 erfüllt sich gerade vor unseren Augen, genießen wir also die letzten Jahre unserer Scheinfreiheit

Benutzeravatar
debdog
Beiträge: 652
Registriert: 11.02.2007 10:53:12
Wohnort: Do,womrkoihochdeitschko

Re: Befehl beim runterfahren ausführen

Beitrag von debdog » 21.09.2010 02:02:55

Schade. ;-)
Hab noch nie ein Script beim Runterfahren benötigt also rate ich mal fröhlich weiter: Bist Du sicher, daß das Script nicht ausgeführt wird oder könnte es auch sein, daß es an etwas Anderem scheitert? Hast Du die /var/log/syslog mal durchforstet?
Oben gemachte Angaben, Falls nicht anderweitig Erwähnt, beziehen sich auf Debian Stable (Squeeze) amd64.
"Die Einen glauben zu Wissen, die Anderen wissen zu Glauben."

Benutzeravatar
debdog
Beiträge: 652
Registriert: 11.02.2007 10:53:12
Wohnort: Do,womrkoihochdeitschko

Re: Befehl beim runterfahren ausführen

Beitrag von debdog » 21.09.2010 02:34:37

So, hab das Ganze jetzt mal selbst versucht.
clue hat geschrieben:Oder muss ich wirklich das /etc/init.d/skeleton template als Vorlage verwenden?
Nein, das ist nur eine Vorlage. Das Script muß nur mit der Debian Policy, Punkt 10.4, konform sein.

Mein Script sieht wie folgt aus:

Code: Alles auswählen

#! /bin/sh
echo "Ich bin ein init-Script :-P"
touch /home/testscript
read
exit 0

Einen Link darauf angelegt: /etc/rc.6/S19test

Jetzt bekomm' ich bei einem reboot die Meldung, muß Return drücken und die Datei wird angelegt. Daraus folgt, daß ich keine Ahnung habe was bei Dir schief laufen könnte.

hth
Oben gemachte Angaben, Falls nicht anderweitig Erwähnt, beziehen sich auf Debian Stable (Squeeze) amd64.
"Die Einen glauben zu Wissen, die Anderen wissen zu Glauben."

cosmac
Beiträge: 4551
Registriert: 28.03.2005 22:24:30

Re: Befehl beim runterfahren ausführen

Beitrag von cosmac » 21.09.2010 11:38:42

hi,

evt. liegt es am Runlevel 1 und bei reboot und halt würde es funktionieren? Der Runlevel 1 ist etwas seltsam:
'man init' hat geschrieben: On a Debian system, entering runlevel 1 causes all processes to be
killed except for kernel threads and the script that does the killing
and other processes in its session. As a consequence of this, it isn't
safe to return from runlevel 1 to a multi-user runlevel: daemons that
were started in runlevel S and are needed for normal operation are no
longer running. The system should be rebooted.
debdog hat geschrieben:Sind die die mit K beginnen nicht die die nicht ausgeführt werden?
nein, die mit K werden zum Stoppen benutzt, in rc6.d und rc0.d sind S* und K* sogar gleichwertig (es wird ja nichts mehr gestartet).
clue hat geschrieben:Kann es sein, dass Squeeze das Verfahren irgendwie geändert hat? Oder muss ich wirklich das /etc/init.d/skeleton template als Vorlage verwenden?
jein, die Links in /etc/rcx.d haben noch die gleiche Funktion, daran sollte es also nicht scheitern. Aber die Nummerierung, also die Reihenfolge, wird bei Paket-Installationen und -Updates anhand der "INIT INFO"-Header im Script neu ermittelt. Ein Script ohne diesen Header könnte diesen Mechanismus stören. Das ist vorläufig aber auch nicht das Problem.

Noch eine seltsame Idee: hast du das Script ausführbar gemacht? Wenn nicht, geht es auf der Kommandozeile mit ". tcunmount.sh" oder "sh tcunmount.sh" trotzdem, aber beim reboot nicht.
Beware of programmers who carry screwdrivers.

clue
Beiträge: 930
Registriert: 08.07.2007 17:36:57

Re: Befehl beim runterfahren ausführen

Beitrag von clue » 21.09.2010 17:41:27

cosmac hat geschrieben:hi,

evt. liegt es am Runlevel 1 und bei reboot und halt würde es funktionieren?

Noch eine seltsame Idee: hast du das Script ausführbar gemacht? Wenn nicht, geht es auf der Kommandozeile mit ". tcunmount.sh" oder "sh tcunmount.sh" trotzdem, aber beim reboot nicht.
Danke Euch BEIDEN, dass Ihr mir zu helfen versucht.

@cosmac
Also zu 1: Habs auch mal nach rc6.d verlinkt, Neustart gemacht -> weiterhin ohne Erfolg.
Zu 2: chmod 0755 /etc/init.d/tcunmount.sh oder auch ein chmod a+x auf die Datei -> weiterhin erfolglos.

@debdog
Also so langsam wird die Sache echt spannend:
Ich habe jetzt Dein Skript per copy & paste in /etc/init.d/test rein, dann ein chmod 0755 drauf, dann per ln -s /etc/init.d/test /etc/rc6.d/S19test verlinkt. Neustart gemacht: Pustekuchen!

Wonach sollte ich in der syslog suchen? Könntest Du mir vielleicht Schritt für Schritt sagen, was genau Du gemacht hast, damit Dein Skript läuft? Vielleicht habe ich ja irgendeine Kleinigkeit übersehen, die jetzt den ganzen Ärger macht.
Man! Ist das frustrierend :x
Offenbarung 13 erfüllt sich gerade vor unseren Augen, genießen wir also die letzten Jahre unserer Scheinfreiheit

Benutzeravatar
Six
Beiträge: 8045
Registriert: 21.12.2001 13:39:28
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Siegburg

Re: Befehl beim runterfahren ausführen

Beitrag von Six » 21.09.2010 17:54:07

Benutze bitte mal update-rc.d dafür.

Code: Alles auswählen

update-rc.d {scriptname} stop 02 0 6 .
Der Punkt am Ende ist wichtig.
Be seeing you!

clue
Beiträge: 930
Registriert: 08.07.2007 17:36:57

Re: Befehl beim runterfahren ausführen

Beitrag von clue » 21.09.2010 20:43:18

Six hat geschrieben:Benutze bitte mal update-rc.d dafür.

Code: Alles auswählen

update-rc.d {scriptname} stop 02 0 6 .
Der Punkt am Ende ist wichtig.

Code: Alles auswählen

update-rc.d test stop 1 .
update-rc.d: using dependency based boot sequencing
insserv: warning: script 'K02tcunmount' missing LSB tags and overrides
insserv: warning: script 'S19test' missing LSB tags and overrides
insserv: warning: script 'test' missing LSB tags and overrides
insserv: warning: current start runlevel(s) (1 6) of script `test' overwrites defaults (2 3 4 5).
insserv: warning: current stop runlevel(s) (empty) of script `test' overwrites defaults (0 1 6).
insserv: warning: script 'tcunmount.sh' missing LSB tags and overrides
Ist das so richtig? Scheint jedenfalls, als ob es etwas mit den LSB tags zu tun hat.

EDIT:
Jubel, Trubel, Heiterkeit: Es klappt jetzt jedenfalls.

Zwar steht die Verknüpfung zum Skript jetzt in allen runlevel Ordnern, aber dafür klappts. Ich habe ein

Code: Alles auswählen

update-rc.d tcunmount stop 0 1 6 .
ausgeführt und nun läufts. Aber warum erst jetzt? War der Punkt so wichtig? Und warum hat es denn nicht funktioniert, als ich das Skript manuell verlinkt habe? Wo liegt denn jetzt der Unterschied?

Jedenfalls vielen Dank an Dich, Six, aber natürlich auch an Euch alle :hail:

EDIT2:
Ich habe mir nun auch ein Skript fürs mounten in die init.d gesetzt. Dämlicherweise werden beide Skripte in allen runleveln ausgeführt, was letztlich zu einem nicht gemounteten Container beim Hochfahren und einem gemounteten Container beim Herunterfahren führt. Darum habe ich manuell die unerwünschten Verknüpfungen in den einzelnen runlevel Verzeichnissen gelöscht. Also in rc2.d befindet sich nur noch die Verknüpfung zum mount-Skript, in 0, 1 und 6 nur die Verknüpfungen zum unmount-Skript. In den anderen runleveln habe ich einfach die beiden Verknüpfungen zu den Skripten komplett gelöscht. Nun funktioniert es einwandfrei.

EDIT3:
Ok, noch was: Ich musste die Nummer der Skripte teilweise ändern, damit beim Runterfahren erst KDM beendet wird und dann erst der Container ausgehängt wird. Das sah dann z.B. in rc0.d so aus: Mein Skript war K01tcunmount, lag aber leider NACH K01kdm. Wenn das System nun runterfährt, kann der Container nicht ausgehängt werden, weil noch KDM drauf zugreift. Um das zu ändern habe ich dann einfach die Verknüpfung zum Skript von K01tcunmount zu K02tcunmount umbenannt. Das habe ich dann auch in den entsprechenden anderen Runleveln getan. Nun läufts - vorerst. Denn beim nächsten Update der Startskripte durch irgendein Paket darf ich wieder von vorne anfangen. Ich schau mal nach, wie ich das mit dem LSB-Header in den Skripten hinkriegen kann.
Offenbarung 13 erfüllt sich gerade vor unseren Augen, genießen wir also die letzten Jahre unserer Scheinfreiheit

clue
Beiträge: 930
Registriert: 08.07.2007 17:36:57

Re: [gelöst]Befehl beim runterfahren ausführen

Beitrag von clue » 21.09.2010 23:13:45

Ok, nach stundenlangem rumgebastel habe ich es jetzt wohl endgültig:

1. Das Mountskript /etc/init.d/tc_mount anlegen & chmod 0755 machen.
Inhalt:

Code: Alles auswählen

#! /bin/sh
### BEGIN INIT INFO
# Provides:          truecrypt_mount
# Required-Start:    $remote_fs $syslog
# Required-Stop:     $remote_fs $syslog
# Default-Start:     2
# Default-Stop:      
# Short-Description: truecrypt_Mount
# Description:       This file should be used to construct scripts to be
#                    placed in /etc/init.d.
### END INIT INFO

echo "mounte Truecrypt container"
truecrypt --keyfiles="" --password=meinpasswort --protect-hidden=no /pfad/zum/homecontainer /home/
exit 0
2.

Code: Alles auswählen

update-rc.d tc_mount start 02 2 .
3. Das UNmountskript /etc/init.d/tc_un_mount anlegen & chmod 0755 machen.
Inhalt:

Code: Alles auswählen

#! /bin/sh
### BEGIN INIT INFO
# Provides:          truecrypt_UNmount
# Required-Start:    $remote_fs $syslog
# Required-Stop:     $remote_fs $syslog
# Default-Start:     
# Default-Stop:      0 1 6
# Short-Description: truecrypt_UNmount
# Description:       This file should be used to construct scripts to be
#                    placed in /etc/init.d.
### END INIT INFO

echo "UNmounte Truecrypt container"
truecrypt -d
exit 0
4.

Code: Alles auswählen

update-rc.d tc_un_mount stop 02 0 1 6 .
Fertig!

Anmerkungen:

1. Die auskommentierten Zeilen sind in Wirklichkeit nicht auskommentiert, sondern haben volle Gültigkeit. Sie stellen den LSB-header dar. Durch sie behalten die Skripte ihre Reihenfolge, auch wenn irgendein Paket die init.d updated.
2. Bei den beiden verschiedenen Skripten (in meinem Fall das fürs mounten und das fürs unmounten) dürfen in den Zeilen # Provides: und # Short-Description: NICHT das selbe stehen - innerhalb des selben Skriptes kann bei beiden das selbe stehen (wie man an meinem Beispiel Skripten auch sehen kann). Sonst wird der LSB-header zurückgewiesen und es klappt nicht.
3. update-rc.d tc_un_mount stop 0 1 6 klappt auch ohne die Prioritätszahl (bei mir wars 02 hinter start/stop) und auch ohne Punkt.
4. Beim Ausführen von update-rc.d mögen Warnungen erscheinen, dass die Runleveleinstellungen nicht den defaults entsprechen. Wenn man aber mal die rcX.d Verzeichnisse abklappert, dann sollten sich eigentlich alle Skripte an ihrem richten Platz befinden.
Offenbarung 13 erfüllt sich gerade vor unseren Augen, genießen wir also die letzten Jahre unserer Scheinfreiheit

Antworten