prozess/jobverwaltung - nohup CMD & löst Prozess nicht von shell

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
speefak
Beiträge: 449
Registriert: 27.04.2008 13:54:20

prozess/jobverwaltung - nohup CMD & löst Prozess nicht von shell

Beitrag von speefak » 23.03.2018 14:20:32

hallo, wie im Topic bereits beschrieben, kann ich mittels nohup <command> & den prozess nicht vom terminal lösen.

konkreter Fall :

ein scirpt in /usr/local/bin/redshift.sh mit folgendem Inhalt :

Code: Alles auswählen

redshift-gtk -l 52.2799112:8.0471788  -t 6000:3700
wird via nohup redshift.sh & gestartet.

Mit dem betreffenden Terminal kann ich weiterarbeiten. Wenn ich jedoch das Terminal schließe, werden alle in diesem Terminal gestarteten Programme/Scripte ebenfalls beendet. Dies sollte doch eigentlich durch nohub verhindert werden.

Unter ubuntu 12.04 reichte noch damals ein einfach & um den Prozess vom Terminal zu lösen.

Worann kann es in dem o.g. Fall liegen ? am Programm selbst ? der Syntax ?

Starte ich die o.g. Programme / Scripte in einer Screensession laufen diese weiter, nur habe ich dann zig screensession laufen, das wird dann alles etwas unübersichtlich.

Benutzeravatar
speefak
Beiträge: 449
Registriert: 27.04.2008 13:54:20

Re: prozess/jobverwaltung - nohup CMD & löst Prozess nicht von shell

Beitrag von speefak » 23.03.2018 14:25:52

Lösung gefunden : https://bbs.archlinux.de/viewtopic.php?id=23395

( command & )

einfach den ganze command string klammern. ist das in den letzten Jahren in der Bash geändert worden ?


EDIT : zu früh gefreut : funktioniert nur in der debian 9 Bash , nicht auf dem Mac oder unter centOS

breakthewall
Beiträge: 507
Registriert: 30.12.2016 23:48:51

Re: prozess/jobverwaltung - nohup CMD & löst Prozess nicht von shell

Beitrag von breakthewall » 23.03.2018 16:20:14

Deine vermeintliche Lösung ist eigentlich keine. Was Du wirklich suchst ist das disown Bash-Buildin.

Code: Alles auswählen

nohup command & disown
Damit kannst einen Prozess komplett von der aktuellen Shell trennen. Zunächst wird mit nohup lediglich die Ausgabe unterdrückt, und indem nur ein & setzt, schiebst einen Prozess lediglich nur in den Hintergrund. Fügt man nun ein disown hinten an, dann wird dieser Hintergrund-Prozess aus der Jobliste der Shell entfernt, womit die aktuelle Shell keine Kontrolle mehr über diesen Prozess hat. Also würde der Prozess weiterlaufen, wenn die aktuelle Shell beendet wird.

Wenn das unter macOS nicht funktioniert, dann handelt es sich vermutlich um eine veraltete, oder ggf. um eine modifizierte Bash. Und CentOS ist ja als RHEL-Abbild, ausserordentlich konservativ, und verwendet daher sehr alte Pakete, inkl. einer sehr alten Bash. Dieser wird einiges an moderner Funktionalität fehlen. Von daher eine schlechte Wahl.
Zuletzt geändert von breakthewall am 23.03.2018 16:32:55, insgesamt 3-mal geändert.

geier22

Re: prozess/jobverwaltung - nohup CMD & löst Prozess nicht von shell

Beitrag von geier22 » 23.03.2018 16:25:42

Wenn es dir nur um das Starten von Debianredshift mit Parametern geht, würde ich dir empfehlen eine Desktop- Datei anzulegen bzw. die Vorhandene zu modifizieren. Diese packst du in den Autostart als ~/.config/autostart/redshift-gtk.desktop .
die Datei sollte so aussehen:

Code: Alles auswählen

[Desktop Entry]
Version=1.1
Type=Application
Name=Redshift
GenericName=Farbtemperatur Anpassung
Comment=Farbtemperatur Anpassungswerkzeug
Icon=redshift
Exec=redshift-gtk -l 52.2799112:8.0471788  -t 6000:3700
Actions=
Categories=Utility;
StartupNotify=true
Hidden=false
X-GNOME-Autostart-enabled=true
Du kannst auch dem Starter selbst den Befehl mitgeben. Ein Skript dafür ist nicht notwendig und macht auch wenig Sinn.

