Start-/Stopscripte für automatisches codieren
Start-/Stopscripte für automatisches codieren
Moin!
ich wollte meinen Rechner soweit automatisieren, dass er aufgenommene Videodateien automatisch mit Transcode codiert. Ich habe mir jetzt auch schon entsprechende Skripte geschrieben, die flexibel auf vorhandene Videodateien reagieren etc.
Nun möchte ich das aber nicht über Crontab zeitgesteuert starten, sondern eigentlich gerne schon bei Systemstart. Nur finde ich dazu über Suchmaschinen nur bedingt brauchbares, bzw. habe ich noch Fragen.
Ich habe mir die Skeleton-Datei in /etc/init.d angeschaut und mir auch die Manpages zu start-stop-daemon durchgelesen. Gehe ich jetzt richtig in der Annahme, dass ich das Skript über diesen Befehl starte, in diesem Skript aber noch forken und in den Hintergrund schieben muss (damit es eben "nebenbei" läuft)? Über Crontab funktioniert das ja automatisch, deshalb die Frage.
Der start-stop-daemon-Befehl dient ja auch zum Beenden des Scriptes. Sehe ich das richtig, dass ich das Signal im Originalskript dann mit "trap" abfangen muss?
Generiert trap generell nur einen "Shell-Befehl" (also einen gequoteten)? Oder kann ich irgendwie auch eine Sektion einleiten und wie in einem Skript arbeiten? Ich würde nämlich gerne transcode (der ggf. ja geforkt ist) beenden, temporäre Dateien von unfertigen Codierungen löschen etc.
Kann mir da jemand weiterhelfen? Ich nehme auch gerne Webseiten zu dem Thema, aber leider schweigen sich die, die ich gefunden habe, dazu aus...
Fröhliche Grüße,
Chinook
ich wollte meinen Rechner soweit automatisieren, dass er aufgenommene Videodateien automatisch mit Transcode codiert. Ich habe mir jetzt auch schon entsprechende Skripte geschrieben, die flexibel auf vorhandene Videodateien reagieren etc.
Nun möchte ich das aber nicht über Crontab zeitgesteuert starten, sondern eigentlich gerne schon bei Systemstart. Nur finde ich dazu über Suchmaschinen nur bedingt brauchbares, bzw. habe ich noch Fragen.
Ich habe mir die Skeleton-Datei in /etc/init.d angeschaut und mir auch die Manpages zu start-stop-daemon durchgelesen. Gehe ich jetzt richtig in der Annahme, dass ich das Skript über diesen Befehl starte, in diesem Skript aber noch forken und in den Hintergrund schieben muss (damit es eben "nebenbei" läuft)? Über Crontab funktioniert das ja automatisch, deshalb die Frage.
Der start-stop-daemon-Befehl dient ja auch zum Beenden des Scriptes. Sehe ich das richtig, dass ich das Signal im Originalskript dann mit "trap" abfangen muss?
Generiert trap generell nur einen "Shell-Befehl" (also einen gequoteten)? Oder kann ich irgendwie auch eine Sektion einleiten und wie in einem Skript arbeiten? Ich würde nämlich gerne transcode (der ggf. ja geforkt ist) beenden, temporäre Dateien von unfertigen Codierungen löschen etc.
Kann mir da jemand weiterhelfen? Ich nehme auch gerne Webseiten zu dem Thema, aber leider schweigen sich die, die ich gefunden habe, dazu aus...
Fröhliche Grüße,
Chinook
Also mal kurz quick 'n dirty von mir:
Du schreibst dir ein Skript, dass deinen Prozess startet, die gewünsche Aufgabe erledigt und eine .pid Datei schreibt. In dieser Datei steht dann deine PID
Wie die Skripte in /etc/init.d/ ausschauen müssen kannst du ja an den vorhanden sehen. Du brauchst nur eine case/esac Bedingung. Dort bindest du dann dein Skript ein bzw. schreibst das ganze Skript in das init.d-Skript. Zum stoppen des Prozesses nimmst du die .pid Datei her.
Damit das Skript beim Systemstart gestartet wird muss du einen symbolischen Link in /etc/rc2.d legen. Debian start im Runlevel 2. Und zum beenden ein symlink in rc0.d. Beachte den Anfangsbuchstaben S+K und die Nummer (Reihenfolge).
mfg
Du schreibst dir ein Skript, dass deinen Prozess startet, die gewünsche Aufgabe erledigt und eine .pid Datei schreibt. In dieser Datei steht dann deine PID
Wie die Skripte in /etc/init.d/ ausschauen müssen kannst du ja an den vorhanden sehen. Du brauchst nur eine case/esac Bedingung. Dort bindest du dann dein Skript ein bzw. schreibst das ganze Skript in das init.d-Skript. Zum stoppen des Prozesses nimmst du die .pid Datei her.
Damit das Skript beim Systemstart gestartet wird muss du einen symbolischen Link in /etc/rc2.d legen. Debian start im Runlevel 2. Und zum beenden ein symlink in rc0.d. Beachte den Anfangsbuchstaben S+K und die Nummer (Reihenfolge).
mfg
Danke für eure Antworten ^^
Wie ich die Skripte einpflege, wusst ich schon, trotzdem Danke. Mein Problem bestand eher darin, wie ich einen "quasi"-Dämon erschaffe (also vermutlich doch forken und in den Hintergrund schieben - sollte zumindest funktioniere) und nach einem fork mit diesem Prozess kommuniziere - vielen Dank an dieser Stelle für den Tipp mit der pid-Datei.
Ein Problem hab ich an dieser Stelle noch mit den von mir aufgerufenen, externen Programmen: Wie beende ich effektiv einen entsprechenden Transcode-Aufruf? Kommt man irgendwie effektiv ohne ps an die pid (falls aus irgendeinem Grund mal nicht zu beendende Transcode-Prozesse laufen)? Oder muss ich für die Transcode-Aufrufe wieder einen Prozess forken, der diesen Aufruf dann startet (von dem kenne ich ja die pid).
@nepos: vielen Dank ^^ Das hatte ich auch schon gelesen. Das Problem ist, dass ich beim beenden meines Systems einen sauberen Zustand hinterlassen möchte - d.h. ich möchte noch von Transcode erzeugte Dateien löschen. Dazu muss ich ersteinmal Transcode beenden und die Dateien anschließend löschen.
Da dies beim Beenden von Linux auftritt, kam ich eben auf die Idee mit den Start-/Stopp-Skripten.
Fröhliche Grüße,
Chinook
Wie ich die Skripte einpflege, wusst ich schon, trotzdem Danke. Mein Problem bestand eher darin, wie ich einen "quasi"-Dämon erschaffe (also vermutlich doch forken und in den Hintergrund schieben - sollte zumindest funktioniere) und nach einem fork mit diesem Prozess kommuniziere - vielen Dank an dieser Stelle für den Tipp mit der pid-Datei.
Ein Problem hab ich an dieser Stelle noch mit den von mir aufgerufenen, externen Programmen: Wie beende ich effektiv einen entsprechenden Transcode-Aufruf? Kommt man irgendwie effektiv ohne ps an die pid (falls aus irgendeinem Grund mal nicht zu beendende Transcode-Prozesse laufen)? Oder muss ich für die Transcode-Aufrufe wieder einen Prozess forken, der diesen Aufruf dann startet (von dem kenne ich ja die pid).
@nepos: vielen Dank ^^ Das hatte ich auch schon gelesen. Das Problem ist, dass ich beim beenden meines Systems einen sauberen Zustand hinterlassen möchte - d.h. ich möchte noch von Transcode erzeugte Dateien löschen. Dazu muss ich ersteinmal Transcode beenden und die Dateien anschließend löschen.
Da dies beim Beenden von Linux auftritt, kam ich eben auf die Idee mit den Start-/Stopp-Skripten.
Fröhliche Grüße,
Chinook
Was verstehst du unter "sauber beenden"? Normalerweise schickt das System ja an alle Prozesse waehrend dem Herunterfahren ein SIGTERM, wodurch sich eigentlich ein Programm sauber beenden sollte. Alle Prozesse, die dies nicht tun, werden durch das spaeter folgende SIGKILL wirklich hart beendet. Auch ein Init-Skript macht meines Wissens oft nicht viel mehr, als ein entsprechendes Signal zu schicken.
Wegen dem Punkt der korrekten Prozess-ID: zum Einen bietet meines Wissens start-stop-daemon die Option, eine entsprechende PID-File beim Start anzulegen. Deren Name ist dir dann ja bekannt und du kannst diese PID-File wieder fuer das Beenden des richtigen Prozesses benutzen. Alternativ koenntest du auch mit pidof die PID herausfinden.
Im Falle eines Start-/Stop-Skriptes wuerde ich aber den ersten Weg bevorzugen. Schau dir z.B. das Skript fuer den syslog-ng an. Da wird glaube ich entsprechend verfahren.
Wegen dem Punkt der korrekten Prozess-ID: zum Einen bietet meines Wissens start-stop-daemon die Option, eine entsprechende PID-File beim Start anzulegen. Deren Name ist dir dann ja bekannt und du kannst diese PID-File wieder fuer das Beenden des richtigen Prozesses benutzen. Alternativ koenntest du auch mit pidof die PID herausfinden.
Im Falle eines Start-/Stop-Skriptes wuerde ich aber den ersten Weg bevorzugen. Schau dir z.B. das Skript fuer den syslog-ng an. Da wird glaube ich entsprechend verfahren.
Leider ist dies bei transcode nicht so. Transcode erzeugt beim codieren eine stream.yuv. Sollte transcode vorzeitig beendet werden, löscht es diese Datei leider nicht.
Das Problem ist nun, dass ein Neustart von transcode nicht funktioniert, da diese Datei vorhanden ist und transcode mit einem Fehler abbricht. Man muss immer erst diese Datei löschen. Dies wollte ich nun eben schon beim herunterfahren erledigen.
Dieser Prozess hat dann aber doch eine andere PID, dachte ich. Ich werde mir aber das von Dir empfohlene Skript mal anschauen, danke Dir.
Fröhliche Grüße,
Chinook
Das Problem ist nun, dass ein Neustart von transcode nicht funktioniert, da diese Datei vorhanden ist und transcode mit einem Fehler abbricht. Man muss immer erst diese Datei löschen. Dies wollte ich nun eben schon beim herunterfahren erledigen.
Hmm... aber das müsste doch die PID des von start-stop-daemon gestarteten Skriptes sein, oder? Meines Wissens nach forke ich das Skript und schiebe den Childprozess in den Hintergrund. Dann beend ich das Originalskript und erhalte so einen Waisen.nepos hat geschrieben:Wegen dem Punkt der korrekten Prozess-ID: zum Einen bietet meines Wissens start-stop-daemon die Option, eine entsprechende PID-File beim Start anzulegen. Deren Name ist dir dann ja bekannt und du kannst diese PID-File wieder fuer das Beenden des richtigen Prozesses benutzen. Alternativ koenntest du auch mit pidof die PID herausfinden.
Im Falle eines Start-/Stop-Skriptes wuerde ich aber den ersten Weg bevorzugen. Schau dir z.B. das Skript fuer den syslog-ng an. Da wird glaube ich entsprechend verfahren.
Dieser Prozess hat dann aber doch eine andere PID, dachte ich. Ich werde mir aber das von Dir empfohlene Skript mal anschauen, danke Dir.
Fröhliche Grüße,
Chinook
Also wenn es eine andere Möglichkeit gibt, wäre ich erfreut was neues zu lernen *smile*
Es geht ja schlicht darum, dass der unabhängig und im Hintergrund arbeiten muss. Wie ein Demon eben. Und mein bisheriger Kenntnisstand ist eben, dass das über ein fork und ein verschieben in den Hintergrund stattfindet.
Fröhliche Grüße,
Chinook
Es geht ja schlicht darum, dass der unabhängig und im Hintergrund arbeiten muss. Wie ein Demon eben. Und mein bisheriger Kenntnisstand ist eben, dass das über ein fork und ein verschieben in den Hintergrund stattfindet.
Fröhliche Grüße,
Chinook
Hm, naja, du schreibst, dein Problem sind die Dateien, die transcode bei einem Abbruch liegen läßt. Du könntest dein Skript z.B. so erweitern, dass es beim Start erstmal diese "Leichen" entfernt. Leider kenne ich transcode und dessen Arbeitsweise nicht und weiß also nicht, ob man diese Dateien, die nicht fertig bearbeitet wurden, so einfach erkennen kann.