Jessie: lokales "Shutdown" script einbauen
Hallo Liste, wie es scheint stelle ich mir gerade mal selber wieder ein Bein. - Ich sehe nur nicht warum. Was ich will: Analog zu /etc/rc.local will ich ein shut-down-script /etc/rc.local.stop anstubsen, wenn meine Box runter fährt. Dazu habe ich versucht meine /etc/init.d/rc-local so zu modifizieren: #! /bin/sh ### BEGIN INIT INFO # Provides: rc.local # Required-Start: $all # Required-Stop: # Default-Start: 2 3 4 5 # Default-Stop: 0 6 # Short-Description: Run /etc/rc.local OR /etc/rc.local.stop if it exist ### END INIT INFO PATH=/sbin:/usr/sbin:/bin:/usr/bin . /lib/init/vars.sh . /lib/lsb/init-functions do_start() { if [ -x /etc/rc.local ]; then [ "$VERBOSE" != no ] && log_begin_msg "Running local boot scripts (/etc/rc.local)" /etc/rc.local ES=$? [ "$VERBOSE" != no ] && log_end_msg $ES return $ES fi } do_stop() { if [ -x /etc/rc.local.stop ]; then [ "$VERBOSE" != no ] && log_begin_msg "Running local shutdown scripts (/etc/rc.local.stop)" /etc/rc.local.stop ES=$? [ "$VERBOSE" != no ] && log_end_msg $ES return $ES fi } case "$1" in start) do_start ;; stop) do_stop ;; restart|reload|force-reload) echo "Error: argument '$1' not supported" >&2 exit 3 ;; status) # No-op exit 0 ;; *) echo "Usage: $0 start|stop" >&2 exit 3 ;; esac Allerdings scheint der Aufruf "/etc/init.d/rc.local stop" nicht das zu tun, was er soll: # init.d/rc.local stop [ ok ] Stopping rc.local (via systemctl): rc.local.service. ... das sieht zwar gut aus, aber es passiert nichts weiter. Ich muss da oben im Script irgendwas vergurkt haben, sehe es bloß grad nicht. Hinweise die zur Ergreifung des Täters beitragen werden mit großer Dankbarkeit gewürdigt ... ;-). Gruß Stefan. -- Stefan U. Hegner <stefan@hegner-online.de> * * * D-32584 Löhne --- good ole Germany internet: http://www.hegner-web.de * * * GPG-Key | 048D 7F64 0BEB 73B1 2725 F-Print | C05E 4F77 9674 EF11 55FE
Hallo, On 27.01.2016 19:27, Stefan U. Hegner wrote: [...]
Was ich will: Analog zu /etc/rc.local will ich ein shut-down-script /etc/rc.local.stop anstubsen, wenn meine Box runter fährt. Dazu habe ich versucht meine /etc/init.d/rc-local so zu modifizieren:
rc-local bzw. systemv-style init scripte sind sowas von 2000er, wer würde das noch wollen, systemd is the new kid on the block. ;) [...]
Allerdings scheint der Aufruf "/etc/init.d/rc.local stop" nicht das zu tun, was er soll:
# init.d/rc.local stop [ ok ] Stopping rc.local (via systemctl): rc.local.service.
... das sieht zwar gut aus, aber es passiert nichts weiter. Ich muss da oben im Script irgendwas vergurkt haben, sehe es bloß grad nicht.
Zumindest ist da ja schon ein Hinweis das systemctl tätig wird. Zuerst solltest Du vlt. herausfinden welches init-system du verwendest, (pid=1 ist sysv-init, systemd oder upstart?), dazu wäre auch die verwendete Distri interessant. Sollte da systemd werkeln würde ich den Vorschlag machen wollen eine systemd-unit anzulegen.
Hinweise die zur Ergreifung des Täters beitragen werden mit großer Dankbarkeit gewürdigt ... ;-).
Ich würde gerne erstmal den Tatort analysieren bevor wir uns dem Täter widmen. ;) [...] hth, viel Spaß, Peter -- Peter Niederlag * Ehlentruper Weg 70 * 33604 Bielefeld * Fon (mobil): 0172 / 516 48 55 * http://www.datenbetrieb.de * Lösungen für digitale Zeiten *
Hallo Peter, danke für Deine Rückmeldung. Am 27.01.2016 um 21:58 schrieb Peter Niederlag:
rc-local bzw. systemv-style init scripte sind sowas von 2000er, wer würde das noch wollen, systemd is the new kid on the block. ;) [...]
Schön und gut. Ich habe bislang halt mit SYS-V Initscripten gewerkelt und da ich im Wesentlichen User bin, sind das einfach Dinge, wo ich mit der Entwicklung nicht mehr so mitkomme. ... Sorry.
Allerdings scheint der Aufruf "/etc/init.d/rc.local stop" nicht das zu tun, was er soll:
# init.d/rc.local stop [ ok ] Stopping rc.local (via systemctl): rc.local.service.
... das sieht zwar gut aus, aber es passiert nichts weiter. Ich muss da oben im Script irgendwas vergurkt haben, sehe es bloß grad nicht. Zumindest ist da ja schon ein Hinweis das systemctl tätig wird.
Zuerst solltest Du vlt. herausfinden welches init-system du verwendest, (pid=1 ist sysv-init, systemd oder upstart?), dazu wäre auch die verwendete Distri interessant. Ich habe ein Debian Jessie (siehe Betreff) und da schuftet ein systemd. Sollte da systemd werkeln würde ich den Vorschlag machen wollen eine systemd-unit anzulegen. OK. Was ist das und wie geht das? (Vor allem wie geht das EINFACH?) Ich würde gerne erstmal den Tatort analysieren bevor wir uns dem Täter widmen. ;)
Ich denke, damit haben wir den Fundort der Leiche mit Klebeband markiert und die Fingerabdrücke aufgenommen, oder? LG und Danke. Stefan. -- Stefan U. Hegner <stefan@hegner-online.de> * * * D-32584 Löhne --- good ole Germany internet: http://www.hegner-web.de * * * GPG-Key | 048D 7F64 0BEB 73B1 2725 F-Print | C05E 4F77 9674 EF11 55FE
Am Donnerstag, 28. Januar 2016, 20:54:13 schrieb Stefan U. Hegner:
Sollte da systemd werkeln würde ich den Vorschlag machen wollen eine systemd-unit anzulegen. OK. Was ist das und wie geht das? (Vor allem wie geht das EINFACH?)
Hallo Stefan, sieh dir mal diesen Link an, vielleicht kannst du damit was anfangen: http://debianforum.de/forum/viewtopic.php?f=27&t=155675&hilit=shutdown+skrip... Ich kenne mich mit systemd auch nicht aus, aber damit hat es bei mir funktioniert. Viele Grüße Rolf
On Thu, Jan 28, 2016 at 08:54:13PM +0100, Stefan U. Hegner wrote:
Sollte da systemd werkeln würde ich den Vorschlag machen wollen eine systemd-unit anzulegen. OK. Was ist das und wie geht das? (Vor allem wie geht das EINFACH?)
Hi, das ist ziemlich simpel. Ich hatte das mal fuer die daemontools gemacht. Vielleicht hilft Dir das: http://www.tuxad.de/blog/archives/2011/12/31/djb_daemontools_with_upstart_or... Frank
Hallo Frank, hallo Rolf, hallo Jörg, ... vielen Dank für Eure Antworten. Am 28.01.2016 um 21:40 schrieb Frank Bergmann:
On Thu, Jan 28, 2016 at 08:54:13PM +0100, Stefan U. Hegner wrote:
Sollte da systemd werkeln würde ich den Vorschlag machen wollen eine systemd-unit anzulegen. OK. Was ist das und wie geht das? (Vor allem wie geht das EINFACH?) Hi, das ist ziemlich simpel. Ich hatte das mal fuer die daemontools gemacht. Vielleicht hilft Dir das: http://www.tuxad.de/blog/archives/2011/12/31/djb_daemontools_with_upstart_or... Frank [1]
Am 28.01.2016 um 21:24 schrieb Rolf Lucius:
sieh dir mal diesen Link an, vielleicht kannst du damit was anfangen: http://debianforum.de/forum/viewtopic.php?f=27&t=155675&hilit=shutdown+skrip... [2] Bevor ich das jetzt anfange an meiner Kiste wild rumzufrickeln folgende Fragen:
1. Die eigentlichen systemd scripte liegen unter /lib/systemd/system und in /etc/systemd/system liegen nur Symlinks darauf, richtig? 2. Wie bekomme ich das Script dazu, dass es beim boot (ExecStart) und beim halt (ExecStop) möglichst spät ausgeführt wird? Sprich was ist da der sinnvollste Inhalt für "After=" 3. Aber es gibt unter /etc/systemd/system auch Unterverzeichnisse mit Namen *.target.wants. Sind das irgendwelche Abhängigkeiten? - Konkret, wo packe ich den Symlink für das Script am sinnvollsten hin? Wie ist der "WantedBy=" Eintrag unter [Install] im Script zu verstehen? - In der revidierten Fassung von [2] etwas weiter unten im Forum sieht das so aus: |[Unit] Description=Partbackup After=basic.target [Service] Type=oneshot RemainAfterExit=true ExecStart=/bin/true ExecStop=/root/00/system/partback/test [Install] WantedBy=multi-user.target| ... daher würde ich im Moment dazu tendieren den Symlink in /etc/systemd/system/multi-user.target.wants anzulegen. - Ist das dann so, wie systemd es eigentlich meint? Vielen Dank Euch! Stefan. -- Stefan U. Hegner <stefan@hegner-online.de> * * * D-32584 Löhne --- good ole Germany internet: http://www.hegner-web.de * * * GPG-Key | 048D 7F64 0BEB 73B1 2725 F-Print | C05E 4F77 9674 EF11 55FE
Auf jessie mit systemd werden die init.d/-Scripte von Hand evtl. gar nicht ausgeführt. Das wird bereits in ". /lib/lsb/init-functions" abgefangen. Versuch mal _SYSTEMCTL_SKIP_REDIRECT zu setzen. Siehe: /lib/lsb/init-functions.d/40-systemd -- Schulz Gebäudeservice GmbH & Co. KG Dr.-Max-Ilgner-Straße 17 32339 Espelkamp Persönlich haftende Gesellschafterin: Gebäudereinigung Joachim Schulz Verwaltungsgesellschaft mbH Telefon: +49 5772 9100 0 Telefax: +49 5772 9100 11 Email: zentrale@sgbs.de Internet: www.sgbs.de Geschäftsführer: Joachim und Dirk Schulz, Norbert Kosica Handelsregister Bad Oeynhausen: HRA 5902, HRB 8591 UST-Id-Nr.: DE 125752702
Hallo Jörg, danke für Deine Rückmeldung. Am 28.01.2016 um 15:09 schrieb Jörg Schulz:
Auf jessie mit systemd werden die init.d/-Scripte von Hand evtl. gar nicht ausgeführt. ... dafür spricht ja meine Erfahrung. Wobei die /etc/rc.local ja beim Boot läuft. Das wird bereits in ". /lib/lsb/init-functions" abgefangen. Versuch mal _SYSTEMCTL_SKIP_REDIRECT zu setzen. Siehe: /lib/lsb/init-functions.d/40-systemd Hmmm, damit tue ich mich gerade etwas schwer zu verstehen, was Du mir sagen willst. Du spielst vermutlich auf diesen Code-Schnippsel an:
# Redirect SysV init scripts when executed by the user if [ $PPID -ne 1 ] && [ -z "${init:-}" ] && [ -z "${_SYSTEMCTL_SKIP_REDIRECT:-}" ]; then case $(readlink -f "$0") in /etc/init.d/*) _use_systemctl=1 # Some services can't reload through the .service file, # but can through the init script. prog=${0##*/} service="${prog%.sh}.service" if [ "$(systemctl -p CanReload show $service 2>/dev/null)" = "CanReload=no" ] && [ "${1:-}" = "reload" ]; then _use_systemctl=0 fi ;; esac else export _SYSTEMCTL_SKIP_REDIRECT="true" fi ... bloß erwischt Du mich da jenseits meiner Fähigkeiten zu verstehen, was das genau macht, bzw. wo ich am sinnigsten Die Variable _SYSTEMCTL_SKIP_REDIRECT setze, wenn das ist, was ich will. Sorry, bin zwar hoffentlich nicht der "DAU", aber das übersteigt meine Fähigkeiten. LG Stefan. -- Stefan U. Hegner <stefan@hegner-online.de> * * * D-32584 Löhne --- good ole Germany internet: http://www.hegner-web.de * * * GPG-Key | 048D 7F64 0BEB 73B1 2725 F-Print | C05E 4F77 9674 EF11 55FE
Am 28. Januar 2016 um 20:52 schrieb Stefan U. Hegner <stefan@hegner-online.de>:
Am 28.01.2016 um 15:09 schrieb Jörg Schulz:
Auf jessie mit systemd werden die init.d/-Scripte von Hand evtl. gar nicht ausgeführt. ... dafür spricht ja meine Erfahrung. Wobei die /etc/rc.local ja beim Boot läuft.
Das "evtl." war wohl etwas missverständlich. Grundsätzlich gilt für eine Jessie Standardinstallation (mit systemd): wenn Du von Hand ein init.d-Script aufrufst, dann werden die start-/stop- Abschnitte in dem Script gar nicht ausgeführt, sondern ab ". /lib/lsb/initfunctions" auf systemd umgeleitet (systemctl start|stop|reload|... <service>). Was dann passieren soll musst/kannst Du in den systemd-Unit-Files konfigurieren.
Das wird bereits in ". /lib/lsb/init-functions" abgefangen. Versuch mal _SYSTEMCTL_SKIP_REDIRECT zu setzen. Siehe: /lib/lsb/init-functions.d/40-systemd Hmmm, damit tue ich mich gerade etwas schwer zu verstehen, was Du mir sagen willst. Du spielst vermutlich auf diesen Code-Schnippsel an:
# Redirect SysV init scripts when executed by the user if [ $PPID -ne 1 ] && [ -z "${init:-}" ] && [ -z "${_SYSTEMCTL_SKIP_REDIRECT:-}" ]; then case $(readlink -f "$0") in /etc/init.d/*) _use_systemctl=1 # Some services can't reload through the .service file, # but can through the init script. prog=${0##*/} service="${prog%.sh}.service" if [ "$(systemctl -p CanReload show $service 2>/dev/null)" = "CanReload=no" ] && [ "${1:-}" = "reload" ]; then _use_systemctl=0 fi ;; esac else export _SYSTEMCTL_SKIP_REDIRECT="true" fi
... bloß erwischt Du mich da jenseits meiner Fähigkeiten zu verstehen, was das genau macht, bzw. wo ich am sinnigsten Die Variable _SYSTEMCTL_SKIP_REDIRECT setze, wenn das ist, was ich will. Stefan.
Ja, das Schnipsel meine ich. :-) Setz mal in init.d/rc.local VOR das ". /lib/lsb/init-functions" z.B. ein "_SYSTEMCTL_SKIP_REDIRECT=no". Wenn Du jetzt von Hand "/etc/init.d/rc.local start" ausführst dann werden die start-/stop-Abschnitte wieder ausgeführt. Nur: das hilft Dir leider bei deinem ursprünglichen Problem nicht weiter. Wenn Du den Rechner herunterfährst gibst Du ja nicht von Hand "/etc/init.d/rc.local stop" ein und systemd macht das auch nicht. Die entsprechende Unit-Datei um den systemd dazu zu bringen ist /lib/systemd/system/rc-local.service. (rc.local.service ist ein symlink) Dort erkennt man, dass es auch nur ein ExecStart gibt. Was Du also brauchst ist ein "ExecStop" Und das gibt es auch :-) Du solltest aber besser nicht das Original /lib/systemd/system/rc-local.service verändern, sondern ein /etc/systemd/system/rc-local.service anlegen. Dieses überschreibt dann das Original kompett. Wenn Du nur was ändern möchtest (Du willst ja nur ein ExecStop hinzufügen) dann legst Du das Verzeichnis /etc/systemd/system/rc-local.service.d/ an und legst dort z.B. eine "my-rc-local-stop.conf" an mit: ----------------------- [Service] ExecStop=/etc/rc.local stop ----------------------- So bleibst das Original unangetastet und hast deine lokalen Änderungen unter /etc. Hab ich eben selbst getestet und funktioniert gut. Das _SYSTEMCTL_SKIP_REDIRECT brauchst Du dann natürlich nicht mehr :-) Grüße Jörg -- Schulz Gebäudeservice GmbH & Co. KG Dr.-Max-Ilgner-Straße 17 32339 Espelkamp Persönlich haftende Gesellschafterin: Gebäudereinigung Joachim Schulz Verwaltungsgesellschaft mbH Telefon: +49 5772 9100 0 Telefax: +49 5772 9100 11 Email: zentrale@sgbs.de Internet: www.sgbs.de Geschäftsführer: Joachim und Dirk Schulz, Norbert Kosica Handelsregister Bad Oeynhausen: HRA 5902, HRB 8591 UST-Id-Nr.: DE 125752702
Noch was: wenn Du die Unit-Files änderst musst Du das dem systemd mittels # systemctl daemon-reload mitteilen. -- Schulz Gebäudeservice GmbH & Co. KG Dr.-Max-Ilgner-Straße 17 32339 Espelkamp Persönlich haftende Gesellschafterin: Gebäudereinigung Joachim Schulz Verwaltungsgesellschaft mbH Telefon: +49 5772 9100 0 Telefax: +49 5772 9100 11 Email: zentrale@sgbs.de Internet: www.sgbs.de Geschäftsführer: Joachim und Dirk Schulz, Norbert Kosica Handelsregister Bad Oeynhausen: HRA 5902, HRB 8591 UST-Id-Nr.: DE 125752702
Am 29. Januar 2016 um 10:56 schrieb Jörg Schulz <jschulz@sgbs.de>:
Am 28. Januar 2016 um 20:52 schrieb Stefan U. Hegner <stefan@hegner-online.de>:
Am 28.01.2016 um 15:09 schrieb Jörg Schulz:
Auf jessie mit systemd werden die init.d/-Scripte von Hand evtl. gar nicht ausgeführt. ... dafür spricht ja meine Erfahrung. Wobei die /etc/rc.local ja beim Boot läuft.
... Grundsätzlich gilt für eine Jessie Standardinstallation (mit systemd): wenn Du von Hand ein init.d-Script aufrufst, dann werden die start-/stop- Abschnitte in dem Script gar nicht ausgeführt, sondern ab ". /lib/lsb/initfunctions" auf systemd umgeleitet (systemctl start|stop|reload|... <service>). Was dann passieren soll musst/kannst Du in den systemd-Unit-Files konfigurieren.
Ich war etwas verwirrt, als ich feststellte, das das nicht für alle Services zu stimmen scheint, z.B. apache2. Auch konnte ich für ihn erst kein Unit-File (apache2.service) finden. Dann stolperte ich aber über die systemd-generators. (siehe: http://www.freedesktop.org/software/systemd/man/systemd.generator.html) Diese erzeugen zur Laufzeit Unit-Files u.a. auch für apache2 (/run/systemd/generator.late/apache2.service) und aus diesen wird dann das init.d-Script wie gewohnt gestartet. Von dort gestartet kommt es über das ". /lib/lsb/init-functions" hinaus und läuft wie gewohnt durch. -- Schulz Gebäudeservice GmbH & Co. KG Dr.-Max-Ilgner-Straße 17 32339 Espelkamp Persönlich haftende Gesellschafterin: Gebäudereinigung Joachim Schulz Verwaltungsgesellschaft mbH Telefon: +49 5772 9100 0 Telefax: +49 5772 9100 11 Email: zentrale@sgbs.de Internet: www.sgbs.de Geschäftsführer: Joachim und Dirk Schulz, Norbert Kosica Handelsregister Bad Oeynhausen: HRA 5902, HRB 8591 UST-Id-Nr.: DE 125752702
Teilnehmer (5)
-
Frank Bergmann
-
Jörg Schulz
-
Peter Niederlag
-
Rolf Lucius
-
Stefan U. Hegner