Start-/Stopscripte für automatisches codieren

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Chinook
Beiträge: 40
Registriert: 31.08.2006 20:12:44

Start-/Stopscripte für automatisches codieren

Beitrag von Chinook » 18.05.2007 17:19:54

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

Benutzeravatar
Cloonix
Beiträge: 589
Registriert: 20.11.2004 10:42:24
Wohnort: München
Kontaktdaten:

Beitrag von Cloonix » 19.05.2007 00:06:11

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
proud to be 100% M$ free (except X300T)
http://claus.freakempire.de
http://debian.freakempire.de

nepos
Beiträge: 5238
Registriert: 05.01.2005 10:08:12

Beitrag von nepos » 19.05.2007 00:56:58

Viel einfacher. Du kannst es via crontab machen. Cron versteht bei der Zeitangabe die spezielle Angabe @reboot.
Damit kannst du Cron-Jobs anlegen, die nach einem Reboot laufen sollen ;)

Chinook
Beiträge: 40
Registriert: 31.08.2006 20:12:44

Beitrag von Chinook » 19.05.2007 01:17:38

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

nepos
Beiträge: 5238
Registriert: 05.01.2005 10:08:12

Beitrag von nepos » 19.05.2007 01:23:23

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.

Chinook
Beiträge: 40
Registriert: 31.08.2006 20:12:44

Beitrag von Chinook » 19.05.2007 10:25:58

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.
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.
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.
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

nepos
Beiträge: 5238
Registriert: 05.01.2005 10:08:12

Beitrag von nepos » 19.05.2007 10:29:47

Ach so. Dann hatte ich wohl nicht ganz ueberblickt, wie du mit deinem Skript arbeitest. Da denke ich wirst du fast nicht um die Variante mit pidof rumkommen.

Chinook
Beiträge: 40
Registriert: 31.08.2006 20:12:44

Beitrag von Chinook » 19.05.2007 11:11:49

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

nepos
Beiträge: 5238
Registriert: 05.01.2005 10:08:12

Beitrag von nepos » 19.05.2007 21:32:43

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.

Antworten