Anzeige:
Ergebnis 1 bis 7 von 7

Thema: Mehrere Skripte in shell script ausführen

  1. #1
    yan
    Gast

    Mehrere Skripte in shell script ausführen

    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:

    Code:
    #!/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:

    Code:
    #!/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.

  2. #2
    Registrierter Benutzer Avatar von ContainerDriver
    Registriert seit
    10.01.2003
    Beiträge
    418
    Hallo,

    du suchst das &-Zeichen.
    Du könntest entweder in jedem Skript ein & hinter den Aufruf von Thunderbird hängen
    Code:
    [...]
    /usr/bin/thunderbird -P <Profilname> &
    [...]
    oder in deinem Wrapperskript hinter jeden Aufruf von sh
    Code:
    [...]
    sh script1.sh &
    sh script2.sh &
    sh script3.sh &
    Gruß, Florian
    Ein gebrechlich Wesen ist der X-Server.

  3. #3
    yan
    Gast

    Thumbs up

    Ich dachte mir ja schon, dass es irgendetwas sehr einfaches sein würde. Das klappt, danke ContainerDriver.

  4. #4
    yan
    Gast
    Eine weitere Frage diesbezüglich: Da die drei Thunderbird-Instanzen nach dem Start (per FireTray) 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:

    Code:
    sh script1.sh &
    sleep 3
    sh script2.sh & 
    sleep 3
    sh script3.sh &
    und auch

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

  5. #5
    Registrierter Benutzer
    Registriert seit
    07.05.2007
    Beiträge
    656
    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

  6. #6
    yan
    Gast
    Um nach einiger Zeit nochmal auf das Thema zurück zu kommen:

    Zitat Zitat von jan61 Beitrag anzeigen
    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:

    Code:
    #!/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:

    Code:
    #!/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?

  7. #7
    Registrierter Benutzer
    Registriert seit
    07.05.2007
    Beiträge
    656
    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

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •