PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Mehrere Skripte in shell script ausführen



yan
19-03-2009, 18:55
Hallo.

Um mehrere Instanzen von Thunderbird gleichzeitig benutzen zu können, verwende ich drei kleine Skripte, um das Programm mit verschiedenen Profilen zu starten. (Dafür muss die Variable MOZ_NO_REMOTE verändert werden.) Der Inhalt der drei Skripte ist:


#!/bin/sh
export MOZ_NO_REMOTE=1
/usr/bin/thunderbird -P <Profilname>
export MOZ_NO_REMOTE=0

exit 0

Jetzt möchte ich gern diese drei Skripte direkt hintereinander ausführen, d.h. die drei Instanzen von Thunderbird hintereinander starten. Im Moment mache ich das manuell. Kann mir jemand sagen, wie ein Skript aussehen müsste, um die drei Skripte hintereinander auszuführen?

Ich benutze Ubuntu Linux (Intrepid Ibex) und habe mir einen Menüpunkt angelegt, um die Skripte aufzurufen. Anstatt die drei Instanzen hintereinander weg manuell zu starten möchte ich dies eben automatisieren.

Eine mir empfohlene Variante ist:


#!/bin/bash

sh script1.sh
sh script2.sh
sh script3.sh

Dies klappt aber nicht, weil zwar die erste Instanz geöffnet wird, die anderen aber nicht. Wenn ich dann die erste schließe, öffnet sich die zweite. Wenn ich diese schließe, öffnet sich die dritte.

ContainerDriver
19-03-2009, 21:42
Hallo,

du suchst das &-Zeichen.
Du könntest entweder in jedem Skript ein & hinter den Aufruf von Thunderbird hängen


[...]
/usr/bin/thunderbird -P <Profilname> &
[...]

oder in deinem Wrapperskript hinter jeden Aufruf von sh


[...]
sh script1.sh &
sh script2.sh &
sh script3.sh &


Gruß, Florian

yan
20-03-2009, 10:31
Ich dachte mir ja schon, dass es irgendetwas sehr einfaches sein würde. Das klappt, danke ContainerDriver.

yan
07-04-2009, 16:51
Eine weitere Frage diesbezüglich: Da die drei Thunderbird-Instanzen nach dem Start (per FireTray (https://addons.mozilla.org/en-US/thunderbird/addon/4868)) in den Systemtray verbannt werden, wäre es schön, wenn sie immer in der selben Reihenfolge gestartet würden. Anscheinend braucht die erste Instanz aber meistens länger, wodurch die Reihenfolge beeinflusst wird. Auf meiner Suche bin ich auf den Befehl "sleep" gestoßen und habe folgendes probiert:


sh script1.sh &
sleep 3
sh script2.sh &
sleep 3
sh script3.sh &

und auch


sh script1.sh &
sleep 3 &
sh script2.sh &
sleep 3 &
sh script3.sh &

Es hat aber den Anschein, dass der "sleep"-Befehl einfach ignoriert wird. Weiß jemand, wie ich ihn richtig einsetzen kann? Oder vielleicht kennt ja auch jemand eine bessere Lösung. Es geht mir darum, dass immer erst ein Skript zu Ende ausgeführt wird und dann das nächste aufgerufen wird.

jan61
07-04-2009, 20:17
Moin,

das & hinter dem sleep 3 ist natürlich kontraproduktiv ;-) Mit dem & schickst Du ja gerade Programme in den Hintergrund, die aufrufende Shell wartet nicht auf das Ende (in diesem Falle des sleep). Warten auf Beendigung und Hintergrund widersprechen sich.

Mit dem sleep in Deiner ersten Variante machst Du einfach eins: Du feuerst das Script ab, ohne auf das Ende zu warten, schläfst dann 3 Sekunden und nimmst Dir das nächste Script vor. Wenn die 3 Sekunden nicht zum Starten reichen, dann rennt das nächste Script los, bevor das vorige durch ist.

Versuch mal die Variante von ContainerDriver, nicht die startenden Scripts, sondern die thunderbird-Prozesse in den Hintergrund zu schicken. Dann sollten zumindest die thunderbird-Prozesse gestartet sein, bevor die Scripts zurückkommen.

Jan

yan
26-05-2009, 12:34
Um nach einiger Zeit nochmal auf das Thema zurück zu kommen:


das & hinter dem sleep 3 ist natürlich kontraproduktiv ;-) Mit dem & schickst Du ja gerade Programme in den Hintergrund, die aufrufende Shell wartet nicht auf das Ende (in diesem Falle des sleep). Warten auf Beendigung und Hintergrund widersprechen sich.

Ok, mein Startskript sieht jetzt wie folgt aus:


#!/bin/bash

cd ~/.scripts

sh script1.sh
sleep 6
sh script2.sh
sleep 4
sh script3.sh

Und die darin aufgerufenen Skripte haben die folgende Form:


#!/bin/sh
export MOZ_NO_REMOTE=1
/usr/bin/thunderbird -P <Profilname> &
export MOZ_NO_REMOTE=0

exit 0

Wenn mein Rechner gerade nicht viel zu tun hat, dann funktioniert das auch ganz gut. Wenn er allerdings beschäftigt ist, dann braucht der erste Aufruf von Thunderbird auch mal etwas länger. Der zweite und der dritte hingegen gehen schneller, weil das Programm ja schon gestartet wurde. Dann kann es passieren, dass die zweite oder dritte Instanz schon vor der ersten geladen ist. Das könnte ich natürlich durch einen noch höheren sleep-Wert verhindern, jedoch wird es dann irgendwann einfach zu lang.

Die Frage ist also, was ich machen muss, damit immer erst eine Instanz zu ende geladen wird und dann das nächste Skript ausgeführt wird. Geht das?

jan61
26-05-2009, 19:16
Moin,

das dürfte nicht so einfach sein. Wie soll man entscheiden, wann Thunderbird "geladen" ist - der entsprechende Prozess dürfte sofort da sein. Er tut nur erstmal was anderes, bis das Fenster aufgebaut ist.

Eigentlich fällt mir nur ein, die Last, die der Prozess verursacht, zu überwachen.

Jan