Willkommen Gast. Bitte einloggen oder registrieren. Haben Sie Ihre Aktivierungs E-Mail übersehen?
20.09.2018, 19:01:34

.
Einloggen mit Benutzername, Passwort und Sitzungslänge


Autor Thema: [gelöst]  Aufgabe: mount; caja starten; warten bis caja bendet ist, dann umount  (Gelesen 385 mal)

0 Mitglieder und 1 Gast betrachten dieses Thema.

LM MATE 18.3

Hallo Zusammen,

ich möchte für meine Frau eine komfortable Möglichkeit schaffen, Dateien in einem bestimmten Directory am NAS zu bearbeiten. Aber ohne, dass das NAS dauernd gemounted ist.
Also z.B. ein Skript, das
1.) den NAS mounted
2.) caja (mit Focus auf dem gewünschten Ordner) aufruft
3.) auf das Beenden von caja wartet
4.) den NAS wieder umounted

Ich hab' das ganze in ein Skript gepackt, aber das funktioniert so nicht. Nachdem caja wohl als separater Prozess (fork?) gestartet wird, läuft das Skript nach dem Start von caja sofort weiter und führt das umount aus. Ich hab jetzt zwar einen caja offen, aber mit einem leeren Odner.

Wenn ich das ganze in zwei Skripts (mount+caja und umount) aufteile, dann funktioniert das ganze wunderbar - ist an sich ja auch recht einfach. Aber man muss halt nach der Arbeit das umount-Skript aufrufen, was dann wieder nicht so komfortabel ist und wohl meist vergessen wird.

Ich hab' über die pid $! versucht da ran zu kommen, aber da stochere ich irgendwie mit der Stange im Nebel. Ich hab' das System mit Prozessen und dessen Abkömmlingen wohl noch nicht verstanden.  :(

Gibt es eine Möglichkeit, in einem Skript auf das Beenden von genau diesem caja zu warten und dann erst weiter zum umount zu gehen?


« Letzte Änderung: Heute um 10:45:06 von Willy »

bash ist ein Kommandointerpreter mit programmierbaren Fähigkeiten. Es lohnt sich damit vertraut zu machen wenn man scripte schreiben will:
bash --help
man bash
info bash

Jaaaaa ::),

aber zum Lesen lernen nimmt man auch nicht gleich die Bibel zur Hand.

Ein kleiner Hinweis eines Wissenden könnte mir helfen, die richtige Stelle in der Doku zu finden.
Wenn der Hinweis aber daraus besteht, die man pages zu lesen, dann wäre dieses Forum komplett für die Katz. :(


Hi :)
wenn der thread in scripting verschoben wird (wurde) poste ich mal was dazu..

hast du irgendwelche programmier kenntnisse.. erfahrungen mit cms's / bat's unter DOS (win$)
das wäre allerdings die vorraussetzung.

Ich hab' über die pid $! versucht da ran zu kommen, aber da stochere ich irgendwie mit der Stange im Nebel.
Sollte einfach mit wait $! funktionieren, ich habe aber kein Caja und kann es nicht selber testen. Also ein Schuss ins Blaue:
mount ...
caja pfad/zum/ordner &
wait $!
umount ...

Wenn es so nicht funktioniert, bekommt man die Pid von Caja auch mit ps heraus.

Ich überlege ja schon seit gestern Abend, wie man es hinbekommen kann. Der Trick, so denke ich, liegt darin, dass caja auch den Desktop managt, d. h. schon mit der grafischen Anmeldung geladen wird. Mit jedem neuen Fenster von caja ändert sich nichts an der PID und die bleibt auch erhalten, wenn Fenster wieder geschlossen werden.
Zitat
cli@mate ~ $ pidof caja
10718
cli@mate ~ $ caja Schreibtisch
cli@mate ~ $ pidof caja
10718
cli@mate ~ $

Ein Ansatz mit wmctrl, das gehört schon zum Installationsumfang bei LM 17.x und 18.x. Ich bleibe in meinem Beispiel bei "Schreibtisch".

Zitat
cli@mate ~ $ watched=$(wmctrl -l | awk '/Schreibtisch/ {print $1}')
cli@mate ~ $ echo $watched
0x01400c42
cli@mate ~ $ wmctrl -l | grep $watched
0x01400c42  0 mate Schreibtisch
cli@mate ~ $ while true; do if [ "x$(wmctrl -l | grep $watched)" = "x" ]; then echo "Fenster wurde geschlossen"; break; else echo "Fenster ist noch offen"; sleep 3; fi; done
Fenster ist noch offen
Fenster ist noch offen
Fenster wurde geschlossen
cli@mate ~ $
Das kann man im fertigen Skript natürlich schön umbrechen und einrücken.
« Letzte Änderung: 17.09.2018, 19:54:25 von CLImate »

@ehtron: Vielen Dank für den Hinweis zur Kategorie, die hatte ich überlesen. Ich hab' zwar gesucht, aber meine Frau würde wieder sagen: Männer... ;)
Und ja, ich hab Programmiererfahrung, von CP/M80 über VAX, NT und Shark bis zu Interrupt-Treibern - aber eben nicht unter Linux. Deswegen muss ich meist mit einem Hinweis auf den Weg gebracht werden und bin dafür aber auch sehr dankbar :D

