• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

[teilgelöst]Prog starten--pause--Prog starten--pause....?

Hi :)

Kann mir bitte jemand helfen? Ich fände es ganz toll wenn das jemand für mich lösen könnte, weil ich mich halt wirklich 0 auskenne.

Mein Problem ist:
Ich starte einige Programme normalerweise mit "ksystraycmd" vor dem eigendlichen Befehl damit sie in das tray gedockt werden.
Diese hätte ich aber gerne auch im Autostart.

Die Befehle sehen eigendlich in Etwa so aus:
ksystraycmd run_manager
ksystraycmd gkrellm
ksystraycmd wish /opt/Kästle/Fernbedienung.tcl

Das mit ksystraycmd nochmals eben damit es im Tray gedockt wird.
Das ganze über Icons die mit dem jeweiligen Befehl ausgestattet sind.
Problem ist:
Wenn die Programme im ".Autostart" liegen, dann starten sie durcheinander und der Ksystraycmd fängt willkürlich offene Fenster ein.

Deswegen hätte ich gern ein script das folgendes macht:

es liegt im Autostart und wenn es im Autostart gestartet wird, dann wartet es 5 sekunden. Und dann startet es der Reihe nach:
ksystraycmd run_manager
dann wartet es 3 Sekunden und startet;
ksystraycmd gkrellm
dann wartet es wieder 3 Sekunden und startet;
ksystraycmd wish /opt/Kästle/Fernbedienung.tcl
dann wartet es wieder 3 Sekunden und startet;
Kopete

Dann ist alles gestartet.

Hab ich mir das richtig vorgestellt und kann mir jemand sowas basteln bitte?

Gruss

R
 
Wenn ich dich jetzt richtig verstanden habe könntest du es mal mit "sleep" probieren, d.h. z. B.
Code:
sleep 3
wartet 3 Sekunden.

Dazu müßten aber deine ganzen Autostarts in einer Datei stehen und ich habs nicht ausprobiert (<- Disclaimer 8)).
 
ok Problem:

das schaut bis jetz so aus aber ich kenn mich halt null aus! Das Problem ist, dass die Programme erst starten, wenn ich sie der Reihe nach schliesse - also es startet BOINC dann wartet das script leider bis BOINC ganz beendet und dann fängts erst mit Pennen an und startet dann gkrellm und wartet dann wieder bis gkrellm beendet ist und dann startet es erst das nächste und fängt mit $PENN an usw... wie kann ich machen, das es nicht auf Ende des Programms wartet?
Code:
#/bin/bash
#######
PENN="sleep 3"
BOINC="/home/boinc/BOINC/run_manager"
GKRELLM="ksystraycmd gkrellm"
KAESTLE="ksystraycmd wish /opt/Kästle/Fernbedienung.tcl"
MESSI="kopete"
#######
while ! [ `pidof kicker` ]
do
     sleep 5
done
#######
while ! [ `pidof kdeinit` ]
do
     sleep 5
done
#######
$BOINC & 
$PENN
$GKRELLM &
$PENN
$KAESTLE &
$PENN
$MESSI &
## EOF
Das Script prüft jetzt ob kdeinit und kicker da ist ansonsten wartet es für jedes jeweils "5 sek." und wenn Kicker und kdeinit da ist, dann startet es BOINC und pennt "2" und GKRELLM und pennt "2" usw...

kann mir jemand die Richtigkeit bestätigen?

Gruss

R
 
Hier mal ein Ausschnittaus meinem Autostart-Script für E17 (als Anregung):
Code:
#!/bin/sh

# Check if trayer is running
while [ `ps aux | grep /usr/bin/trayer | grep -v grep | wc -l` -eq 0 ]; do sleep 1; done;

# korgac
if [ `ps aux | grep /opt/kde/bin/korgac | grep -v grep | wc -l` -eq 0 ];
  then /opt/kde/bin/korgac &
fi;

