Hintergrundstart und sudo PW Abfrage in SH Datei

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Sirdonculotte
Beiträge: 7
Registriert: 23.02.2019 22:24:36

Hintergrundstart und sudo PW Abfrage in SH Datei

Beitrag von Sirdonculotte » 23.02.2019 23:08:33

Hallo,

ich möchte gerne in einem Script das starten im Hintergrund einbinden, sowohl auch die sudo PW Abfrage.

Das Script starten im Hintergrund geht ja mit dem Kaufmannsund.

Wie kann ich dies im Script einbauen?

Mein Script MathServer.sh

#!/bin/bash
cd /mobile/Prosys-OPC-new
until [ 1 -ne 1 ]
do
echo "Restart"
_now=$(date +"%y%m%d%H%M%S")
java -classpath build/classes:dist/lib/'*' com/prosysopc/ua/samples/MathServer > /var/log/prosys-opc-new/MathServer_$_now.log
# end with ctrl-c (returns 130)
test $? -gt 128 && break
sleep 1m
done


Ausserdem will ich mit einer Desktopdatei das Script starten.
Wie geht das bei Debian?
Wie muss die Desktopdatei konfiguriert werden?

Danke schon mal :)

bullgard
Beiträge: 1651
Registriert: 14.09.2012 23:03:01

Re: Hintergrundstart und sudo PW Abfrage in SH Datei

Beitrag von bullgard » 24.02.2019 10:29:24

Bitte lies Dir https://wiki.ubuntuusers.de/.desktop-Dateien/ durch.
Ich habe noch keinen Unterschied bei Desktopdateien zwischen Debian und Ubuntu gefunden.
Gruß
bullgard

Sirdonculotte
Beiträge: 7
Registriert: 23.02.2019 22:24:36

Re: Hintergrundstart und sudo PW Abfrage in SH Datei

Beitrag von Sirdonculotte » 25.02.2019 21:21:31

Okay danke werde
mich mal durcharbeiten

tobo
Beiträge: 2336
Registriert: 10.12.2008 10:51:41

Re: Hintergrundstart und sudo PW Abfrage in SH Datei

Beitrag von tobo » 25.02.2019 23:49:10

Sirdonculotte hat geschrieben: ↑ zum Beitrag ↑
23.02.2019 23:08:33
ich möchte gerne in einem Script das starten im Hintergrund einbinden, [...].

Das Script starten im Hintergrund geht ja mit dem Kaufmannsund.

Wie kann ich dies im Script einbauen?
Man kann alles (außer der Interpreterzeile Shebang) in den Hintergrund setzen:

Code: Alles auswählen

#!/bin/bash
{ cd...
...
done } &
sowohl auch die sudo PW Abfrage
In Kombination geht das natürlich nicht - die Abfrage muss im Vordergrund sein. Würde sich dann vielleicht anbieten, für die sudo-Abfrage das Skript in den Vordergrund zurückzuholen. Sinngemäß etwa sowas:

Code: Alles auswählen

#!/bin/bash
{ cd...
while
done } &

wait $!
sudo 

while
done &
Setzt mehrere Befehle mit {}& in den Hintergrund und wartet dann mit wait auf das Abarbeiten des letzten Kindprozesses. { und } sind Schlüsselwörter für die Shell, deswegen sind die Leerzeichen bzw. Zeilenumbruch oder ; wichtig. $! - beim wait - könnte man auch weglassen; dann wird auf alle Kindprozesse gewartet. Danach sudo im Vordergrund, dann die Schleife wieder im Hintergrund. So eine Schleife ist nur ein Kommando, muss man also nicht {}-Klammern. Kann man aber, insbesondere, wenn davor oder danach oder ersatzweise noch andere Befehle stehen.

uname
Beiträge: 12396
Registriert: 03.06.2008 09:33:02

Re: Hintergrundstart und sudo PW Abfrage in SH Datei

Beitrag von uname » 26.02.2019 09:14:52

Vielleicht verstehe ich dein Script auch nicht. Aber wo ist denn die sudo-Passwortabfrage? Und selbst wenn sie irgendwo ist, warum gibt es die überhaupt. Du kannst und solltest vielleicht sudo so konfiugieren, dass ausgewählte Benutzer den sudo-Befehl ohne Eingabe eines Passwortes ausführen dürfen. Das ist bei restriktiven Befehlen auch kein Sicherheitsrisiko. Eigentlich ist es sogar so gewollt.

