ubuntuusers.de

Bash Script, Befehl bei Programmende ausführen?

Status: Gelöst | Ubuntu-Version: Xubuntu 16.04 (Xenial Xerus)
Antworten |

Bratmaxe

Avatar von Bratmaxe

Anmeldungsdatum:
20. Mai 2008

Beiträge: 241

Wohnort: Leipzig

Hallo,

Ich habe mir folgendes zusammengebastelt:

1
2
3
4
5
6
7
8
#!/bin/bash

/usr/bin/gqrx &
if [ "$(pulseaudio-equalizer status | grep "Equalizer status" | cut -d"[" -f2 | cut -d"]" -f1)" == "disabled" ]; then
    pulseaudio-equalizer enable & notify-send -i /usr/share/icons/gnome/48x48/status/dialog-warning.png "Hinweis" "Pulseaudio Equalizer wurde aktiviert!"
else
notify-send -i /usr/share/icons/gnome/48x48/status/dialog-warning.png "Hinweis" "Pulseaudio Equalizer war bereits aktiv!"
fi

jetzt würde ich gern noch hinzufügen das wenn das per Script gestartete gqrx geschlossen wurde auch der pulseaudio-equalizer wieder deaktiviert wird

allerdings finde ich da keine Lösung.

Kann mir da jemand weiterhelfen?

Acer54

Avatar von Acer54

Anmeldungsdatum:
6. Juli 2011

Beiträge: 700

Wohnort: Bayern

Ich habe zwar schon ewig nichts mehr mit Bash gescriptet, aber sollte soetwas nicht mit "wait" funktionieren?

So in etwa:

#!/bin/bash

sleep 10 &
notify-send "Ich schlafe für 10 sec..."

wait
notify-send "Juhu, Backgroundprozess ist beendet..."

Ist das, das Verhalten das du benötigst ?

Bratmaxe

(Themenstarter)
Avatar von Bratmaxe

Anmeldungsdatum:
20. Mai 2008

Beiträge: 241

Wohnort: Leipzig

ich hatte so an die richtung gedacht:

1
2
3
4
5
6
7
if 

Programmende Programm-xyz

then 

pulseaudio-equalizer disable & notify-send -i /usr/share/icons/gnome/48x48/status/dialog-warning.png "Hinweis" "Pulseaudio Equalizer wurde deaktiviert!"

Aber ich muss ja das Script auch noch dazu bekommen zu überwachen ob der gqrx prozess noch läuft...

Bearbeitet von sebix:

Bitte verwende in Zukunft Codeblöcke, um die Übersicht im Forum zu verbessern!

lionlizard

Avatar von lionlizard

Anmeldungsdatum:
20. September 2012

Beiträge: 6244

Wohnort: Berlin

Guck Dir mal die Fortschrittsanzeige für dd an. Dort wird beim Start von dd die pid in eine Variable gespeichert und dann in einer Schleife abgefragt, ob die pid noch aktiv ist.

Ich habe das Ganze nur ungefähr verstanden, aber damit sollte Dein Problem zu lösen sein.

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11267

Wohnort: München

wait akzeptiert optional einen Job bzw. eine PID, wie man mit

info bash wait

erfahren kann:

`wait'
          wait [-n] [JOBSPEC or PID ...]

     Wait until the child process specified by each process ID PID or
     job specification JOBSPEC exits and return the exit status of the
     last command waited for.  If a job spec is given, all processes in
     the job are waited for.  If no arguments are given, all currently
     active child processes are waited for, and the return status is
     zero.  If the `-n' option is supplied, `wait' waits for any job to
     terminate and returns its exit status.  If neither JOBSPEC nor PID
     specifies an active child process of the shell, the return status
     is 127.

Also z.B.:

1
2
3
4
5
6
foo &
FOO_PID=$!

# hier kannst du etwas anderes ausführen

wait $FOO_PID

Acer54

Avatar von Acer54

Anmeldungsdatum:
6. Juli 2011

Beiträge: 700

Wohnort: Bayern

seahawk1986 schrieb:

wait akzeptiert optional einen Job bzw. eine PID, wie man mit

info bash wait

erfahren kann

Müsste ein wait (ohne Argumente) am Schluss eines Scripts, nicht warten bis "alle" gestarteten Prozesse rückgemeldet (exitcode) haben? Bei meinem Beispiel oben ist es so, dass erst die erste Meldung ausgegeben wird, nach 10 Sekunden dann die 2te, was heißt, dass wait auf den Hintergrund-job wartet... Ich würde das auch so aus der man verstehen. ("...If no arguments are given, all currently active child processes are waited for...")

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13219

Acer54 schrieb:

Müsste ein wait (ohne Argumente) am Schluss eines Scripts, nicht warten bis "alle" gestarteten Prozesse rückgemeldet (exitcode) haben?