# kwalletmanager
if [ `ps aux | grep /opt/kde/bin/kwalletmanager | grep -v grep | wc -l` -eq 0 ];
  then /opt/kde/bin/kwalletmanager --kwalletd &
fi;
 
Hey Chief!

Hier mal ein Ausschnittaus meinem Autostart-Script für E17 (als Anregung):
Danke sieht super aus! Aber ich hoffe du weisst, das ich einfach nicht weiss was dein Script macht - weil ich kein BASH kann einfach - ich versteh das alles nicht.

Ich hab die Schleife die ich verwendet hab fast fertig in einem Forum gefunden.

Aktuell sieht das bei mir so aus weil ich es nochmal umgebaut habe:
Code:
#/bin/bash
#######
PENN="sleep 3"
BOINC="/home/boinc/BOINC/run_manager"
GKRELLM="ksystraycmd gkrellm"
KAESTLE="ksystraycmd wish /opt/Kästle/Fernbedienung.tcl"
MESSI="kopete"
#######
sleep 15
while ! [ `pidof kicker` ]
do
     sleep 10
done
#######
while ! [ `pidof kdeinit` ]
do
     sleep 10
done
#######
$BOINC &
while ! [ `pidof boinc` ]
do
     $PENN
done
#######
while ! [ `pidof ksystraycmd` ]
do
     $PENN
done
####### 
$GKRELLM &
while ! [ `pidof gkrellm` ]
do
     $PENN
done
#######
$KAESTLE &
while ! [ `pidof wish` ]
do
     $PENN
done
#######
$MESSI &
while ! [ `pidof wish` ]
do
     $PENN
done
## EOF

Und ich mach das ganze eigendlich überhaupt nur, weil es mir sonst eben beim Ksystraycmd irgendwelche Fenster einfängt, die es garnicht einfangen soll. Also beispielsweise kommen sonst 2 Traysymbole mit gleichem ICON für BOINC und Alle Fenster die ich offen haben wollte sind zwar offen aber eines davon ist halt in 2 Icons gefangen oder das Fenster startet garnicht. Entweder liegt das an Ksystraycmd oder ich habs so wieder ausgetrixt.

Kannst du mir helfen, das "ksystraycmd" unter Kontrolle zu bringen?

Was auch ganz interessant ist beispielsweise ist, dass zwar BOINC usw in der Reihenfolge und Zeit startet ohne sich zu haken, aber BOINC verwendet nicht die KDE Farben. Obwohl es so eingestellt ist. Aber wenn ich das BOINC das vom Script gestartet wurde schliesse und dann über das Desktop Icon starte, dann hat es die KDE Farben.

Gruss

R
 
revealed schrieb:
Aber ich hoffe du weisst, das ich einfach nicht weiss was dein Script macht - weil ich kein BASH kann einfach - ich versteh das alles nicht.
Dann wird es doch langsam Zeit sich mal mit der bash zu beschäftigen. :wink:

revealed schrieb:
Ich hab die Schleife die ich verwendet hab fast fertig in einem Forum gefunden.
:roll:

Code:
while ! [ `pidof kicker` ]
do
     sleep 10
done
Macht in etwa dasselbe wie
Code:
while [ `ps aux | grep /usr/bin/trayer | grep -v grep | wc -l` -eq 0 ]; do sleep 1; done;
=> Solange warten bis trayer bzw. kicker gestartet sind.
Btw: Die Intervalle (sleep) würde ich heruntersetzen (dafür hast du doch die Schleife).

Code:
while ! [ `pidof kdeinit` ]
do
     sleep 10
done
Kannst du dir IMHO sparen.
Wenn kicker läuft, sollte auch kdeinit laufen.

Der Rest sollte so laufen.

revealed schrieb:
Kannst du mir helfen, das "ksystraycmd" unter Kontrolle zu bringen?
Sry, ich benutze kcmsystray nicht.
 
