ubuntuusers.de

script beenden

Status: Gelöst | Ubuntu-Version: Kein Ubuntu
Antworten |

Kelhim

Avatar von Kelhim

Anmeldungsdatum:
18. September 2006

Beiträge: 3642

Wohnort: Köln

Um die Distributionsangabe zu korrigieren, was nun erfolgt ist.

Könntest du dann die entsprechende Stelle im zweiten Skript plus ein bisschen Kontext zeigen? Ich finde es schwierig, das alleine mit Fließtext zu lösen.

ewuthrt

(Themenstarter)

Anmeldungsdatum:
31. Juli 2014

Beiträge: 71

Das Passiert in Myskript. Es wird eine Datei erstellt, in der die Widergabedateien festgelegt sind. Sie bilden dann ein Array. Mit n wird dieses Array von links nach rechts abgearbeitet. Wenn in in diesem Array Bezeichnungen wie "videofile", "audiofile", "picturefile" auftauchen, sollen sie wiedergegeben werden mit omxplayer für Audio- und Videodatein und einem Bildprogramm für Bilder. Es handelt sich um ein reines Abspielen dieser Sachen.

Abspielskript

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#Spiele Datein ab
while (( ++n <= $i ))
 do
  #Videos werden abgespielt:
  if [ "${filename[n]}" == "videofile" ]
   then
    omxplayer -b ${ordner[n]} < /tmp/cmd"$n" &
    echo -n p > /tmp/cmd"$n" & 
    sleep $delay
    echo -n p > /tmp/cmd"$n" &
    $timestamp >> $output 
    sleep ${dauer[n]}
    echo -n q > /tmp/cmd"$n" &
    $timestamp >> $output 

  #Audiodateien werden abgespielt:
  else 
   if [ "${fileiname[n]}" == "audiofile" ]
    then
     omxplayer -b ${ordner[n]}
     echo -n p > /tmp/cmd"$n" & 
     sleep $delay
     echo -n p > /tmp/cmd"$n" &
     $timestamp >> $output &
     sleep ${dauer[n]}
     echo -n q > /tmp/cmd"$n" &
     $timestamp >> $output 
  
  #Bilder werden angezeigt:   
  else
   if [ "${filename[n]}" == "picturefile" ]   
    then
     $image ${pfad[n]} < /tmp/cmd"$n" &
     echo . > /tmp/cmd"$n" & 
     sleep $delay
     echo -n s > /tmp/cmd"$n" &
     $timestamp >> $output &
     sleep ${dauer[n]}
     echo -n q > /tmp/cmd"$n" &
     $timestamp >> $output

   fi
  fi
 fi
done 

Das ist mein Tasterskript

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
state=0
while true; do
  pin=$(cat /sys/class/gpio/gpio4/value)
  if [ $pin -eq 0 -a $state -eq 0 ]; then
    state=1
    Abspielskript&
    pid=$!
  fi
  if [ $pin -eq 1 -a $state -eq 1 ]; then
    state=2
  fi
  if [ $pin -eq 0 -a $state -eq 2 ]; then
    state=3
   #kill $pid
   echo "0"
  fi
  if [ $pin -eq 1 -a $state -eq 3 ]; then
    state=0
  fi
  sleep 1
done

Ich drücke den Knopf und das Abspielskript (s.oben) wird ausgefühert.

Dafür ist folgende Zeile da:

1
2
3
4
5
if [ $pin -eq 0 -a $state -eq 0 ]; then
    state=1
  
   myscript&
   pid=$!

Drücke ich den Knopf nochmal

1
2
3
4
if [ $pin -eq 0 -a $state -eq 2 ]; then
    state=3
   kill $pid
 

soll das Abspilen gestoppt werden. Nur funktioniert es nicht. Videos und Audios werden einfach weiter abgespielt.

Weder

1
kill $pid

noch

1
pkill omxplayer 

hilft.

P.S bevor myscript startet, checke ich noch mit

1
ps -C myscript.sh &>/dev/null || $myscript

ob, my script schon gestartet wurde. Wenn nicht, dann soll es starten.

