*seufz* ...
TomL hat geschrieben: 25.03.2018 19:23:16
Bei Type=oneshot muss
'/bin/bash test1.sh' binnen 90 Sekunden nach dem Start der Unit durch systemd mit exit-Code 0 beendet werden. Wenn der Job länger läuft, muss er also geforkt werden. Ansonsten beendet/entfernt systemd diesen Job als "failed"
Das ist mal wieder falsch.
Nastra hat geschrieben: 25.03.2018 19:52:16
Genau so führe ich ihn in der Unit aus und es klappt
Upps, stimmt, mir ist gerade wieder eingefallen, dass du ja sämtliche Scripte brav unter /usr/local/bin/ ablegst. Das liegt im Suchpfad, wo Bash nachguckt, wenn es einen Befehl nicht findet. Den Suchpfad kannst du dir übrigens angucken, mit:
echo $PATH
Nastra hat geschrieben: 25.03.2018 19:52:16
, wenn ich denn vollständigen Pfad angebe funktioniert es nicht also usr/local/bin/bash Skript X
Wie sollte es ansonsten aussehen?
Mönsch ... Nastra ... du haust manchmal Sachen raus ...
Natürlich funktioniert es so nicht. Auch du bewahrst deine Bash unter /bin/bash auf und nicht unter usr/local/bin/bash. Und ohne "/" am Anfang wäre das eh ein lokaler Pfad von "hier" aus.
Ich meinte sowas:
/bin/bash /usr/local/bin/test1.sh
(Den Pfad zu test1.sh habe ich eben geraten). Wie eben erklärt, klappt es auch ohne Pfad zum Script, aber mit wäre es eindeutig. Da gibt es nämlich ein kleines Problem: Nimm an, du nennst das Script wirklich /usr/local/bin/bash, was wird dann wohl ausgeführt, wenn du "bash" aufrufst?
Wenn du jetzt sagst "So nen Scheiß mach ich nicht!" ... mag sein. Aber ich habe immer noch im Hinterkopf, dass du deine Ergebnisse vielleicht veröffentlichen willst, und dann sollten sie einigermaßen idiotensicher sein.
Abgesehen davon ist $PATH veränderbar (recht leicht sogar). Den verändert man zwar nur, wenn man auf Ärger aus ist, aber manche Leute machen das, du hast also keine Garantie, dass /usr/local/bin/ auf allen Systemen im Suchpfad ist.
Nastra hat geschrieben: 25.03.2018 19:52:16
Habe ich gerade 3 mal ausprobiert, das funktioniert sogar so wie es aussieht führt er auch die einzelnen ExecStart nacheinander aus. Bei allen drei Test wurde mit dem ersten ExecStart eine Datei erzeugt und mit dem zweiten ExecStart diese versendet. Ich hoffe das es kein Zufall gewesen ist
Ach so, die beiden Scripte sind voneinander abhängig? Dann wäre ExecStartPost eigentlich genau richtig gewesen (wie du ja selber sagst). Hmm ... eventuell meldet das erste Script "fertig", aber die Datei ist noch nicht so ganz fertig geschrieben, sondern braucht noch ein paar Millisekunden ... das kann auf einer SD-Karte mal vorkommen. Aber das würde auch nicht erklären, warum es mit ExecStart geht und mit ExecStartPost nicht.
Ach, grad noch zu ExecStart gefunden:
If more than one command is specified, the commands are invoked sequentially in the order they appear in the unit file. If one of the commands fails [...], other lines are not executed, and the unit is considered failed.
Das ist zwar nicht so ganz eindeutig, kann aber eigentlich nur funktionieren, wenn Systemd mit dem nächsten ExecStart wartet, bis das erste sich (erfolgreich) beendet hat. Ich kann bisher für Type=oneshot keinen Unterschied zwischen ExecStart und ExecStartPost ausmachen.
Also so richtig trauen würde ich der Sache noch nicht ...
Nastra hat geschrieben: 25.03.2018 19:52:16
Noch eine zusätzliche Frage in die Runde, ist es eigentlich möglich einen Befehl den man im Terminal eingibt z.B. sudo xxxxxx auch direkt durch eine Unit auszuführen ohne Skript? Konnte da bisher nicht wirklich was zu finden
Kommt drauf an, wie das xxxxxx aussieht. Wenn das wirklich
ein Befehl ist, dann ja - genau dazu wurde Systemd gemacht: ExecStart=/usr/bin/xxxxxx
Das sudo wäre dann überflüssig - Systemd startet den Befehl eh als root solange du nichts anderes angibst.
Never change a broken system. It could be worse afterwards.
"No computer system can be absolutely secure." Intel Document Number: 336983-001