@b3ll3roph0n:
b3ll3roph0n schrieb:
...
Code:
while ! [ `pidof kicker` ]
do
     sleep 10
done
Macht in etwa dasselbe wie
Code:
while [ `ps aux | grep /usr/bin/trayer | grep -v grep | wc -l` -eq 0 ]; do sleep 1; done;
...
Was genau ist der Unterschied zwischen
Code:
while ! [ `pidof /usr/bin/trayer` ]
und
Code:
while [ `ps aux | grep /usr/bin/trayer | grep -v grep | wc -l` -eq 0 ]
(ich hab ein bisschen damit rumgespielt aber es kam immer das selbe raus - andererseits wäre es nicht das erste mal dass ich was übersehen habe aber ich finde ersteres schöner da es kürzer ist)?

@revealed:
In einem shell Skript führst du genau die selben Befehle aus wie in einer "konsole" - und die liefern auch die selben Ausgaben.
Die Idee ist die Ausgabe des einen Befehls mittels des "pipe" Operators ("|") als Eingabe für den nächsten Befehl zu nutzen. Mittels Steuerungsbefehlen wie if, while, ... bringst du dann die nötige Logik rein und fertig ist das Skript.
Schau dir mal http://www.google.de/search?q=linux+shell+script+tutorial an 8) :wink:. Obwohl es am Anfang etwas niederschmetternd ausschaut ist es eigentlich nicht wirklich schwer (vorausgesetzt du schaust dir das wirklich an) da du für den "Hausgebrauch" nur einen Bruchteil brauchst.
IMHO einer der Vorteile von "Linux" da sich so viele Diinge automatisieren lassen!
 
Blackscreen schrieb:
Was genau ist der Unterschied zwischen
Code:
while ! [ `pidof /usr/bin/trayer` ]
und
Code:
while [ `ps aux | grep /usr/bin/trayer | grep -v grep | wc -l` -eq 0 ]
(ich hab ein bisschen damit rumgespielt aber es kam immer das selbe raus - andererseits wäre es nicht das erste mal dass ich was übersehen habe aber ich finde ersteres schöner da es kürzer ist)?
Vergleich das mal mit einer Anwendung, von der zwei Instanzen gestartet sind. :wink:

Bsp:
Programme: 2x xterm, 1x urxvt
Script 1:
Code:
#!bin/sh
if [ `pidof $1` ]; then
  echo "true";
fi;
Script 2:
Code:
#!bin/sh
if [ `ps aux | grep $1 | grep -v grep | wc -l` -gt 0 ]; then
  echo "true";