@Nessie: So hatte ich's probiert, aber das funktioniert leider nicht (wohl weil caja nur eine weitere Instanz eines schon laufenden Prozesses ist)

@CLImate: Auf so einen Hinweis habe ich gewartet - Danke! Das werde ich mal in mein Skript nehmen und ausprobieren. ;D

Hi :)
verfolge mal die bisherigen vorschläge.. sind im detail sogar besser als mein weg.... ;)

wollte nur wissen ob du überhaupt mal scripting betrieben hast... ohne die grundlagen, egal unter welchem os..., ginge es nicht ;)

Jaaaaa ::),

aber zum Lesen lernen nimmt man auch nicht gleich die Bibel zur Hand.

Ein kleiner Hinweis eines Wissenden könnte mir helfen, die richtige Stelle in der Doku zu finden.
Wenn der Hinweis aber daraus besteht, die man pages zu lesen, dann wäre dieses Forum komplett für die Katz. :(

das hast du sehr gut erkannt...... genau so sehe ich das auch

Also grundsätzlich läuft es jetzt (was aber aufgrund der Vorarbeit von CLImate auch zu erwarten war).

Mein Skript heißt "Lesen-AN-und-ABmelden" und sieht so aus:
#!/bin/bash

# in eine eigene Datei loggen:
Logdatei=~/user.log
US="User:$USER Skript:$0"

#dieses Skript meldet den übergebenen Zweig am ReadyNAS Laufwerk an und öffnet einen caja-file-Manager, wartet auf das Ende von caja und meldet dann das ReadyNAS Laufwerk wieder ab

Gesamtpfad=/mnt/willy/$1
Zweig=$1

echo Gesamtpfad \=$Gesamtpfad
echo Zweig \=$Zweig

echo $(date '+%d %b %Y %H:%M:%S') $US mount $Gesamtpfad >> ~/user.log 2>&1
mount $Gesamtpfad >> ~/user.log 2>&1
paplay /usr/share/sounds/purple/login.wav

echo $(date '+%d %b %Y %H:%M:%S') $US caja $Gesamtpfad >> ~/user.log 2>&1
caja $Gesamtpfad >> ~/user.log 2>&1

while [ -z $watched ]
do
    sleep 0.5
    #watched=$(wmctrl -l | awk '/$Zweig/ {print $1}') #geht nicht
    #watched=$(wmctrl -l | awk '/ENVIRON["Zweig"]/ {print $1}') #geht nicht
    watched=$(wmctrl -l | awk '/Lesen/ {print $1}') #nur wenn ich den Zweig direkt reinschreibe, dann geht's
    echo watched \=$watched
done

while true
do
    if [ "x$(wmctrl -l | grep $watched)" = "x" ]
    then
        echo "Fenster wurde geschlossen"
        break;
    else
        echo "Fenster ist noch offen"
        sleep 5
    fi
done


echo $(date '+%d %b %Y %H:%M:%S') $US umount $Gesamtpfad >> ~/user.log 2>&1
umount $Gesamtpfad >> ~/user.log 2>&1
paplay /usr/share/sounds/purple/logout.wav

exit 0

Beim Aufruf übers Terminal sieht es so aus:
willy@willy-H81H3-EM2 ~ $ Lesen-AN-und-ABmelden Lesen
Gesamtpfad =/mnt/willy/Lesen
Zweig =Lesen
watched =
watched =
watched =0x01a0939a
Fenster ist noch offen
Fenster ist noch offen
Fenster ist noch offen
Fenster ist noch offen
Fenster wurde geschlossen
willy@willy-H81H3-EM2 ~ $

Nur ein Problem hab' ich dabei noch. Ich möchte die ans Skript übergebene Umgebungsvariable $1=$Zweig an awk weitergeben - habe es aber nicht hinbekommen (siehe auskommentierte Zeilen #watched=...)

Wie bringe ich die von einem Environment ins andere?
Hat da jemand eine Idee?

Richtig mit einfachen und doppelten Anführungszeichen ausquoten, damit die Shell auch ersetzen kann:
awk '/'"$Zweig"'/{print $1}'

Klasse und danke, jetzt funktioniert es wie gewünscht :D

Das Ganze ist zwar noch nicht ganz wasserdicht, weil Fenster, die den Laufwerksnamen in der Fensterbezeichnung tragen (z.B. ein Texteditor-Fenster der die Datei "Lesen-an-und-abmelden.sh" geöffnet hat) auch erkannt werden und so die Vorgehensweise torpedieren. Aber ich habe dabei wieder einige Sachen gelernt und kann da selbst weiter dran arbeiten.

Ein SUPER Forum - Danke!  ;D

PS: Ach ja, noch was. ehtron hat mich oben darauf hingewiesen, dass ich den Thread im falschen Forumsbereich gestartet habe - der gehört an sich in "Scripting". Kann ich den als Initiator selbst verschieben oder macht das der Moderator sobald er es bemerkt oder muss ich ihn darauf hinweisen oder was muss ich tun?
« Letzte Änderung: Heute um 10:51:59 von Willy »