Kelhim

Avatar von Kelhim

Anmeldungsdatum:
18. September 2006

Beiträge: 3642

Wohnort: Köln

Okay, das macht es leichter nachzuvollziehen, aber noch besser wäre es, wenn du einfach das Original zeigen würdest anstatt mehrere Versionen desselben Abschnitts im selben Beitrag:

ewuthrt schrieb:

1
2
3
    state=1
    Abspielskript&
    pid=$!
1
2
3
4
    state=1
  
   myscript&
   pid=$!

P.S bevor myscript startet, checke ich noch mit

1
ps -C myscript.sh &>/dev/null || $myscript

ob, my script schon gestartet wurde. Wenn nicht, dann soll es starten.

Also eigentlich sieht es bei dir so aus?

1
2
3
4
5
6
7
8
9
state=0
while true; do
  pin=$(cat /sys/class/gpio/gpio4/value)
  if [ $pin -eq 0 -a $state -eq 0 ]; then
    state=1
    ps -C myscript.sh &>/dev/null || myscript &
    pid=$!
  fi
[...]

In dem Fall sollte die Variable pid nicht die PID von myscript speichern, sondern die von ps -C myscript.sh &>/dev/null || myscript. Das Skript myscript wird dann von kill gar nicht beendet.

Ich probiere das so:

ps -C xterm || xterm 

Beim ersten Mal findet es keine xterm-Instanz und startet mir daraufhin eine solche. Beim zweiten Aufruf zeigt es mir nur Folgendes an:

 PID TTY          TIME CMD
 6220 pts/0    00:00:00 xterm

[3]+  Fertig                  ps -C xterm || xterm

Weniger elegant wie || ist folgendes Konstrukt:

1
2
3
4
5
if ! ps -C xterm
then
xterm &
pid=$!
fi

Das funktioniert und speichert wirklich die PID von xterm. Vielleicht kannst du das entsprechend anpassen.

ewuthrt

(Themenstarter)

Anmeldungsdatum:
31. Juli 2014

Beiträge: 71

Hier kann man die ganze Version finden http://pastebin.com/6Piqgay1

Also muss das dann so aussehen?

1
2
3
4
5
6
7
8
9
state=0
while true; do
  pin=$(cat /sys/class/gpio/gpio4/value)
  if [ $pin -eq 0 -a $state -eq 0 ]; then
      if ! ps -C xterm
      then xterm&
      state=1
      pid=$!
  fi

Verstehe ich nicht ganz, statt xterm soll ich aber

1
myscript

hinschreiben oder?

Kelhim

Avatar von Kelhim

Anmeldungsdatum:
18. September 2006

Beiträge: 3642

Wohnort: Köln

Ja, xterm diente mir nur als Testprogramm, weil ich dein Skript nicht hatte. Wenn du diese Befehle nimmst:

ps -C myscript.sh &>/dev/null || myscript &
pid=$!

… wird die Variable pid die PID von ps -C myscript.sh &>/dev/null und nicht von myscript speichern. Das wollte ich mit meinem Test zeigen.

Meine einfache Version mit if hingegen speichert die PID nur dann, wenn wirklich das Programm gestartet wird. Du kannst das auch selber mit xterm ausprobieren.

Deine Version (wichtige Stellen markiert):

[foo@bar ~]$ ps -C xterm || xterm &
[1] 5422
[foo@bar ~]$   PID TTY          TIME CMD

[foo@bar ~]$ echo $!
5422
[foo@bar ~]$ ps -C xterm || xterm &
[2] 5438
[foo@bar ~]$   PID TTY          TIME CMD
 5424 pts/1    00:00:00 xterm

[2]+  Fertig                  ps -C xterm || xterm
[foo@bar ~]$ echo $!
5438
[foo@bar ~]$ ps -C xterm || xterm &
[2] 5440
[foo@bar ~]$   PID TTY          TIME CMD
 5424 pts/1    00:00:00 xterm

[2]+  Fertig                  ps -C xterm || xterm
[foo@bar ~]$ echo $!
5440