fi;
Beim ersten Script erhalte ich bei
Code:
scrip1.sh xterm
Code:
./test.sh: line 3: [: 4104: unary operator expected
weil
Code:
pidof xterm
zwei, durch Leerzeichen getrennte, PIDs zurückliefert.
=> Also eine Liste von Argumenten, die in der while-Schleife für Ärger sorgt.

Beim zweiten Script erhalte ich (durch den Einsatz von wc), egal bei wie vielen gestarteten Programmen immer einen Integer - nämlich die Anzahl der Instanzen von Programm X - als Ausgabe, den ich dann verwerten (vergleichen) kann.

Letztendlich gefällt mir die zweite Variante besser, weil ich damit die Rückgabe des Tests (ps aux ....) besser kontrollieren kann (und mich nicht mit einer Liste von Argumenten herumschlagen muss). :wink:
 
(Ausnahmsweise als Doppelpost - damit es etwas übersichtlicher ist)

Blackscreen schrieb:
Die Idee ist die Ausgabe des einen Befehls mittels des "pipe" Operators ("|") als Eingabe für den nächsten Befehl zu nutzen.
Was das Problem allerdings mit Pipes zu tun, haben soll ... :?

Mit einer Pipe wird - wie oben richtig erklärt - lediglich die Ausgabe eines vorhergehenden Befehls verarbeitet.
Die hier gestarteten Programme erzeugen aber keine Ausgabe die Verarbeitet werden müsste.
Auch eine Verkettung mittels kommando1 && kommando2 dürfte hier nicht funktionieren, da kommando1 erst true zurückliefert, wenn es erfolgreich ausgeführt (also auch wieder beendet) wurde.

Es wäre noch denkbar das ganze in einer for-Schleife abzuarbeiten und das nächste Programm erst aufzurufen, wenn das letzte gestartet wurde:
Code:
#!/bin/sh

PROG[0]="/home/boinc/BOINC/run_manager";
PROG[1]="ksystraycmd gkrellm";
PROG[2]="ksystraycmd wish /opt/Kästle/Fernbedienung.tcl";
PROG[3]="kopete";

while [ `ps aux | grep /opt/kde3/bin/kicker | grep -v grep | wc -l` -eq 0 ]; do sleep 1; done; 

for (( i=0; i <= 3; i++ ));
  do
    if [ $i -gt 0 ]; then
      j=`expr $i - 1`;
      while [ `ps aux | grep ${PROG[$j]} | grep -v grep | wc -l` -eq 0 ]; do sleep 1; done; 
    fi;
    if [ `ps aux | grep ${PROG[$i]} | grep -v grep | wc -l` -eq 0 ]; 
      then ${PROG[$i]} & 
    fi;
    sleep 1;
done;
Ungetestet !!!
 
:oops: - Ich sag ja dass ich immer was übersehe :lol:

Vielen Dank für die Erklärung! Ich zieh alles zurück und schließ mich dir an: der längere Befehl ist jedes Zeichen wert!

PS: Das "Problem" an sich hat nix mit Pipes zu tun aber ihm war anscheinend neu wie die Befehle (die Bedingungen in der while Schleife) in deinem obigen Skript verknüpft wurden.
 
boa - lasst mich da mal kurz n bissl durchsteigen - ich hab mir den Link jetzt noch nicht komplett angeschaut - weder den, den ich von B3||er hab ;) noch den von dir Blackscreen den hab ich noch garnicht angeschaut - (es sei denn es ist der selbe wie von B3ll3r? - aber:

Dann wird es doch langsam Zeit sich mal mit der bash zu beschäftigen.
Stimmt! hast recht! Bin ja auch schon ein bissl dabei - "learning by doing" liegt mir ein bissl mehr.

Aber B3ll3r - ich kenn das Programm "psaux" schlicht nicht - bzw hab es noch nie bewusst verwendet - deswegen habe ich warscheinlich keinen Bezug zur Funktionsweise oder geschweige denn den Befehl gesehen?

Und du weisst als anfängerschritte hab ich mich ein bissl mit TCL/TK rumgeschlagen und versucht bash reinzufrickeln ----- ;)

Ich brauch einfach Zeit - verzeiht mir meine Nubheit bitte!

