staging.inyokaproject.org

Script soll erst nach Schließung von aufgerufnen Programm weiterlaufen

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

itoss

Avatar von itoss

Anmeldungsdatum:
4. April 2014

Beiträge: Zähle...

"Damals", wahrscheinlich vor sytemctl/upstart, war es so, dass das script erst nach dem Schließen von im script aufgerufenen externen Programmen weiterlief. Genau diese Eigenschaft benötige is jetzt wieder. konkret geht es um ein mount script welches Container mountet, einen Dateimanager öffnet, und nachdem der Dateimanager geschlossen wurde , wieder unmountet.

1
2
3
mount_crypt.sh -m $containerfilepath/$containername $mountpoint
nemo $mountpoint ## script soll stoppen solange diese nemo instanz geöffnet ist
#mount_crypt.sh -u $containerfilepath/$containername $mountpoint

stehe da gerade auf dem schlauch wie man das umsetzen kann.

jb-alvarado

Anmeldungsdatum:
28. November 2012

Beiträge: Zähle...

Vielleicht etwas umständlich, aber wenn es nicht anders geht könntest du dir die PID von nemo speichern und per while Loop diesen PID abfragen, und ein Sleep setzten, bis der PID nicht mehr gültig ist.

itoss

(Themenstarter)
Avatar von itoss

Anmeldungsdatum:
4. April 2014

Beiträge: Zähle...

Daran habe ich auch schon gedacht. aber vllt gibs eine Funktion in der bash um ohne Schleifen auszukommen ?!

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11278

Wie wäre es mit wait?

Vain

Avatar von Vain

Anmeldungsdatum:
12. April 2008

Beiträge: 2510

seahawk1986 schrieb:

Wie wäre es mit wait?

Das ist ja eigentlich implizit.

Mir schwant, insbesondere nemo kommuniziert nur noch mit einem Hauptprozess und beendet sich dann sofort wieder. Da brächte es dann nicht viel, auf irgendwas zu warten. Belegen kann ich diese Vermutung aber nicht. 😉

Vielleicht erstmal mit dem Mounten anfangen und schauen, wo dort das Problem liegt. Kannst du mal den Inhalt von „mount_crypt.sh“ posten?

ChickenLipsRfun2eat Team-Icon

Anmeldungsdatum:
6. Dezember 2009

Beiträge: 12067

itoss schrieb:

"Damals", wahrscheinlich vor sytemctl/upstart, war es so, dass das script erst nach dem Schließen von im script aufgerufenen externen Programmen weiterlief. Genau diese Eigenschaft benötige is jetzt wieder. konkret geht es um ein mount script welches Container mountet, einen Dateimanager öffnet, und nachdem der Dateimanager geschlossen wurde , wieder unmountet.

Ich kann dir bei nemo leider nicht helfen, aber die Funktionalität ist noch immer gegeben. Ich nutze das (rein auf Konsole) bei einem chroot-Script, um meine anderen Distris aus der laufenden heraus zu aktualisieren. Da funktioniert das mounten und nach dem beenden des chroot umounten wie erwartet.

Also wohl eher ein Problem, wie es Vain beschrieben hat. Vielleicht hilft dir ja ein dbus-command weiter, mit dem du diese Instanz abfragen kannst?

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13242

Vain schrieb:

seahawk1986 schrieb:

Wie wäre es mit wait?

Das ist ja eigentlich implizit.

Genau. Wird hier nicht gebraucht, da ja der Prozess nicht im Hintergrund gestartet wird.

Mir schwant, insbesondere nemo kommuniziert nur noch mit einem Hauptprozess und beendet sich dann sofort wieder. Da brächte es dann nicht viel, auf irgendwas zu warten.

Davon gehe ich auch aus. Sonst würde das ursprüngliche Skript (siehe Eingangsposting) wie erwartet laufen. Die Manpage ist leider sehr karg. Ich fürchte fast, das wird eine kompliziertere Geschichte. Man könnte periodisch prüfen, ob es noch Prozesse gibt, die auf den Mountpunkt oder ein Objekt darunter zugreifen:

1
2
3
4
5
6
mount_crypt.sh -m "$containerfilepath/$containername" "$mountpoint"

nemo $mountpoint ## script soll stoppen solange diese nemo instanz geöffnet ist
while [ $(lsof -t +D "$mountpoint" | wc -l) -gt 0 ] && sleep 10; do :; done