Ergebnis: Es wird immer eine andere PID gespeichert, obwohl die PID von xterm natürlich gleich bleibt.

Meine Version:

[foo@bar ~]$ if ! ps -C xterm; then xterm & pid=$!; fi
  PID TTY          TIME CMD
[1] 5336
[foo@bar ~]$ echo $!
5336
[foo@bar ~]$ 
[1]+  Fertig                  xterm
[foo@bar ~]$ if ! ps -C xterm; then xterm & pid=$!; fi
  PID TTY          TIME CMD
[1] 5362
[foo@bar ~]$ echo $!
5362
[foo@bar ~]$ if ! ps -C xterm; then xterm & pid=$!; fi
  PID TTY          TIME CMD
 5362 pts/1    00:00:00 xterm
[foo@bar ~]$ echo $!
5362

Ergebnis: Die PID bleibt immer gleich, nämlich die von xterm.

Und damit dein Programm korrekt funktioniert, muss die PID immer die der laufenden myscript-Instanz sein, nicht die von ps -C myscript.sh.

ewuthrt

(Themenstarter)

Anmeldungsdatum:
31. Juli 2014

Beiträge: 71

Ok, verstehe Also muss ich nicht so

1
ps -C myscript.sh &>/dev/null || myscript &

hinschreiben, sondern

so

1
if ! ps -C myscript; then myscript & pid=$!; fi

Aber warum, wenn ich auf den Knopf drücke, werden nicht Videos abgespielt, sondern es erscheint nur diese Zeile

1
PID TTY          TIME CMD

Normalerweise kommt die, wenn ich -ps in die Console schreibe.

Kelhim

Avatar von Kelhim

Anmeldungsdatum:
18. September 2006

Beiträge: 3642

Wohnort: Köln

Es war ja ein vereinfachtes Beispiel – wenn du die ps-Ausgaben nicht sehen willst, fügst du &>/dev/null hinzu:

1
if ! ps -C myscript &>/dev/null; then myscript & pid=$!; fi

ewuthrt

(Themenstarter)

Anmeldungsdatum:
31. Juli 2014

Beiträge: 71

Ok, danke schon mal für gute Tipps, muss das erstmal so probieren. Habe kein RasPi grade da.

ewuthrt

(Themenstarter)

Anmeldungsdatum:
31. Juli 2014

Beiträge: 71

Also so sieht jetzt mein Code aus. Mit

1
kill $pid 

ist gemeint, dass der Prozess sofort beendet wird? Folgendes passiert: Drücke ich auf den Knopf sehe ich zuerst

1
2
3
	

PID TTY          TIME CMD

dann startet das Myscript, Dateien werden abgespielt. Drücke ich noch mal, wartet der Omxplayer, bis die grade laufende Datei zu Ende abgespielt wird und beendet dann. Dies passiert allerdings, wenn ich drücke, wenn nur die erste oder zweite Datei läuft. Wenn ich drücke, wenn die dritte, vierte usw Datei abgespielt wird, dann pasiiert nichts. Ist da noch im Code ein Fehler drin?

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#!/bin/bash

gpio=4
echo "$gpio" > /sys/class/gpio/export
echo "in" > /sys/class/gpio/gpio"$gpio"/direction
timestamp=/home/pi/folder/time
projekt=/home/pi/folder/myscript.sh
output=/home/pi/folder/files/output.txt

state=0
while true; do
 wert=$(cat /sys/class/gpio/gpio4/value)

if [ $wert -eq 0 -a $state -eq 0 ]; then
    state=1

$timestamp >> $output &

if ! ps -C projekt.sh &>/dev/null; then $projekt & pid=$!; fi

  fi
  if [ $wert -eq 1 -a $state -eq 1 ]; then
    state=2
  fi
  if [ $wert -eq 0 -a $state -eq 2 ]; then
    state=3
   
 kill  $pid

  fi
  if [ $wert -eq 1 -a $state -eq 3 ]; then
state=0
  fi
 sleep 1
done

ewuthrt

(Themenstarter)

Anmeldungsdatum:
31. Juli 2014

