[gelöst]Befehl beim runterfahren ausführen
[gelöst]Befehl beim runterfahren ausführen
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.
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
- Six
- Beiträge: 8066
- Registriert: 21.12.2001 13:39:28
- Lizenz eigener Beiträge: MIT Lizenz
- Wohnort: Siegburg
Re: Befehl beim runterfahren ausführen
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!
Re: Befehl beim runterfahren ausführen
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:
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?
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
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
Re: Befehl beim runterfahren ausführen
Sind die die mit K beginnen nicht die die nicht ausgeführt werden? Mach da mal testweise ein S draus.clue hat geschrieben:Die habe ich dann auch brav per ln -s /etc/init.d/tcunmount.sh /etc/rc1.d/K02tcunmount verlinkt.
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."
"Die Einen glauben zu Wissen, die Anderen wissen zu Glauben."
Re: Befehl beim runterfahren ausführen
![traurig :(](./images/smilies/icon_sad.gif)
Offenbarung 13 erfüllt sich gerade vor unseren Augen, genießen wir also die letzten Jahre unserer Scheinfreiheit
Re: Befehl beim runterfahren ausführen
Schade. ![Wink ;-)](./images/smilies/icon_wink.gif)
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?
![Wink ;-)](./images/smilies/icon_wink.gif)
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."
"Die Einen glauben zu Wissen, die Anderen wissen zu Glauben."
Re: Befehl beim runterfahren ausführen
So, hab das Ganze jetzt mal selbst versucht.
Mein Script sieht wie folgt aus:
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
Nein, das ist nur eine Vorlage. Das Script muß nur mit der Debian Policy, Punkt 10.4, konform sein.clue hat geschrieben:Oder muss ich wirklich das /etc/init.d/skeleton template als Vorlage verwenden?
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
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."
"Die Einen glauben zu Wissen, die Anderen wissen zu Glauben."
Re: Befehl beim runterfahren ausführen
hi,
evt. liegt es am Runlevel 1 und bei reboot und halt würde es funktionieren? Der Runlevel 1 ist etwas seltsam:
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.
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.
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).debdog hat geschrieben:Sind die die mit K beginnen nicht die die nicht ausgeführt werden?
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.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?
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.
Re: Befehl beim runterfahren ausführen
Danke Euch BEIDEN, dass Ihr mir zu helfen versucht.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.
@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
![Mad :x](./images/smilies/icon_mad.gif)
Offenbarung 13 erfüllt sich gerade vor unseren Augen, genießen wir also die letzten Jahre unserer Scheinfreiheit
- Six
- Beiträge: 8066
- Registriert: 21.12.2001 13:39:28
- Lizenz eigener Beiträge: MIT Lizenz
- Wohnort: Siegburg
Re: Befehl beim runterfahren ausführen
Benutze bitte mal update-rc.d dafür.
Der Punkt am Ende ist wichtig.
Code: Alles auswählen
update-rc.d {scriptname} stop 02 0 6 .
Be seeing you!
Re: Befehl beim runterfahren ausführen
Six hat geschrieben:Benutze bitte mal update-rc.d dafür.
Der Punkt am Ende ist wichtig.Code: Alles auswählen
update-rc.d {scriptname} stop 02 0 6 .
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
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 .
Jedenfalls vielen Dank an Dich, Six, aber natürlich auch an Euch alle
![Hail :hail:](./images/smilies/icon_hail.gif)
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
Re: [gelöst]Befehl beim runterfahren ausführen
Ok, nach stundenlangem rumgebastel habe ich es jetzt wohl endgültig:
1. Das Mountskript /etc/init.d/tc_mount anlegen & chmod 0755 machen.
Inhalt:
2.
3. Das UNmountskript /etc/init.d/tc_un_mount anlegen & chmod 0755 machen.
Inhalt:
4.
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.
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
Code: Alles auswählen
update-rc.d tc_mount start 02 2 .
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
Code: Alles auswählen
update-rc.d tc_un_mount stop 02 0 1 6 .
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