mount_crypt.sh -u "$containerfilepath/$containername" "$mountpoint"

itoss

(Themenstarter)
Avatar von itoss

Anmeldungsdatum:
4. April 2014

Beiträge: 419

Danke für die Tipps, wait schaue ich mir heute Nachmittag mal an 😉 Alternativ hatte ich auch an screen gedacht ( screen -S NEMOCRYPT -d -m nemo $mountpoint ). Vorteil gegenüber pid : sesseioname ist immer der selbe und mehrfaches öffnen kann durch abfrage der Screensession im script unterbunden werden.

gerade noch einmal die Befehlsabfolge getestet :

1
2
3
4
cat test 
echo start
nemo
echo end

nemo gibt kein interrupt zurück :

1
2
3
 ./test 
start
end

Nemo Instanz wird gestartet und Script weiter abgearbeitet :/

Ich glaube um eine Schleife mit screen oder PID komme ich nicht herum.

mount_crypt.sh :

  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
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
#!/bin/bash
#
# name          : mount-crypt
# desciption    : mount script for crypted container mounted via sshfs from server/host
# autor         : itoss
# licence       : (CC) BY-NC-SA
# version	: 1.0
# infosource	: https://wiki.ubuntuusers.de/Shell/Bash-Skripting-Guide_f%C3%BCr_Anf%C3%A4nger#Abschneiden-von-Mustern
# used packeges	: dm_crypt lsof

########################
### define variables ###
########################

containerfile=${2##*/}
containerfilepath=${2%%/$containerfile}
containerfilesystem=ext4					# TD => parameter abfrage in befehlszeile implementieren ( mit arras realiseren )
mountpoint=$3
hostuser=$4
hostname=$5
loopdevice=$(sudo losetup -f)
color1=1

########################
### define functions ###
########################
#-----------------------------------------------------------------------------------------------------------
function usage()
{
REDBAR="$(tput setaf $color1)|$(tput sgr0)"
BLANKLINE="$(tput setaf $color1)|$(tput sgr0)										     $(tput setaf $color1)|$(tput sgr0)"
echo $(tput setaf $color1)+------------------------------------------------------------------------------------+$(tput sgr0)
echo "$REDBAR $(basename $0) [-option] [/path/to/file.crp] [mountpoint] [username] [hostname/IP] $REDBAR"
echo "$REDBAR available options: -m  => mount						     $REDBAR"
echo "$REDBAR 		     -u  => unmount				     		     $REDBAR"
echo "$BLANKLINE"
echo "$REDBAR remote = $(basename $0) -m /mnt/sshfs/file.crp /mnt/container user 192.168.1.100   $REDBAR"
echo "$REDBAR local  = $(basename $0) -m /path/to/file.crp /mnt/container		  	     $REDBAR"
echo "$BLANKLINE"
echo "$REDBAR local option does not work for luks container which are mounted via remote	     $REDBAR"
echo "$REDBAR filesystems like sshfs/cifs/ etc. Please use username and hostname parameter 	     $REDBAR"
echo "$REDBAR to check on server if container is opend/used by anyone	     		     $REDBAR"
echo $(tput setaf $color1)+------------------------------------------------------------------------------------+$(tput sgr0)
exit
}
#-----------------------------------------------------------------------------------------------------------
function showparameter()
{
echo ""
echo $(tput setaf $color1)+------------------------------------------------------------------------------------+$(tput sgr0)
echo "$(tput setaf $color1)|$(tput sgr0) containerfile	 	=> $containerfile"
echo "$(tput setaf $color1)|$(tput sgr0) containerfilepath	=> $containerfilepath"
echo "$(tput setaf $color1)|$(tput sgr0) containerfilesystem 	=> $containerfilesystem"
echo "$(tput setaf $color1)|$(tput sgr0) mountpoint		=> $mountpoint"
echo "$(tput setaf $color1)|$(tput sgr0) used loop device	=> $(sudo losetup -f)"
echo "$(tput setaf $color1)|$(tput sgr0) hostuser		=> $hostuser"
echo "$(tput setaf $color1)|$(tput sgr0) hostname 		=> $hostname"
echo "$(tput setaf $color1)|$(tput sgr0) connectiontype 	=> $connectionstatus"
echo $(tput setaf $color1)+------------------------------------------------------------------------------------+$(tput sgr0)
}
#-----------------------------------------------------------------------------------------------------------
function mount_luks_container()
{
echo -e "starting mount process ... \n"
sudo losetup $loopdevice $containerfilepath/$containerfile
sudo cryptsetup luksOpen $loopdevice $containerfile
sudo mount -t ext4 /dev/mapper/$containerfile $mountpoint
}
#-----------------------------------------------------------------------------------------------------------
function umount_luks_container()
{
echo -e "starting unmount process ... \n"
sudo umount $mountpoint											# umount directory
sudo cryptsetup luksClose $containerfile								# close luks encrypted container
sudo losetup -d $(sudo losetup -a | grep $containerfile | cut -d : -f1)					# unmount loopdevice
}
#------------------------------------------------------------------------------------------------------------
#------------------------------------------------------------------------------------------------------------
#------------------------------------------------------------------------------------------------------------
############################
###     start script     ###
############################

#------------------------------------------------------------------------------------------------------------
case $# in
 5)	connectionstatus="using ssh connection $(tput setaf $color1)$4@$5$(tput sgr0)"
	sshconfig='ssh $4@$5 lsof | grep $containerfile' ;;
 3)	connectionstatus="using local connection"
  	sshconfig='lsof | grep $containerfile';;
 *) 	usage
	exit;;