Frei nach https://wiki.ubuntuusers.de/sudo/Konfiguration/:
username ALL = NOPASSWD: /usr/sbin/IRGENDEINSKRIPT

Sirdonculotte
Beiträge: 7
Registriert: 23.02.2019 22:24:36

Re: Hintergrundstart und sudo PW Abfrage in SH Datei

Beitrag von Sirdonculotte » 08.03.2019 12:45:33

tobo hat geschrieben: ↑ zum Beitrag ↑
25.02.2019 23:49:10
Sirdonculotte hat geschrieben: ↑ zum Beitrag ↑
23.02.2019 23:08:33
ich möchte gerne in einem Script das starten im Hintergrund einbinden, [...].

Das Script starten im Hintergrund geht ja mit dem Kaufmannsund.

Wie kann ich dies im Script einbauen?
Man kann alles (außer der Interpreterzeile Shebang) in den Hintergrund setzen:

Code: Alles auswählen

#!/bin/bash
{ cd...
...
done } &
sowohl auch die sudo PW Abfrage
In Kombination geht das natürlich nicht - die Abfrage muss im Vordergrund sein. Würde sich dann vielleicht anbieten, für die sudo-Abfrage das Skript in den Vordergrund zurückzuholen. Sinngemäß etwa sowas:

Code: Alles auswählen

#!/bin/bash
{ cd...
while
done } &

wait $!
sudo 

while
done &
Setzt mehrere Befehle mit {}& in den Hintergrund und wartet dann mit wait auf das Abarbeiten des letzten Kindprozesses. { und } sind Schlüsselwörter für die Shell, deswegen sind die Leerzeichen bzw. Zeilenumbruch oder ; wichtig. $! - beim wait - könnte man auch weglassen; dann wird auf alle Kindprozesse gewartet. Danach sudo im Vordergrund, dann die Schleife wieder im Hintergrund. So eine Schleife ist nur ein Kommando, muss man also nicht {}-Klammern. Kann man aber, insbesondere, wenn davor oder danach oder ersatzweise noch andere Befehle stehen.
Super hat geklappt, danke :)

Sirdonculotte
Beiträge: 7
Registriert: 23.02.2019 22:24:36

Re: Hintergrundstart und sudo PW Abfrage in SH Datei

Beitrag von Sirdonculotte » 08.03.2019 12:46:59

uname hat geschrieben: ↑ zum Beitrag ↑
26.02.2019 09:14:52
Vielleicht verstehe ich dein Script auch nicht. Aber wo ist denn die sudo-Passwortabfrage? Und selbst wenn sie irgendwo ist, warum gibt es die überhaupt. Du kannst und solltest vielleicht sudo so konfiugieren, dass ausgewählte Benutzer den sudo-Befehl ohne Eingabe eines Passwortes ausführen dürfen. Das ist bei restriktiven Befehlen auch kein Sicherheitsrisiko. Eigentlich ist es sogar so gewollt.

Frei nach https://wiki.ubuntuusers.de/sudo/Konfiguration/:
username ALL = NOPASSWD: /usr/sbin/IRGENDEINSKRIPT
Da hast Du recht, ich habe das sudo weggelassen, danke :)

Sirdonculotte
Beiträge: 7
Registriert: 23.02.2019 22:24:36

Re: Hintergrundstart und sudo PW Abfrage in SH Datei

Beitrag von Sirdonculotte » 08.03.2019 13:17:00

Ich habe noch ein kniffliges Problem,

ich möchte das mein Script über eine Desktop Datei startet mit lxterminal und Ausgabe.
Wünschenswert ist es wenn ich das Terminal zumache, das Script weiterläuft, das tut es nicht, obwohl es im Script programmiert ist.
Vielen Dank schon mal im Voraus :)

Meine Desktopdatei:
[Desktop Entry]
Name=MathOn.desktop
Comment=Startet Math
Exec=lxterminal --command="/bin/bash --init-file /mobile/Prosys-OPC-new/MathServer.sh"
Icon=/usr/share/icons/gnome/8x8/emblems/emblem-new.png
Version=1.0
Type=Application
Terminal=false
StartupNotify=true




Meine Scriptdatei

#!/bin/bash
#Geht in ein Vezeichnis
{cd /mobile/Prosys-OPC-new
until [ 1 -ne 1 ]
do
echo "Restart"
_now=$(date +"%y%m%d%H%M%S")
java -classpath build/classes:dist/lib/'*' com/prosysopc/ua/samples/MathServer > /var/log/prosys-opc-new/MathServer_$_now.log
# end with ctrl-c (returns 130)
test $? -gt 128 && break
sleep 1m
done} &

