[gelöst] bash: Ausgabe eines Hintergrundprozesses, kdialog

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
detix
Beiträge: 1743
Registriert: 07.02.2007 18:51:28
Wohnort: MK

[gelöst] bash: Ausgabe eines Hintergrundprozesses, kdialog

Beitrag von detix » 09.09.2012 18:04:42

Problembeschreibung:
für mein Debian-NAS (an anderer Stelle im Forum beschrieben) habe ich eine Warteschleife (5min) programmiert,
die einen erfolgreichen ping erwartet (NAS ist bereit) um dann ein backup durchzuführen.
Um dies auch optisch darzustellen gibt es einen kdialog Hinweis mit der Möglichkeit abzubrechen:

Code: Alles auswählen

kdialog --title "Debian-NAS" --yes-label Abbruch --no-label weiter --yesno 'Bitte Debian-NAS einschalten! \nWarte maximal 5 Minuten...' && echo $? &
Nur bei "Abbruch" ist $?=0, bei Fenster schließen oder "weiter" nicht.
Dieser dialog wird im Hintergrund durchgeführt, aber wie kann ich den Rückgabewert ($?)
zur weiteren Verwendung in eine Variable schreiben, oder überhaupt auslesen?
Hier scheitere ich bei all meinen Versuchen kläglich!
In der Konsole eingegeben wird brav eine 0 bei "Abbruch" geschrieben, wie komme ich da dran?

edit: eher erledigt als gelöst, Hauptsache es funktioniert 8)
edit2: doch gelöst
Zuletzt geändert von detix am 20.09.2012 10:31:47, insgesamt 2-mal geändert.
Gruß an alle Debianer, und immer daran denken:
Macht ohne Haftung funktioniert nicht!

Cae
Beiträge: 6349
Registriert: 17.07.2011 23:36:39
Wohnort: 2130706433

Re: bash: Ausgabe eines Hintergrundprozesses, hier kdialog

Beitrag von Cae » 09.09.2012 20:02:59

Du verwendest mit && schon eine Verknüpfung, die nur bei Rückgabewert 0 triggert. Was passiert bei

Code: Alles auswählen

(kdialog --foo --bar; echo $?) &
?

Gruß Cae
If universal surveillance were the answer, lots of us would have moved to the former East Germany. If surveillance cameras were the answer, camera-happy London, with something like 500,000 of them at a cost of $700 million, would be the safest city on the planet.

—Bruce Schneier

Benutzeravatar
detix
Beiträge: 1743
Registriert: 07.02.2007 18:51:28
Wohnort: MK

Re: bash: Ausgabe eines Hintergrundprozesses, hier kdialog

Beitrag von detix » 09.09.2012 20:33:04

Im Grunde dasgleiche, nur das jetzt auch die 1 bei "weiter" oder Fenster schließen ausgegeben wird.
Am Liebsten wäre mir ja so eine Konstruktion:

Code: Alles auswählen

Aus=$(kdialog --title "Debian-NAS" --yes-label Abbruch --no-label weiter --yesno 'Bitte Debian-NAS einschalten! \nWarte maximal 5 Minuten...' && echo $?) &
das dann in $Aus der Rückgabewert ($?) steht, das will aber ums Verrecken nicht gelingen.
Gruß an alle Debianer, und immer daran denken:
Macht ohne Haftung funktioniert nicht!

brummer
Beiträge: 181
Registriert: 19.02.2007 19:21:23

Re: bash: Ausgabe eines Hintergrundprozesses, hier kdialog

Beitrag von brummer » 10.09.2012 07:57:46

Vielleicht kannst du das in eine if abfrage packen, ich habe kdialog nicht installiert, aber mit zenity geht das z.b. so:

Code: Alles auswählen

#!/bin/sh

if (zenity --question --text=”Weiter machen?” ); then

echo “ja”

exit 1

fi

echo “nein.”

Benutzeravatar
detix
Beiträge: 1743
Registriert: 07.02.2007 18:51:28
Wohnort: MK

Re: bash: Ausgabe eines Hintergrundprozesses, hier kdialog

Beitrag von detix » 15.09.2012 09:55:08

Weitere Hinweise sind nicht gekommen also geht es so offenbar nicht, bleibt nur der Umweg über eine temporäre Datei.
Hier reicht dann auch ein "touch" aufgrund der &&-Verknüpfung, schließen des dialogs über "pgrep".
Im Groben siehts ungefähr so aus und scheint zu funktionieren:

Code: Alles auswählen

TempDatei=/tmp/$$
kdialog --title Debian-NAS --yes-label Abbruch --no-label weiter --yesno 'Bitte...' && touch $TempDatei &
sleep 1
KdialogPID=$(pgrep -f 'kdialog --title Debian-NAS*')
while [ ! -f $TempDatei ]; do
  ...
  if...
    kill $KdialogPID &>/dev/null
    break
  fi
done
rm $TempDatei &>/dev/null
Vielen Dank euch beiden (@brummer, zenity ist für mich leider keine Alternative)
Gruß an alle Debianer, und immer daran denken:
Macht ohne Haftung funktioniert nicht!

Benutzeravatar
detix
Beiträge: 1743
Registriert: 07.02.2007 18:51:28
Wohnort: MK

Re: [erledigt] bash: Ausgabe eines Hintergrundprozesses, kdi

Beitrag von detix » 20.09.2012 10:29:16

Und es geht doch!
Hier habe ich den entsprechenden Ansatz gefunden:
http://stackoverflow.com/questions/1570 ... -processor
ohne Umweg über eine temporäre Datei und dürfte auch für andere Hintergrundprozesse gelten
wenn man nur den entsprechenden Rückgabewert ($?) braucht.
Sieht nun grob so aus (zum Testen mit vielen echos):

Code: Alles auswählen

DebianNasIP=192.168.0.150
if ! ping -c 1 $DebianNasIP &>/dev/null; then
  kdialog --title Debian-NAS --yes-label Abbruch --no-label Weiter --yesno 'Bitte...' & KdialogPID=$!
fi
while ! ping -c 1 $DebianNasIP &>/dev/null; do
  sleep 7; #ping selbst dauert bei Misserfolg ~3sek
  ((Wartezeit+=10))
  echo $Wartezeit
  # Das sollte nicht sein:  Wartezeit (5min) abgelaufen -> Ende
  if [ $Wartezeit -ge 300 ]; then
    echo Wartezeit abgelaufen
    kill $KdialogPID &>/dev/null
    kdialog --error 'Debian-NAS ist nicht erreichbar, Ende!'
    exit 1
  fi
  # Kdialog wird während der Wartezeit geschlossen,
  # sei es durchs Schließen des Fensters oder durch Drücken des Weiter-Knopfes
  # die "ping-Schleife" läuft aber trotzdem weiter solange nicht Abbruch gewählt wurde
  # Hier die Lösung aus obigem Link:
  if ! ps -p $KdialogPID &>/dev/null; then
    echo keine KdialogPID
    wait $KdialogPID
    Aus=$?
    echo Aus: $Aus
    # Abbruch gedrückt, Ende
    if [ $Aus -eq 0 ]; then
      echo Abbruch
      exit 0
    fi
  fi
done
# ping war erfolgreich
kill $KdialogPID &>/dev/null
echo weiter gehts im Skript
Gruß an alle Debianer, und immer daran denken:
Macht ohne Haftung funktioniert nicht!

Antworten