ist "wc" auch ein Programm oder ist das ein Script widget? - Verstehst du meine Problematik? Und ich versteh beim Bashscripten auch noch nicht, wann ´` usw zum Einsatz kommen und was bei einem Bashscript im Detail die {} und [] und () und " machen bzw wie diese richtig zu Kombinieren sind. Also das müsste ich mir aufgrund meines Einsteigerfehlers im Vergleich zu TCL/TK anschauen, damit ich das raffe.

Aber die wc usw hast du auch in dem Script verwendet, den du mir super netter Weise für den Sendersuchlauf gemacht hast - danke nochmal an dieser Stelle - da steig ich hoffentlich irgendwann besser durch.

Bzw ich glaube ich hab schwierigkeiten BASH befehle von irgendwelchen widgets zu unterscheiden - .

Das mit Ksystraycmd ist aber genau mein problem bzw könnte das eigendlich ein Bug vom Kicker sein meiner Meinung nach - bei mir läuft ja eben Kicker und nicht trayer - und das mit kdeinit wusste ich auch nicht -

Jedenfalls aufgrund eben des komischen ksystraycmd Verhalten hab ich den Script so gemacht, dass er eben dieses Fehlverhalten aus dem Autostart nicht hat. Ist leider nicht sauber aber es funktioniert - also ich gehe davon aus, bin noch nicht so intensiv zum Austesten gekommen.

&& Hat bei mir nicht funktioniert, weil Die Befehle dann nur nach dem Schliessen des gestarteten Programms eben weitergemacht haben und wenn ich die | - pipe verwendet habe, dann wurden alle Programme gleichzeitig ausgeführt unabhängig von der Schleife - also der Effekt der schleife bzw Sleep wurde durch die Art und weise wie ich die | angewendet hatte überbrückt? Und alles wirr sofort gestartet. Was eben nicht der gewünschte Effekt ist. Sonst könnte ich ja gleich wieder normale Autostartlinks anlegen.

Und ich bin einfach kein vollprofi das ich sowas verstehe:
for (( i=0; i <= 3; i++ ));
Ich hab sowas einfach noch nie gelernt - da finde ich nichtmal einen logischen Ansatz anhand dessen ich mir die Zeile erklären könnte. Tut mir leid ich bin zu schlecht --- das ist zu Pro! :)

Danke nochmal an alle - @ B3ll3r ich werd deines aber noch versuchen -

also ich hab kein Abitur in sachen Programmierung - auch, wenn es der Bash zugrunde liegt und es im Grunde ganz einfach ist - ist es bestimmt.

Aber was ich Super fände!:

Es muss ja beim KDE eine Meldung geben die sagt (irgendeine) "Jetzt ist die gesamte Arbeitsfläche aufgebaut und der CPU ausgelastet" - wenn ich diese ausgabe für "pidof" einbinden könnte, dann wäre alles gelöst, weil ich eben die Schleife dann eben nicht so verunstalten müsste um ksystraycmd auszusortieren - ? Hilfe? Weiss das jemand? Idee?

Also der Script ist quasi einfach nochmals nur funktionell auch wenn hässlich und obendrein warscheinlich noch - relativ genau auf die Rechenpower und die Arbeitszeit meines Startvorgans zugeschnitten :)

Also für andere schätzungsweise gänzlich ungeeignet - diese sollten eine saubere Lösung verwenden.

Dabei komm ich eben dem persönlichen Argument diese hatte glaube ich auch Blackscreen auszudrücken versucht - nahe.

Was aber nicht heissen soll, das die Ansätze von B3ll3r oder irgendjemand unsauber sind!

Bei B3ll3r Versteh ich es wieder so - das ist einfach berufung eigendlich.
Meine Meinung dazu ich hoff ich steig niemand auf den Schlipps ;)

Also ich versuche zu sagen, das mir eh bewusst ist, dass ich einen alternativen weg gehen musste, weil ksystraycmd ein Problem ist. Aber auch ein Feature auf das ich auf keinen Fall verzichten möchte.

Und es gibt einfach Bereiche, da muss auf bestimmte richtigkeiten geachtet werden und ich find es super wenn leute das machen.

Bei mir muss man auch immer sagen, ob man von einem Drucker oder einem Drucker redet.

Danke nochmal das ihr euch so darauf einlasst find das ganz super :)

und hier nochmal um die ksystraycmd Problematik zu veranschaulichen:
B3ll3r s Version ist leider nicht lauffähig? Keine Fehlermeldung und wird aber ausgeführt -

Mit meiner ersten Version von Oben, die halbwegs sauber aussah -:
http://www.pic-upload.de/view_10.03.07/m8zhsy.jpg.html
Und mit der 2. Version, die meiner Meinung nach bisher immernoch funktioniert auch wenn nicht sauber vom Aufbau her:
http://www.pic-upload.de/view_10.03.07/r9r8f.jpg.html

Ich glaube das erklärt das ksystraycmd Problem ganz gut, auch wenn die Bilder sau klein sind.

Gruss

R
 
b3ll3roph0n schrieb:
Code:
if [ `ps aux | grep $1 | grep -v grep | wc -l` -gt 0 ]; then
[...]
Letztendlich gefällt mir die zweite Variante besser, weil ich damit die Rückgabe des Tests (ps aux ....) besser kontrollieren kann
Wenn ich kurz etwas besserwisserisch sein darf: Meiner Ansicht nach würde Variante 2 wesentlich kürzer und trotzdem lesbarer werden, wenn man kodieren würde:
Code:
if ps aux | grep -v grep | grep -q $1
then
  echo "true"
fi
Mit RegExp könnte man sich sogar das "grep -v" sparen ...
 
habs jetz ganz anders gelöst zwar aber die Lösungen funktionieren bestimmt alle irgendwie ;)

Hab mir wiedermal mit TCL/TK Ein kleines 2 knöpfe Fensterchen für den Autostart gebaut welches
:::1x Fireup in Grün
:::und
:::1x STOP in Rot
Als Knopf anbietet ---
dieses startet dann den Autostartscript -- dann kann ich den Autostart auslösen mit einem Klick wenn ich nix mehr knattern hör oder auch garnicht -- kann ja sein ;)

Das dingens hab ich Fireupstarter usw benannt, weils im Beryl so schön gebrannt hat ;)

Dazu den Firestarter im Autostart verknüpft:
Der Befehl für die Verknüpfung lautet:
Code:
wish /opt/Firestart/fireupStarter.tcl

Das ist der Firestarter:
Die Datei heist "fireupstarter.tcl" und liegt bei mir in "/opt/Firestart/"
Code:
#!/bin/sh
# the next line restarts using wish \
exec wish "$0" "$@"
### Ein einfaches aus knöpfen bestehendes Fenster mit der Frage ob bestimmte Programme gestartet werden sollen.
### Fenstereigenschaften
wm title . "Firestarter"
wm resizable . 0 0
### Rahmen
frame .rahmen -borderwidth 1 -relief raised
pack .rahmen -side top -fill x -fill y -expand true
frame .rahmen1 -borderwidth 1 -relief raised
pack .rahmen1 -side top  -fill x -fill y -expand true
### Knopf zum Autostart auslösen
button .1  -width "28" -text "Fire Up!" -foreground #30a453 -command { exec /opt/Firestart/fireupV1.sh & }
pack .1 -fill x -fill y -expand true -side left -in .rahmen
### Knopf Abbrechen
button .2 -width "28" -text "STOP" -foreground #bb3737 -command exit
pack .2 -fill x -fill y -expand true -side left -in .rahmen1
# /EOF
Falls es jemand testen will! Die zeile mit dem "exec /opt/ da ist ein ein ungewollter Zeilenumbruch durch die Darstellung im Forum.

Und dieser startet dann "/opt/Firestart/fireupV1.sh" mit folgendem Inhalt:
Code:
#/bin/bash
#### Der Fireup V1
PENN="sleep 3"
BOINC="/home/boinc/BOINC/run_manager"
GKRELLM="ksystraycmd gkrellm"
KAESTLE="ksystraycmd wish /opt/Kästle/Fernbedienung.tcl"
MESSI="kopete"
KILL="killall wish"
#### Auf Kicker warten!
while ! [ `pidof kicker` ]
do
     sleep 5
done
#### Auf kdeinit warten!
while ! [ `pidof kdeinit` ]
do
     sleep 5
done
# Kurz "wish" killen Und BOINC Gkrellm2 Fernbedienung und Kopete
# starten. 
#  wish wird gekillt damit firestarter beendet wird  bei Druck auf Fireup --
$KILL &
$BOINC &
$PENN
$GKRELLM &
$PENN
$KAESTLE &
$PENN
$MESSI &
## /EOF!
So komm ich super klar ;)

Gruss

R
 
Oben