bullgard
Beiträge: 1651
Registriert: 14.09.2012 23:03:01

Re: Hintergrundstart und sudo PW Abfrage in SH Datei

Beitrag von bullgard » 13.03.2019 21:14:04

Es ist wahrscheinlich schlau, wenn Du mit Deinem »kniffligen Problem« hier in diesem Forum einen neuen Diskussionsfaden eröffnest. Hier in diesem aktuellen Diskussionsfaden wird er wahrscheinlich weniger Beachtung finden.
Gruß
bullgard

Sirdonculotte
Beiträge: 7
Registriert: 23.02.2019 22:24:36

Re: Hintergrundstart und sudo PW Abfrage in SH Datei

Beitrag von Sirdonculotte » 18.03.2019 10:53:19

ja, danke, ist mir auch schon durch den Kopf gegangen :)

tobo
Beiträge: 2336
Registriert: 10.12.2008 10:51:41

Re: Hintergrundstart und sudo PW Abfrage in SH Datei

Beitrag von tobo » 18.03.2019 22:28:59

Sirdonculotte hat geschrieben: ↑ zum Beitrag ↑
08.03.2019 13:17:00
Wünschenswert ist es wenn ich das Terminal zumache, das Script weiterläuft, das tut es nicht, obwohl es im Script programmiert ist.
Ich glaube nicht, dass dein Skript - so wie es hier steht - überhaupt läuft!? Schließlich brauchen { und } Leerzeichen oder Zeilenumbrüche um sich herum. Das ist ja dann also eher Pseudocode, der hier steht.

Eigentlich sollte ein Aufruf in der Form

Code: Alles auswählen

#!/bin/bash
{ cd ...
...
done } &
im Hintergrund weiterlaufen, wenn das übergeordnete Terminal geschlossen wird. Die Bash, die beim Aufruf des Skripts erzeugt wird, wird nicht der aktiven Shell, sondern dem init-Prozess (PPID 1) zugewiesen. Deswegen spielt es dann auch überhaupt keine Rolle, ob dieses Terminal geschlossen wird oder nicht. Und das ist völlig unabhängig davon, wie huponexit in der Shell eingestellt ist. Huponexit hätte dann Relevanz, wenn du (Skript ohne Umklammerung {}&) mit "bash script.sh &" starten würdest, da der Elternprozess - der neuen Shell - bei der aktiven Shell verbleiben würde.

Ich würde mir an deiner Stelle erstmal so ein vereinfachtes Skript nehmen

Code: Alles auswählen

#!/bin/bash
{ while true; do
	sleep 1
done } &
und dann mittels "ps -ef" schauen, wer das Sagen hat - den Elternprozess PPID auslesen!? Und dann den Unterschied rausfinden, wenn im Skript keine Umklammerung {}& untergebracht ist und mittels "script.sh &" gestartet wird.
Den Wert von huponexit erfragst/setzt du mit:

Code: Alles auswählen

$ shopt huponexit  ##erfragen
$ shopt -s huponexit  ##aktivieren
$ shopt -u huponexit  ##deaktivieren
$ export BASHOPTS  ##weiterreichen an aufgerufenes Skript
Auf dein Problem jetzt bezogen (Skript beendet sich), musst du entweder SIGHUP im Skript abfangen oder aber das Skript aktiv von der aktiven Shell abtrennen. Danach hat die gestartete Bash eine PPID von 1. Kannst du machen mit dem Aufruf

Code: Alles auswählen

$ nohup script.sh &
oder im Skript selbst mit

Code: Alles auswählen

#!/bin/bash
trap '' HUP 
{ while true; do
	sleep 1
done } &
Ist also alles abhängig davon, was du "tatsächlich" tust. Und es stellt sich natürlich auch die Frage, warum du ein {}& im Skript benötigst, wenn du über einen Starter starten willst!? Macht alles nur unnötig kompliziert und schränkt das Skript ein.

Sirdonculotte
Beiträge: 7
Registriert: 23.02.2019 22:24:36

Re: Hintergrundstart und sudo PW Abfrage in SH Datei

Beitrag von Sirdonculotte » 22.03.2019 09:36:06

Super danke endlich gelöst.

im Script habe ich den Hintergrundstartstart rausgenommen, und das Trap HUP eingebaut,
Im Starter dann mit dem & gestartet, Terminal startet, Programm startet, und wenn ich Terminal dann schliesse läuft es auch weiter.

Vielen vielen Dank :)

Antworten