Beiträge: 71

1
kill -9 

hilft auch nicht. ☹

Kelhim

Avatar von Kelhim

Anmeldungsdatum:
18. September 2006

Beiträge: 3642

Wohnort: Köln

An dem Befehl stören mich jetzt noch zwei Sachen:

  1. Warum ps -C projekt.sh? Wenn du dein myscript-Skript startest, lautet der Prozessname doch ganz sicher nicht projekt.sh, oder? Du kannst das leicht prüfen, indem du myscript startest und dann in einer Prozessüberwachung nachguckst (zum Beispiel Systemmonitor in Ubuntu und Gnome). In den ps-Befehl gehört der eigentliche Prozessname.

  2. Ich würde den Befehl so schreiben, damit es einheitlicher mit deinem restlichen Code aussieht:

1
2
3
if ! ps -C projekt.sh &>/dev/null; then
$projekt & pid=$!
fi

Und wenn du schon Leerzeichen am Zeilenanfang benutzt, um den Code leichter lesbar zu machen, dann solltest du das auch konsequent und richtig umsetzen. Dein erster if-Block hat Kraut-und-Rüben-Einrückungen. 😉 Ich würde den Block so schreiben:

1
2
3
4
5
6
7
  if [ $pin -eq 0 -a $state -eq 0 ]; then
      if ! ps -C PROZESSNAME &>/dev/null; then
          $projekt &
          pid=$!
          state=1
      fi
  fi

Auf diese Weise siehst du leicht, welches fi zu welchem if gehört. Den Rest seh ich mir später noch einmal an, wenn ich deine Fehlerbeschreibung noch einmal gelesen habe.

ewuthrt

(Themenstarter)

Anmeldungsdatum:
31. Juli 2014

Beiträge: 71

Ja, das heißt myskript.sh. Hatte aber auch andere Namen gehabt, aber dann überall einhetlich. Daran liegt es nicht. Kann einfach nicht verstehen, wieso kill mich hier nicht weiter bringt.

Kelhim

Avatar von Kelhim

Anmeldungsdatum:
18. September 2006

Beiträge: 3642

Wohnort: Köln

Leite die Ausgabe des kill-Befehls doch mal in eine error.txt aus:

1
kill $pid &>error.txt

Dann kannst du nachlesen, was da überhaupt passiert. Wenn der Befehl nur die Bedienungshilfe ausspuckt, ist die PID nicht (mehr) vergeben.

Außerdem könntest du direkt nach pid=$! und vor dem kill-Befehl beide Male $pid anzeigen lassen, um die PID zu vergleichen:

1
echo $pid

ewuthrt

(Themenstarter)

Anmeldungsdatum:
31. Juli 2014

Beiträge: 71

Also

1
kill $pid &>error.txt 

erzeugt zwar eine Datei, aber die ist leer.

Ok einmal sehe ich

1
5162

und beim Drücken kommt nocheinmal

1
5162

track

Avatar von track

Anmeldungsdatum:
26. Juni 2008

Beiträge: 7174

Wohnort: Wolfen (S-A)

Na ja, das ganze ist doch ein ziemliches Stochern im Nebel ...

Kläre doch mal bitte zuerst mal die Verhältnisse mit Hand.

  1. Guck Dir zuerst mit ps f -u <deinname> an, welche Prozesse unter Deinem Namen laufen.
    (für <deinname> musst Du natürlich Deinen Login-Namen einsetzen !)

  2. Dann starte den ominösen Player, und führe danach nochmals ein ps f -u <deinname> aus.
    → Welche Prozesse sind genau dazu gekommen ?

  3. Führe auf einer anderen Konsole ein kill <pid_des_players> aus. Was siehst Du auf dieser Konsole ?
    Und: ist hinterher der Player-Prozess weg ? (im ps f -u <deinname> )

  4. Sollte das nicht funktioniert haben, funktioniert es dann mit einem kill -SIGKILL <pid_des_players> ?

Probier das bitte mal so, in kleinen Schritten, per Hand, und verrate uns, welche Meldungen jeweils kommen.

LG,

track