Hi
Eine Motif-Applikation die auf Red Hat ES3 entwickelt wurde lässt sich per Konsole ganz einfach durch ein Shellscript starten ($ ./start_myMotifApp.sh). Vorher muss nätürlich noch ein Shellscript (bash) ausgeführt werden ($ source setup_myScript.sh) das ein paar Umgebungsvariablen setzt, dass wird vorher durch das Startscript erledigt. Alles schön und gut.
Nun will ich auf dem Desktop ( KDE ) einen Link kreieren der diese Applikation startet. Das tue ich wie folgt:
(1) Rechter Mausklick/Create New/Link to Applikation ...
(2) Link to Applikation = myMotifApp
(3) Tab Execute/Command: /bin/bash -norc /home/user/start_myMotifApp.sh; Run in terminal: Yes
- Klicke ich den Link erscheint kurze Zeit (1") einm Terminal und .... Ende.
- Lasse ich "Run in Terminal" weg, kann ich die Applikation starten, von der aus aber nicht auf einen SCSI Device screiben.
- Ändere ich das Start Script wie folgt "funktioniert" es auch mit dem Terminal, allerdings nur auf Zeit:
#
#!/bin/bash -norc
#
source /home/user/setup_myScript.sh
/home/user/myMotifApp
sleep 3600 # Diese Zeile muss ich einfügen und alles ist gut ...
Wieso ist das so? Gibt es da ein Problem zwischen Motif und KDE? Per Konsole funktiniert ja alles bestens, inklusive dem Schreiben auf den SCSI Device.
Wer weiss Rat?
Dank und Gruss,
d-ol
Linux 15.070 Themen, 107.540 Beiträge
Ich habe da keine genaue Ahung, aber ich denke es wird wohl folgendermaßen erklärt werden können:
Wenn ein Anwender ein Shellscript startet, dann wird dieses Shellscipt nicht in der aktuellen Shell gestartet sondern in einer Subshell. Die Shell in die der Benutzer momentan eingeloggt ist, startet selbst eine Subshell und in dieser Subshell läuft dann das eigentliche Shellscript.
Ich habe jetzt aber keine genaue Ahnung warum es nicht funktioniert. Die Umgebungsvariablen müssen mit dem "export"-Befehl der Subshell bekanntgemacht werden. Vielleicht liegt es daran das die Subshell deine Umgebungsvariablen nicht erbt, keine Ahnung.
Hallo KarstenW
Danke das du dich mit meinem Problem befasst hast.
Die Umgebungsvariablen werden alle per export im Setup - Script bekanntgemacht. Es ist so, dass die Linuxkiste, auf der das Programm laufen soll, von CShell auf Bash umgestellt wurde. Mit CShell funktionierte alles wunderbar. Die Shell - Scripts wurden alle umgeschrieben und getestet, auf der Konsole funktioniert es ja schliesslich auch.
Das Problem ist, dass sich das Terminal nach Ausführen des Befehls zum Starten der Applikation sofort wieder schliesst und dadurch alle Kindprozesse (auch myMotifApp) killt. Dies verhindere ich mit sleep 3600, was aber nicht die Lösung sein kann. Bei CShell musste nach dem Befehl zum Starten der Applikation ein exit 0 rein, damit sich das Terminal nach dem Beenden der Applikation schloss. Bash schliesst das Terminal nach ausführen aller Befehle von selbst, obwohl die Prozesse die dadurch gestartet wurden noch aktiv sind.
Tja, nun bin ich auf der Suche nach einem Bash-Befehl der das verhindert.
Gruss, d-oli
Ich kenn die CShell nicht, aber wenn in der CShell alles wunderbar lief, dann schreib doch diese Shellscripte für die CShell.
Die Pseudokommentare am Anfang der Scripte "#!/bin/bash" starten immer die richtige Shell wofür das Script geschrieben wurde.
Wenn du ein Shellscript für die Kornshell schreibst, auch wenn der jeweilige Benutzer die Kornshell nicht als Loginshell benutzt, brauchst du nur als Pseudokommentar "#!/bin/ksh" am Anfang des Scriptes schreiben. Dann wird dieses Shellscript in einer Kornshell ausgeführt (auch wenn der Benutzer die Bash benutzt).
Für die C-Shell mußt du als Pseudokommentar "#!/bin/csh" schreiben (ohne Anführungszeichen). Du mußt natürlich die CShell oder auch die erweiterte CShell auf dem jeweiligen Rechner installieren.
Das ist vielleicht die einfachste Lösung.
Die C-Shell war angeblich schon immer besser für die Shellprogrammierung geeignet. Die Bash ist besser für die Konsole.
Unter linux gibt es nur noch die erweiterte C-Shell, glaub ich jeden falls.
PS.: /bin/csh ist nur noch ein Link auf die erweiterte C-Shell /bin/tcsh auf meinem Rechner.
Es geht auch mit bash ... juhu ... ;-)
Im "Link to Applikation" auf dem Desktop muss folgendes stehen:
Command: /bin/bash | /home/user/start_myMotifApp.sh
Die pipe (|) war der Schlüssel zum Erfolg.
Das Startscript sieht jetzt wie folgt aus:
#!/bin/bash
#
# do not start if myMotifApp allready runs
/sbin/pidof myMotifApp &> /dev/null
if [ $? -gt 0 ]; then
# start app
source /home/user/myMotifApp_setup.sh
echo "******** starting myMotifApp ********"
/home/user/myMotifApp
# check if myMotifApp runs
PID=0
until [ $PID -gt 0 ]; do
sleep 1
/sbin/pidof myMotifApp &> /dev/null
PID=$?
done
fi
# kill the terminal
/sbin/pidof sh
kill -9 $?
d-oli