Das ist halt die Frage. Wenn pulseaudio-equalizer länger läuft, dann will man auf diesen Prozess ggf. nicht warten.

Ich habe gerade kein Linux da um die Ausgabe von pulseaudio-equalizer status anzuschauen. Man kann die Erkennung aber einfacher als im ursprünglichen Skript machen. Eine mögliche Lösung:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
#!/bin/sh

/usr/bin/gqrx &
gprx_pid=$!

if pulseaudio-equalizer status | egrep -q 'Equalizer status.*disabled'; then
  pulseaudio-equalizer enable &
  notify-send -i /usr/share/icons/gnome/48x48/status/dialog-warning.png "Hinweis" "Pulseaudio Equalizer wurde aktiviert!"
else
  notify-send -i /usr/share/icons/gnome/48x48/status/dialog-warning.png "Hinweis" "Pulseaudio Equalizer war bereits aktiv!"
fi

wait $gprx_pid

Bratmaxe

(Themenstarter)
Avatar von Bratmaxe

Anmeldungsdatum:
20. Mai 2008

Beiträge: 241

Wohnort: Leipzig

Hallo,

erstmal vielen Dank an alle.

der Hinweis wait war dann die Lösung, und auch danke für den Tipp mit der Vereinfachung der Erkennung des pulseaudio-equalizer Status

der Vollständigkeit halber das fertige Script:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
#!/bin/sh

/usr/bin/gqrx &
gprx_pid=$!

if pulseaudio-equalizer status | egrep -q 'Equalizer status.*disabled'; then
  pulseaudio-equalizer enable &
  notify-send -i /usr/share/icons/gnome/48x48/status/dialog-warning.png "Hinweis" "Pulseaudio Equalizer wurde aktiviert!"
else
  notify-send -i /usr/share/icons/gnome/48x48/status/dialog-warning.png "Hinweis" "Pulseaudio Equalizer war bereits aktiv!"
fi

wait $gprx_pid

pulseaudio-equalizer disable & notify-send -i /usr/share/icons/gnome/48x48/status/dialog-warning.png "Hinweis" "Pulseaudio Equalizer wurde deaktiviert!"

exit 0

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13219

Bratmaxe schrieb:

erstmal vielen Dank an alle.

Danichfür.

der Hinweis wait war dann die Lösung, und auch danke für den Tipp mit der Vereinfachung der Erkennung des pulseaudio-equalizer Status

Bitte!

der Vollständigkeit halber das fertige Script: [...]

Du kannst natürlich noch etwas die Redundanz reduzieren:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
#!/bin/sh

notify() {
  notify-send -i /usr/share/icons/gnome/48x48/status/dialog-warning.png "$@"
}

/usr/bin/gqrx &
gprx_pid=$!

if pulseaudio-equalizer status | egrep -q 'Equalizer status.*disabled'; then
  pulseaudio-equalizer enable &
  notify 'Hinweis' 'Pulseaudio Equalizer wurde aktiviert!'
else
  notify 'Hinweis' 'Pulseaudio Equalizer war bereits aktiv!'
fi

wait $gprx_pid

pulseaudio-equalizer disable &
notify 'Hinweis' 'Pulseaudio Equalizer wurde deaktiviert!'

exit 0

Meines Erachtens verlierst Du Lesbarkeit, wenn Du den notify-send direkt hinter den Befehl packst, der in den Hintergrund geschickt wird (Zeile 15 in Deiner Version). Das überliest man dann leicht als &&. Und außerdem wird die Zeile dann so lang.

Bratmaxe

(Themenstarter)
Avatar von Bratmaxe

Anmeldungsdatum:
20. Mai 2008

Beiträge: 241

Wohnort: Leipzig

Danke,

die Zeile 15 sollte auch mit Zeilenumbruch sein , hab ich in der Freude das es jetzt so funktioniert wie ich es gerne hätte übersehen ☺

Ansonsten habe ich nur die Befehle die ich z.b. ins Terminal eingegeben hätte, nacheinander abgearbeitet.

bin ja ein Bash-Neuling, muss mich noch einarbeiten.

macht mir aber irgendwie Spaß damit zu arbeiten , vor allem wenn man das Ergebnis erreicht hat was man wollte und sieht was alles machbar ist.

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13219

Bratmaxe schrieb:

die Zeile 15 sollte auch mit Zeilenumbruch sein , hab ich in der Freude das es jetzt so funktioniert wie ich es gerne hätte übersehen ☺

bin ja ein Bash-Neuling, muss mich noch einarbeiten.

Wir haben ja alle mal irgendwo angefangen.

macht mir aber irgendwie Spaß damit zu arbeiten , vor allem wenn man das Ergebnis erreicht hat was man wollte und sieht was alles machbar ist.

👍 Das ist auch die beste Motivation: ein Erfolgserlebnis. ☺

Antworten |