esac
#------------------------------------------------------------------------------------------------------------
showparameter
#------------------------------------------------------------------------------------------------------------
case $1 in
  -m)	if [[ -n $(eval $sshconfig) ]] ;then 			  	# mount request from host if container is already in use
	  echo -e "containerfile $containerfile already in use \n"
	  read -p "unmount loopdevice $(tput setaf $color1)$containerfile$(tput sgr0) located in $(tput setaf $color1)$containerfilepath$(tput sgr0) ? [Y]es, [N]o : " response
	  case $response in
		[Yy]* ) umount_luks_container;;
		[Nn]* ) exit 99;;
		* ) usage; exit 1;;
	  esac
	else
	  mount_luks_container
	fi ;;
  -u)	echo -e "containerfile $(tput setaf $color1)$containerfile$(tput sgr0) located in $(tput setaf $color1)$containerfilepath$(tput sgr0)\n"
	umount_luks_container ;;
  *)	usage
        exit ;;
esac
#------------------------------------------------------------------------------------------------------------
echo -e "\nloopdevice mounted => $(sudo losetup -a)"
echo -e "filesysstem mounted => $(mount -l |  grep $containerfile | cut -d : -f2)\n"
#------------------------------------------------------------------------------------------------------------

Edit : über die PID ist schlecht da nemo eine PID für alle Fenster hat.

itoss

(Themenstarter)
Avatar von itoss

Anmeldungsdatum:
4. April 2014

Beiträge: 419

Also mit nemo keine Chance, da ein einzeln geöffnetes Fernster nicht über PID oder screen zuzuordnen ist. Ich habe mich daher einfach für ein anderen Dateimanager entschieden. mount_crypt script habe ich in das aktuelle script integriert. Für den ein oder anderen Tipp wäre ich dankbar ( Arrays sind besser als anfragen mit $1-9 - für Code wäre ich dankbar - mit Arrays habe ich mich noch nicht beschäftigt ) Ein paar weitere Dinge für die ich noch keine Lösung habe sind im script hinterlegt.

  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
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
#!/bin/bash
#
# name          : mount-crypt-con.sh
# desciption    : mount shortcut for LUKS container
# autor         : Speefak
# licence       : (CC) BY-NC-SA
# version	: 1.1
# infosource	: https://wiki.ubuntuusers.de/Shell/Bash-Skripting-Guide_f%C3%BCr_Anf%C3%A4nger#Abschneiden-von-Mustern
#

########################
### define variables ###
########################


