syncmaster-eu
Anmeldungsdatum: 20. Mai 2019
Beiträge: Zähle...
|
Hallo Forum, ich hoffe ihr könnt mir helfen, ich verzweifle hier noch... Ich möchte ein Script beim Start/Reboot/Shutdown laufen lassen. Dieses Script soll ein paar Dienste stoppen etc.. Zum testen hab ich einstweilen nur ein Echo in eine Datei stehen.
Dazu habe ich folgendes getan: Eine Datei /etc/rc.startup angelegt, mit Inhalt:
| #!/bin/sh
#
# rc.startup
#
#
# just for test
echo "last startup:" > /var/log/rc.startup.info
echo `date` >> /var/log/rc.startup.info
sleep 5
exit 0
|
Eine Datei /etc/rc.shutdown angelegt mit Inhalt:
| #!/bin/sh
#
# rc.shutdown
#
#
# just for test
echo "last shutdown or reboot:" > /var/log/rc.shutdown.info
echo `date` >> /var/log/rc.shutdown.info
sleep 10
exit 0
|
Eine Unit Datei rc.shutdown.service angelegt unter /etc/systemd/system mit Inhalt:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 | [Unit]
Description=Shutdown_Reboot Script
DefaultDependencies=no
Before=shutdown.target reboot.target halt.target
[Service]
Type=oneshot
ExecStart=/bin/bash /etc/rc.startup
ExecStop=/bin/bash /etc/rc.shutdown
RemainAfterExit=yes
StandardOutput=syslog+console
StandardError=syslog+console
[Install]
WantedBy=shutdown.target reboot.target halt.target
|
Des weiteren:
Ich habe:
-nicht- das Schutdown Script nach /lib/systemd/system-shutdown kopiert, weil dort alles paralell ausgeführt wird und ich einen Dienst wollte. -nicht- /etc/init.d und/oder /etc/rc0.d usw verwendet, weil ich das ganze mit dem systemd machen wollte, weil das ja die Zukunft ist schon versucht WantedBy unter Install bzw. Before unter Unit modifiziert mit diversen Dingen die ich im Internet gefunden habe wie network-online.target local-fs.target, da ich der Meinung war ggf. klappt es nicht weil ein Dienst der gebraucht wird nicht läuft oder schon beendet ist habe auch versucht bei WantedBy multi-user.target zu verwenden.
Egal was ich versuche, wenn multi-user.target verwendet wird, dann wird zumindest der "ExecStart" ausgeführt. Aber der "ExecStop" wird nie ausgeführt. Egal welche Kombination ich auch versuche.
Habe auch schon in diesem und unzähligen anderen Foren nachgelesen, aber ich werde nicht schlauer.... Please Help ☺ Moderiert von Taomon: Sichtbar gemacht.
|
TomLu
Anmeldungsdatum: 23. August 2014
Beiträge: 603
|
Ich weiss gar nicht, wo ich da anfangen soll... da ist eigentlich alles falsch... ☺ ... deswegen mach ichs erst mal kurz. Diese Kombination ist unsinnig und funktioniert auch so nicht. Bei diesen gegebenen Unit-Direktiven würde rc.startup beim Shutdown gestartet werden, und das rc.shutdown vermutlich gar nicht... was natürlich beides Quatsch ist.
Before=shutdown.target reboot.target halt.target
[Service]
Type=oneshot
ExecStart=/bin/bash /etc/rc.startup
ExecStop=/bin/bash /etc/rc.shutdown Du musst das konzeptionell komplett neu bauen. Dabei solltest Du auch überprüfen, ob die Scripte rc.startup und rc.shutdown nicht vielleicht sogar völlig überflüssig sind. Wenn rc.startup irgendwelche Services startet und rc.shutdown diese Services wieder beendet, kann man diese Services vielleicht auch direkt von einer Service-Unit starten lassen. In Abhängigkeit vom Start-Zeitpunkt wäre damit geregelt, dass die Serives beim Shutdown auch wieder zum passenden Zeitpunkt automatisch beendet werden, ohne das man sich darum mit irgendwelchen Scripten drum kümmern muss. Bessere Hinweise sind hier leider nicht möglich, weil man weder Ziel, noch Rahmenbedingungen, noch vorhandenes, noch fehlendes kennt.....
|
syncmaster-eu
(Themenstarter)
Anmeldungsdatum: 20. Mai 2019
Beiträge: 4
|
Hallo TomLu, danke für die ehrliche Aussage ☺ Ich denke ich verstehe was du meinst. Du willst mir sagen, dass die "Zeit" wann etwas via systemd ausgeführt wird oder nicht in Kombination mit Before etc.. Einfluss darauf hat ob das "etwas" gestartet wird ExecStart oder beendet ExecStop. Denn genau das passiert mir, beim shutdown passiert nichts. wäre dann das hier richtig? | ExecStart=/bin/true
ExecStop=/bin/bash /etc.rc.shutdown
|
und das ganze ohne "WantedBy" - korrekt oder? Wg. Rahmenbedingungen etc... frag einfach was du wissen musst und ich sags dir. Also mein Ziel ist wirklich ein Service, das beim Herunterfahren/Reboot mein Shell-Script ausführt. Und ich hätte das am liebsten zu einem Zeitpunkt wo alles vom System noch "da" ist. Also wo das Netzwerk, das File-System etc. alles noch geladen ist. Ja, ich möchte damit ein paar Dinge beenden die sonst "abkrachen" würden und ggf. würde ich auch das ein/andere backuppen etc.. Warum mit Service → Weil ich's halt gerne so machen würde wenn das geht. Aber erst muss ich mal gebacken kriegen dass das Ding beim Herunterfahren/Reboot gestartet wird ☺ - das Shell script selbst macht mir keine Probleme.
Ich geb dir ein beispiel rc.startup startet mir ein programm und rc.shutdown beendet alles so wie es das programm will, und in der reihenfolge wie ich es brauche, und kopiert ggf. auch noch ein paar dateien. Bin mal gespannt auf deine Antwort ☺
|
TomLu
Anmeldungsdatum: 23. August 2014
Beiträge: 603
|
Solange nicht klar ist, was Du wirklich willst, ist es nicht möglich zu sagen, was richtig oder falsch ist. Worum geht es bei rc.startup und rc.shutdown überhaupt? Was haben die miteinander zu tun? Wenn rc.shutdown in gewisser Weise mit rc.startup korrenspondiert, weil sich beide um die gleichen Services kümmern, der eine bei Systemstart, der andere beim Shutdown.... dann ist Dein Lösungsansatz falsch. Die Handhabung eines Services wird mit einer Service-Unit gesteuert, damit kümmert sich systemd um start und beenden des Dienstes... bzw. fordert den Dienst beim Beenden zum terminate auf. Dafür braucht man kein extra Script. Wenn ein zusätzliches Shutdown-Script einen laufenden Service beenden soll, dann ist schon was beim Customizing des Job während des Starts falsch gelaufen. So'n Shutdown-Script macht eher Sinn, vor dem Shutdown noch mal eben schnell Daten (z.B. aus ner RAM-Disk) zu retten, aber nicht um Dienste zu beenden. Wie gesagt, solange Dein Ziel ein Geheimnis bleibt, kann man Dir nicht helfen. Welche Services werden mit rc.startup gestartet? Warum werden die Dienste via Script und nicht mit einer Service-Unit gestartet?
Was genau soll rc.shutdown tun? In welchem Zusammenhang (oder Verbindung) steht rc.shutdown mit rc.startup?
|
syncmaster-eu
(Themenstarter)
Anmeldungsdatum: 20. Mai 2019
Beiträge: 4
|
Schau TomLu, ich habe ein Programm, damit dieses läuft, muss es einen Prozess starten → rc.startup
Wenn der Computer herunterfährt, möchte ich dieses Programm beenden, dazu gibt es auch einen Befehl der ausgeführt werden muss → rc.shutdown.
Zudem möchte ich die Konfig Dateien des Programmes mit jedem Shutdown oder reboot -zusätzlich- beim shutdown oder reboot sichern → auch rc.shutdown. Aber TomLu, was im Script passiert, das ist momentan völlig nebensächlich. Der Sinn des Threat geht darum, um das was ich nämlich nicht hinbekomme. Nämlich, dass ich nicht weiß wie die Unit Konfig ausschauen muss damit - ein Script/egal was im Script steht, einfach ein Script - beim Start des Rechners gestartet wird, und beim Beenden des Rechners ein anderes Script gestartet wird wird. Wenn es zwei Units sein sollen dann okay.. verstehst?
|
noisefloor
Ehemaliger
Anmeldungsdatum: 6. Juni 2006
Beiträge: 29041
Wohnort: WW
|
Hallo,
ich habe ein Programm, damit dieses läuft, muss es einen Prozess starten → rc.startup
Nein. Du schreibst zwei Units: eine für den omniösen Prozess und eine für dein Programm. Die Unit für das Programm bekommt als Requires Direktive die Unit vom Prozess.
Wenn der Computer herunterfährt, möchte ich dieses Programm beenden, dazu gibt es auch einen Befehl der ausgeführt werden muss
Geht auch über die Unit. Wobei das System ja allen laufenden Prozessen ein Signal sendet, die werden in erster Instanz nicht hart abgeschossen. Auf dieses Signal sollte das Programm dann reagieren und sich beenden. Gruß, noisefloor
|
TomLu
Anmeldungsdatum: 23. August 2014
Beiträge: 603
|
syncmaster-eu schrieb: ich habe ein Programm, damit dieses läuft, muss es einen Prozess starten → rc.startup
Nein, falsch.... Du hast entweder ein Programm, was gestartet werden muss, was etwas tut und sich wieder beendet oder Du hast einen Process (resp. Daemon), der gestartet wird und dauerhaft etwas tut. Für beides (ums zu starten) braucht man kein Script, und schon mal gar nicht, um einen Prozess beim Shutdown wieder zu beenden - der Lösungsansatz ist also falsch. Das Script wäre möglicherweise sinnvoll, um ggf. einmalig (!) vorbereitend bestimmte Rahmenbedingungen für den Prozess zu schaffen oder zu prüfen, wie Verzeichnis anlegen, Rechte setzen, etwas kopieren, etc.... aber selbst das kann die gleiche Service-Unit erledigen, in dem der eigentliche Prozess gestartet wird. syncmaster-eu schrieb: ein Script/egal was im Script steht, einfach ein Script - beim Start des Rechners gestartet wird, und beim Beenden des Rechners ein anderes Script gestartet wird wird.
Solange nicht bekannt ist, was die Scripte explizit tun, behaupte ich, dass es überhaupt keiner Scripte bedarf, um etwas zu starten oder zu beenden. Das geht mit Service-Units, die passend im Start posititioniert gleichzeitig und automatisch auch passend im Shutdown positioniert sind. Noisefloor hats umrissen, wie es geht.... aber wenn Du meinst, was das Script tut wäre nebensächlich, dann kann auch jeder Hilfeversuch nur zu einem nebensächlichen Resultat führen. Dafür ist mir aber die Zeit zu schade. Also viel Glück bei dem Vorhaben.....
verstehst?
Ja.
|
syncmaster-eu
(Themenstarter)
Anmeldungsdatum: 20. Mai 2019
Beiträge: 4
|
bitte lasst mal alle das "programm" in ruhe ☺ das war nur ein Beispiel.
Es geht mir um die Ausführung eines Scripts am Sytemstart und um das Ausführen eines Scripts beim herunterfahren/reboot. Was das Script macht ist nebensächlich. Ich habe mehrere Dinge die ich im Script mache/will, das sprengt jedoch den Rahmen dieses Postings und hat auch nichts mit der Frage selbst zu tun. Ist vielleicht nett gemeint aber to much ^^
Es geht nur, wirklich nur, um Ausführung eines Scripts, eines beim Start, eines beim Herunterfahren/Reboot, auch nicht um einen direkt im Unit hinterlegten Befehl. Ja ich weiß dass man den direkt dort starten kann, aber nochmal, es geht um ein Script ☺ - - - Danke @noisefloor
Nachdem du dich hier wohl auskennst, hätte ich folgende fragen an dich: eine Unit machen für das Startscript und eine Unit machen für das Shutdown Script, richtig? Das Schutdown Script würde als Requires die Unit des Startscripts bekommen, richtig? Bei beiden Units wäre ExecStart und nicht ExecStop zu verwenden, richtig? Install Sektion mit WantedBy reboot.target shutdown.target halt.target stimmt hingegen, richtig? Unit Sektion wäre beim StartScript After reboot.target shutdown.target halt.target und beim Shutdownscript mit Before reboot.target shutdown.target und halt.target richtig?
|
TomLu
Anmeldungsdatum: 23. August 2014
Beiträge: 603
|
syncmaster-eu schrieb: Das Schutdown Script würde als Requires die Unit des Startscripts bekommen, richtig?
Falsch, damit schaffst Du unvorhersehbare Inkonsistenzen. Eine eigene explizite Shutdown-Unit sollte keinesfalls Abhängigkeiten zu einer Startup-Unit haben, weil es eine Eigenart des Shutdowns-Prozesses ist, Startup-Units durch den Systemmanager auch wieder zu beenden. Im ungünstigsten Fall würde Deine Shutdown-Unit wegen des Requires-Statements die zuvor beendete Startup-Unit also wieder erneut starten oder sie würde gar nicht arbeiten, weil systemd den Neustart von Units im Shutdown-Prozess ablehnt und somit die Requires-Abhängigkeit fehlschlägt. Sorry, sei mir nicht böse... aber es scheint so zu sein, dass Du zu den wenigen Leuten gehörst, denen man nicht wirklich helfen kann. Du hast Dir da was in den Kopf gesetzt und lehnst jeden Rat ab, der vielleicht einen (möglicherweise zu Schaden führenden) Designfehler hilft zu vermeiden. Außerdem gibts im Web (archwiki, unix.stackexchange) haufenweise Beispiele, für Startup-Units und Shutdown-Units.... probiers einfach aus. Damit bin ich jetzt wirklich raus.
|
noisefloor
Ehemaliger
Anmeldungsdatum: 6. Juni 2006
Beiträge: 29041
Wohnort: WW
|
Hallo,
@noisefloor Nachdem du dich hier wohl auskennst, hätte ich folgende fragen an dich:
Danke, aber a) ist das hier kein Privatunterhaltung, b) gibt es auch andere, die sich auskennen und c) kennt sich TomLu, basierend auf seinen Posts hier, mindestens genau so gut aus. Service Units kennen alle mögliche Direktiven, inkl. so Sachen wie ExecPre , ExecStop , ExecStopPost etc. → Doku 🇬🇧. Was davon jetzt für dich relevant ist kann ich dir nicht sagen, weil du dich mit Info ja ziemlich stark hinterm Berg hältst. TomLu hat schon Recht: solange du versuchst, an deinem (zu 99,9% falschem) Gedankenmodell festzuhalten, wie wann was zu starten ist und dich nicht vollumfänglich auf die Möglichkeiten und Wege von systemd einlässt, wird das eher nichts... Gruß, noisefloor
|