Benutzeravatar
speefak
Beiträge: 449
Registriert: 27.04.2008 13:54:20

Re: prozess/jobverwaltung - nohup CMD & löst Prozess nicht von shell

Beitrag von speefak » 23.03.2018 16:36:01

das habe ich grad auch festgestellt :

"
&! und & disown sollten äquivalent sein, &! ist halt zsh-only währen & disown auch in bash funktioniert.

NOHUB und DISOWN funktionieren vollkommen unterschiedlich, NOHUP ist bei den meisten shells kein builtin sondern ein separates programm. nohup sorgt dafür das das Programm kein kontrollierendes Terminal hat und dass kein SIGHUP an das zu startende Programm gesendet wird, zudem macht nohup noch einige redirections, nämlich /dev/null>&0, 1>>nohup.out und 2>&1.

Wenn man ein Programm ohne NOHUP startet und stattdessen disown verwendet dann hat das Programm natürlich ein kontorllierendes Terminal, disown sorgt einfach dafür dass die Shell kein SIGHUP an das Programm sendet, es sorgt aber nicht dafür dass SIGHUP von dem Programm ignoriert wird.
"

Das Script läuft nun mit disown ohne den nohup Befehl. Im Prinzip würde doch das Unterdrücken von SIGHUP reichen ( https://wiki.ubuntuusers.de/Signale/ )

NOHUP hingegen funktioniert nicht bei allen Programmen und Scripten ( redshift z.b. ). Unterdrückt NOHUB alle Prozesssignale und stürzt redhsift deshalb nach dem schließen des terminal ab ? mit einem einfachen disown gibt es im fall von redshift keine Probleme ( da wenn ich das richtig verstanden habe disown nur das SIGHUP - also das beenden des Terminal unterdrückt ).

Benutzeravatar
speefak
Beiträge: 449
Registriert: 27.04.2008 13:54:20

Re: prozess/jobverwaltung - nohup CMD & löst Prozess nicht von shell

Beitrag von speefak » 23.03.2018 16:42:44

geier22, wenn es nur um redshift geht hast du natürlich recht.

Ich arbeite aber gerne mit einer allgemeingültigen Syntax die über versch. shells und Betriebssysteme funktioniert. Das ist im Falle von Redshift übertrieben ... habe ich jetzt aber eine Lösung die recht rudimentär ist kann ich in Zukunft auf diese Syntax zurückgreifen und muss nicht wieder nach einer für den aktuellen Fall passenden Lösung suchen.

disown & funktioniert auf Debian 8/9, CentOS 5+, Gentoo und diversen Shells - nohub dagegen nur auf der debian 9 bash.

geier22

Re: prozess/jobverwaltung - nohup CMD & löst Prozess nicht von shell

Beitrag von geier22 » 23.03.2018 17:09:13

Beides Funktioniert. DISOWN ist dabei nicht notwendig (zumindest in der Bash)

Code: Alles auswählen

~$ /home/hans/Dokumente/Skripte/redshift &
[3] 24928
hans@sparkyxfce:~$ 
(redshift-gtk:24929): Gdk-CRITICAL **: 17:10:55.212: gdk_window_thaw_toplevel_updates: assertion 'window->update_and_descendants_freeze_count > 0' failed
^C

Code: Alles auswählen

nohup /home/hans/Dokumente/Skripte/redshift &
[1] 14823
^C
uppsss DISOWN ist doch notwendig. Hatte das Terminal nicht geschlossen :facepalm:

EDIT

Wäre ja noch interessant, wie man die Ausgabe von nohub so unterdrücken kann, dass nichts ins ~/home und im Terminal gekritzelt wird. ?

Code: Alles auswählen

nohup /home/hans/Dokumente/Skripte/redshift & disown
[1] 12532
nohup: ignoriere Eingabe und hänge Ausgabe an 'nohup.out' an

Code: Alles auswählen

nohup > /dev/null /home/hans/Dokumente/Skripte/redshift & disown
[1] 27685
hans@sparkyxfce:~$ nohup: ignoriere Eingabe und leite Standardfehlerausgabe auf Standardausgabe um

Benutzeravatar
speefak
Beiträge: 449
Registriert: 27.04.2008 13:54:20

Re: prozess/jobverwaltung - nohup CMD & löst Prozess nicht von shell

Beitrag von speefak » 23.03.2018 17:42:47

geier22, hab grad nochmal getestet :

redshift-gtk -l 52.2799112:8.0471788 -t 6000:3700 &
- kann mit dem Terminal weiter arbeiten
- schließe ich das Terminal mit via exit eingabe > enter läuft redshift weiter
- schließe ich das Terminal indem ich das Fenster schließe wird redshift ebenfalls beendet

nohup redshift-gtk -l 52.2799112:8.0471788 -t 6000:3700 &
- kann mit dem Terminal weiter arbeiten
- schließe ich das Terminal mit via exit eingabe > enter läuft redshift weiter
- schließe ich das Terminal via windows manager ( beenden über X button des fensters ) komm eine Fehlermeldung von Redshift das programm wird beendet aber das Icon bleibt sichtbar

redshift-gtk -l 52.2799112:8.0471788 -t 6000:3700 disown &
- kann mit dem Terminal weiter arbeiten
- schließe ich das Terminal mit via exit eingabe > enter läuft redshift weiter
- schließe ich das Terminal indem ich das Fenster schließe wird redshift ebenfalls beendet

irgendwie scheint das Terminal ein Signal an den Prozess zu senden wenn das Terminal über den Fenstermanager geschlossen wird, mit dem exit Befehlt läuft alles so wie es soll ?!

EDIT :
ich habe nun ein Script erstellt ( testing.sh ) mit dem Inhalt

Code: Alles auswählen

redshift-gtk -l 52.2799112:8.0471788  -t 6000:3700 &
führe ich ich nun das script vis ./testing aus und schließe das Terminal via windowmanager läuft alles weiter 8O

geier22

Re: prozess/jobverwaltung - nohup CMD & löst Prozess nicht von shell

Beitrag von geier22 » 23.03.2018 18:14:57

Und es wird noch lustiger:
Hab mein Skript auch gerade erweitert (&)

Skript im Terminal aufrufen mit

Code: Alles auswählen

nohup > /dev/null /home/hans/Dokumente/Skripte/redshift &
Terminal ohne STRG +C ---> über Schießen- Button beenden -----> failed to run Redshift ---> Redshift schließt
Terminal ohne STRG +C --> Terminal mit STRG +D schließen -------> keine Fehlermeldung + Redshift läuft weiter :facepalm: :mrgreen:
Terminal ohne STRG +C --> Terminal mit exit schliessen -------> keine Fehlermeldung + Redshift läuft weiter :facepalm: :mrgreen:
Es gibt also auch noch Unterschiede in der Art, wie man das Terminal schließt (grafisch / Tastatur). Das hätte ich nun nicht erwartet.

breakthewall
Beiträge: 507
Registriert: 30.12.2016 23:48:51

Re: prozess/jobverwaltung - nohup CMD & löst Prozess nicht von shell

Beitrag von breakthewall » 23.03.2018 18:30:52

speefak hat geschrieben: ↑ zum Beitrag ↑
23.03.2018 17:42:47
redshift-gtk -l 52.2799112:8.0471788 -t 6000:3700 disown &
Die Kommandozeile ist fehlerhaft. Zuerst kommt das &, und erst dann wird das disown angefügt. Natürlich endet der Prozess beim Schließen des Terminals, wenn ihn nur in den Hintergrund schickst. Es muss schließlich erstmal etwas in den Hintergrund geschickt werden, ehe der Prozess abgetrennt werden kann.

Benutzeravatar
speefak
Beiträge: 449
Registriert: 27.04.2008 13:54:20

Re: prozess/jobverwaltung - nohup CMD & löst Prozess nicht von shell

Beitrag von speefak » 24.03.2018 12:23:37

breakthewall , das ist was dran :)

geier22 : das hätte ich auch nicht erwartet und war deshalb verwundert.

Antworten