containerfile=${2##*/}
containerfilepath=${2%%/$containerfile}
containerfilesystem=ext4
mountpoint=/mnt/crypt-con/$(echo $containername.crypt   | cut -d . -f1)
loopdevice=$(sudo losetup -f)
filemanager=${3:--f1}				#
color1=1
REDBAR="$(tput setaf $color1)|$(tput sgr0)"
BLANKLINE="$(tput setaf $color1)|$(tput sgr0)"


# TD => auflistung verfügbarer container in containerverzeichnis
# TD => ssh / sshfs funktion implementieren // ssh abfrage remote verzeichnis sshfs remote container mount

########################
### define functions ###
########################
#-----------------------------------------------------------------------------------------------------------
function usage()
{
echo $(tput setaf $color1)+------------------------------------------------------------------------------------+$(tput sgr0)
echo "$REDBAR $(basename $0) [-option] [/path/to/file.crypt] [-filemanager] 		     $REDBAR"
echo "$BLANKLINE 										     $REDBAR"
echo "$REDBAR available options: -a  => auto ( mount / open filemanager / unmount )		     $REDBAR"
echo "$REDBAR 		     -m  => mount				     		     $REDBAR"
echo "$REDBAR 		     -u  => unmount				     		     $REDBAR"
echo "$REDBAR 		     -c  => create containerfile		     		     $REDBAR"
echo "$BLANKLINE 										     $REDBAR"
echo "$REDBAR Filemanager        -f2 => pcmanfm	       ( xserver ) default    		     $REDBAR"
echo "$REDBAR ( auto mode )      -f1 => gnome-comander     ( xserver )	 	             $REDBAR"
echo "$REDBAR 		     -f3 => midnight commander ( ncurses )	     		     $REDBAR"
echo "$BLANKLINE 										     $REDBAR"
echo $(tput setaf $color1)+------------------------------------------------------------------------------------+$(tput sgr0)
sudo rmdir $mountpoint 2>/dev/null
exit
}
function showparameter()
{
echo ""													# list parameter while passphase input
echo $(tput setaf $color1)+------------------------------------------------------------------------------------+$(tput sgr0)
echo "$REDBAR containerfile		=> $containerfile"
echo "$REDBAR containerfilepath	=> $containerfilepath"
echo "$REDBAR mountpoint		=> $mountpoint"
echo "$REDBAR containerfilesystem 	=> $containerfilesystem"
echo "$BLANKLINE"
echo $(tput setaf $color1)+------------------------------------------------------------------------------------+$(tput sgr0)
}
#-----------------------------------------------------------------------------------------------------------
function mount_luks_container() 
{
showparameter
echo -e "\nstarting mount process ... \n"
sudo losetup $loopdevice $containerfilepath/$containerfile						# mount loopdevice
sudo cryptsetup luksOpen $loopdevice $containerfile							# open luks encrypted container
sudo mount -t ext4 /dev/mapper/$containerfile $mountpoint						# mount filesystem
echo -e "\nloopdevice mounted => $(sudo losetup -a)"
echo -e "filesysstem mounted => $(mount -l |  grep $containerfile | cut -d : -f2)\n"
}
#-----------------------------------------------------------------------------------------------------------
function umount_luks_container()
{
echo -e "\nstarting unmount process ... \n"
sudo umount $mountpoint											# umount filesystem
sudo cryptsetup luksClose $containerfile								# close luks encrypted container
sudo losetup -d $(sudo losetup -a | grep $containerfile | cut -d : -f1)					# unmount loopdevice
echo -e "\nloopdevice mounted => $(sudo losetup -a)"
echo -e "filesysstem mounted => $(mount -l |  grep $containerfile | cut -d : -f2)\n"
}
#-----------------------------------------------------------------------------------------------------------
function auto_mount ()
{
mount_luks_container
echo -e "starting filemanager"
case $filemanager in 
-f1) pcmanfm $mountpoint 2>/dev/null ;;
-f2) gnome-commander $mountpoint 2>/dev/null ;;
-f3) mc $mountpoint;;
esac
umount_luks_container
}
#------------------------------------------------------------------------------------------------------------
#------------------------------------------------------------------------------------------------------------
############################
###     start script     ###
############################
### check if container is allready mounted
## lock containerfile ? write manifestfile to $containerfilepath, check if any container is locked
#------------------------------------------------------------------------------------------------------------


									
#------------------------------------------------------------------------------------------------------------
## check containerfile access and parameter input							TD => fehler in variable schrieben und EINMAL über usage ausgeben
if [[ $1 == "" ]] ;then echo -e "\n $(tput setaf $color1)No option specified $(tput sgr0)\n" && usage ;fi
if [[ $2 == "" ]] ;then echo -e "\n $(tput setaf $color1)No containerfile specified $(tput sgr0)\n" && usage ;fi
if ! test -e  $containerfilepath/$containerfile ;then echo -e "\n $(tput setaf $color1)Containerfile does not exist $(tput sgr0)\n" && usage ;fi
case $filemanager in 
-f1|-f2|-f3) ;;
	  *) echo -e "$(tput setaf $color1)\n filemanager $filemanager is not available $(tput sgr0)\n" && usage ;;
esac
#------------------------------------------------------------------------------------------------------------
## create mountpoint
sudo mkdir $mountpoint												
#------------------------------------------------------------------------------------------------------------
# start mount process
case $1 in
 -a)	auto_mount && sudo rmdir $mountpoint;;
 -m)	mount_luks_container;;
 -u)	umount_luks_container && sudo rmdir $mountpoint;;
  *)	echo -e "$(tput setaf $color1)\n $1 option is not available $(tput sgr0)\n" && usage && exit;;
esac
#------------------------------------------------------------------------------------------------------------

Problem ist damit - naja eher umgangen als gelöst.

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13242

itoss schrieb:

Also mit nemo keine Chance, da ein einzeln geöffnetes Fernster nicht über PID oder screen zuzuordnen ist. Ich habe mich daher einfach für ein anderen Dateimanager entschieden.

Was spricht gegen die Lösung mit lsof? Funktioniert die nicht?

Noch ein paar Anmerkungen zum Skript:

  • besser konsequent kleine Variablennamen für Variablen, die nur um Skript genutzt (und nicht exportiert) werden.

  • Die ganzen Kaskaden mit echo kannst Du einfacher durch ein Here-Doc ersetzen (ja, da funktioniert auch Variablenexpansion).

  • Test auf Leerstring geht auch so: if [ -z "$foo" ]; then...

  • Ein bisschen mehr Quoting könnte auch nicht schaden.

  • Einrückungen und Verteilen von if .. then .. fi auf mehrere Zeilen hilft der Lesbarkeit.

itoss

(Themenstarter)
Avatar von itoss

Anmeldungsdatum:
4. April 2014

Beiträge: 419

Die Lösung mit lsof hätte den Vorteil, dann man mit allen möglichen Programmen auf den Container zugreifen kann, im Prinzip würde es wie autofs funktionieren, nach 5 min ohne zugriff auf den Container wird dieser automatisch ausgehängt.

Die Variablen hatte ich grossgeschrieben weil "optische" Elemente - wird sich mit Heredoc erledigen 😉

der Leerstring : -z wars - die Variante fiel mir auf Anhieb nicht mehr ein.

Ein bisschen mehr Quoting könnte auch nicht schaden. ?! inwiefern ?

Einrücken - stimmt - das könnte der Unübersichtlichkeit schaden 😉

PS : Wie realisiere ich ein script/programm mit einer ncurses Oberfläche wie z.b. beim Ubuntu-mini-image Installationsmedium ? ist das sehr aufwändig ?

Vain

Avatar von Vain

Anmeldungsdatum:
12. April 2008

Beiträge: 2510

itoss schrieb:

PS : Wie realisiere ich ein script/programm mit einer ncurses Oberfläche wie z.b. beim Ubuntu-mini-image Installationsmedium ? ist das sehr aufwändig ?

In einem Shellskript hast du da nur eingeschränkte Möglichkeiten. Namentlich dialog. Dieses Tool benutzt zwar im Hintergrund ncurses, in deinem Skript kriegst du davon aber nichts mit. Sprich, du kannst „nur“ die vorgefertigten Dialogmöglichkeiten benutzen. Für viele Sachen reicht das aber.

Es gäbe da auch noch die Möglichkeit, mit select Menüs zu bauen: http://tldp.org/LDP/Bash-Beginners-Guide/html/sect_09_06.html

(Und hier noch der obligatorische Hinweis darauf, dass Skripte mit dialog oder select in der Regel nicht so dolle der Unix-Philosophie folgen, weil sie „captive“ sind und du sie wirklich nur interaktiv benutzen kannst. Schlimmer finde ich aber noch, dass dialog-Skripte häufig dazu neigen, immer komplexer und verschachtelter zu werden. So ähnlich wie ein „Wizard“ aus dem Zeitalter von Windows 95, nur meistens ohne „Zurück“-Möglichkeit. Da schüttelt’s mich. ☺)

itoss

(Themenstarter)
Avatar von itoss

Anmeldungsdatum:
4. April 2014

Beiträge: 419

Dialog sieht gar nicht schlecht aus 😉 Wie kompliziert die Syntax dann wird werde ich sehen ... . Einzig die Geschichte "gefangen im eigenen Dialog" hört sich nicht so gut an.

Der Thread hier ist aufgrund des Topics gelöst, der Script Thread geht hier weiter : https://forum.ubuntuusers.de/topic/script-fuer-erstellung-und-verwaltung-versch-l/

Antworten |