Ich verwende Tilda (Dropdown-Terminal) unter Ubuntu als "Befehlszentrale" - so wie andere GNOME Do, Quicksilver oder Launchy verwenden.
Ich habe jedoch Probleme damit, einen Prozess (z. B. Firefox) vollständig von dem Terminal zu trennen, von dem aus er gestartet wurde, dh zu verhindern, dass ein solcher (nicht-) untergeordneter Prozess ausgeführt wird
- wird beim Schließen des Ursprungs-Terminals beendet
- "verschmutzt" das Ursprungsendgerät über STDOUT / STDERR
Um beispielsweise Vim in einem "richtigen" Terminalfenster zu starten, habe ich ein einfaches Skript wie das folgende ausprobiert:
exec gnome-terminal -e "vim $@" &> /dev/null &
Dies führt jedoch immer noch zu Umweltverschmutzung (auch das Übergeben eines Dateinamens scheint nicht zu funktionieren).
Antworten:
Als erstes; Sobald Sie einen Prozess gestartet haben, können Sie ihn im Hintergrund anzeigen, indem Sie ihn zuerst anhalten (drücken Sie Ctrl- Z) und dann eingeben
bg
, damit er im Hintergrund fortgesetzt wird. Es ist jetzt ein "Job", und seinestdout
/stderr
/stdin
sind immer noch mit Ihrem Terminal verbunden.Sie können einen Prozess im Hintergrund sofort starten, indem Sie ein "&" an dessen Ende anhängen:
Verwenden Sie diese Option, um es im Hintergrund stumm zu schalten:
Einige zusätzliche Informationen:
nohup
ist ein Programm, mit dem Sie Ihre Anwendung so ausführen können, dass stattdessen stdout / stderr an eine Datei gesendet werden kann und das Schließen des übergeordneten Skripts das untergeordnete Skript nicht SEHT. Sie müssen jedoch die Voraussicht gehabt haben, um es zu verwenden, bevor Sie die Anwendung gestartet haben. Aufgrund der Funktionsweisenohup
können Sie es nicht einfach auf einen laufenden Prozess anwenden .disown
ist eine integrierte Bash, die einen Shell-Job aus der Job-Liste der Shell entfernt. Was dies bedeutet im Grunde , dass Sie nicht verwenden könnenfg
,bg
auf es mehr, aber noch wichtiger ist , wenn Sie Ihre Shell schließen wird es nicht hängen oder sendenSIGHUP
mehr an das Kind. Im Gegensatz zunohup
,disown
verwendet wird , nachdem der Prozess gestartet und hintergründig ist.Was Sie nicht tun können, ist die stdout / stderr / stdin eines Prozesses zu ändern, nachdem Sie ihn gestartet haben. Zumindest nicht aus der Schale. Wenn Sie Ihren Prozess starten und ihm mitteilen, dass seine Standardausgabe Ihr Terminal ist (was Sie standardmäßig tun), ist dieser Prozess für die Ausgabe auf Ihrem Terminal konfiguriert. Ihre Shell hat nichts mit dem FD-Setup der Prozesse zu tun, das ist nur etwas, was der Prozess selbst verwaltet. Der Prozess selbst kann entscheiden, ob stdout / stderr / stdin geschlossen werden soll oder nicht, aber Sie können Ihre Shell nicht verwenden, um dies zu erzwingen.
Um die Ausgabe eines Hintergrundprozesses zu verwalten, stehen zahlreiche Optionen aus Skripten zur Verfügung, wobei "nohup" wahrscheinlich die ersten sind, die in den Sinn kommen. Aber für interaktive Prozesse, die Sie starten, aber vergessen haben, (
firefox < /dev/null &>/dev/null &
) zum Schweigen zu bringen , können Sie nicht wirklich viel tun.Ich empfehle dir GNU
screen
. Mit screen können Sie einfach Ihre laufende Shell schließen, wenn die Ausgabe des Prozesses störend wird, und eine neue öffnen (^Ac
).Oh, und übrigens, benutzen Sie "
$@
" nicht dort, wo Sie es benutzen.$@
bedeutet,$1
,$2
,$3
..., die Ihren Befehl in drehen würden:Das ist wahrscheinlich nicht das, was Sie wollen, weil -e nur ein Argument nimmt.
$1
Zeigen Sie mit, dass Ihr Skript nur ein Argument verarbeiten kann.Es ist wirklich schwierig, mehrere Argumente in dem von Ihnen angegebenen Szenario (mit dem
gnome-terminal -e
) zum Funktionieren zu bringen, da-e
nur ein Argument benötigt wird, nämlich eine Shell-Befehlszeichenfolge. Sie müssten Ihre Argumente zu einem zusammenfassen. Der beste und robusteste, aber ziemlich klobige Weg sieht so aus:quelle
disown
, dann wird der Prozess weiterlaufen, nachdem du die Shell geschlossen hast, da bash es nicht mehr HUPEN wird.$*
anstatt$@
bereits das Problem beheben der einzelnen Strings?reptyr
dafür.nohup
Löst den Prozess vollständig (daemonisiert ihn)quelle
nohup
ignoriert einfach dasSIGHUP
Signal. Es führt den Prozess normal aus. Keine Dämonisierung.init
), wenn die Shell beendet wird ... richtig?Wenn Sie verwenden
bash
, versuchen Sie es ; siehe bash (1) .disown [jobspec]
Ein anderer Ansatz, den Sie ausprobieren können, ist
at now
. Wenn Sie kein Superuser sind, ist Ihre Nutzungsberechtigungat
möglicherweise eingeschränkt.quelle
at
Die Ausführung an jemand anderen zu delegieren, gefällt mir! +1zsh
auch.disown
scheint nicht die gewünschte Wirkung mitgnome-terminal
-disown
ed Prozessen noch getötet werden , wenn das Terminal beendet. Ich würde gerne wissen warum / wie.Als ich diese Antworten las, hatte ich den ersten Eindruck, dass das Ausstellen
nohup <command> &
ausreichen würde. Als ich zsh im Gnome-Terminalnohup <command> &
ausführte , stellte ich fest, dass meine Shell nicht daran gehindert hat, untergeordnete Prozesse beim Beenden zu beenden. Obwohlnohup
dies insbesondere bei nicht interaktiven Shells nützlich ist, wird dieses Verhalten nur dann garantiert, wenn der untergeordnete Prozess seinen Handler für dasSIGHUP
Signal nicht zurücksetzt .In meinem Fall
nohup
hätte verhindert werden müssen, dass Aufhängesignale die Anwendung erreichen, aber die untergeordnete Anwendung (in diesem Fall VMWare Player) hat ihrenSIGHUP
Handler zurückgesetzt. Wenn der Terminalemulator beendet wird, können Ihre Unterprozesse trotzdem abgebrochen werden. Dies kann meines Wissens nur gelöst werden, indem sichergestellt wird, dass der Prozess aus der Auftragstabelle der Shell entfernt wird. Wennnohup
mit einer eingebauten Shell überschrieben wird, wie dies manchmal der Fall ist, kann dies jedoch ausreichen, falls dies nicht der Fall ist ...disown
wird in einem Shell gebautetbash
,zsh
undksh93
,oder
wenn Sie Einzeiler bevorzugen. Dies hat den im Allgemeinen wünschenswerten Effekt, dass der Unterprozess aus der Auftragstabelle entfernt wird. Auf diese Weise können Sie den Terminalemulator beenden, ohne den untergeordneten Prozess versehentlich zu signalisieren. Unabhängig davon, wie der
SIGHUP
Handler aussieht, sollte dies den Prozess Ihres Kindes nicht beenden.Nach der Deaktivierung ist der Prozess noch ein untergeordnetes Element Ihres Terminal-Emulators (spielen Sie damit,
pstree
wenn Sie dies in Aktion verfolgen möchten). Nach dem Beenden des Terminal-Emulators sollte er jedoch mit dem Init-Prozess verknüpft sein. Mit anderen Worten, alles ist so, wie es sein sollte und wie Sie es vermutlich wollen.Was tun, wenn Ihre Shell nicht unterstützt
disown
? Ich würde nachdrücklich empfehlen, zu einem zu wechseln, der dies tut, aber da diese Option nicht verfügbar ist, haben Sie einige Möglichkeiten.screen
undtmux
kann dieses Problem lösen, aber es sind viel schwerere Lösungen, und ich mag es nicht, sie für eine so einfache Aufgabe ausführen zu müssen. Sie eignen sich viel besser für Situationen, in denen Sie ein tty verwalten möchten, normalerweise auf einem Remotecomputer.setopt nohup
. Hiermit kann festgelegt werden, dassSIGHUP
beim Beenden der Shell keine Nachrichten an die Jobs in der Jobtabelle gesendet werden sollen. Sie können dies entweder direkt vor dem Beenden der Shell anwenden oder der Shell-Konfiguration hinzufügen, als~/.zshrc
ob Sie es immer aktivieren möchten.tcsh
oder zu tuncsh
, was etwas störend ist.exec()
. Dies ist eine sehr schlechte Lösung, aber die Quelle sollte nur aus ein paar Dutzend Zeilen bestehen. Sie können dann Befehle als Befehlszeilenargumente an das C-Programm übergeben und so einen prozessspezifischen Eintrag in der Auftragstabelle vermeiden.quelle
nohup $COMMAND &
$COMMAND & disown
setsid command
Ich benutze schon sehr lange Nummer 2, aber Nummer 3 funktioniert genauso gut. Auch
disown
eine hatnohup
Flagge-h
, können alle Prozesse disown mit-a
und kann alle laufenden Prozesse disown mit-ar
.Die Stummschaltung erfolgt durch
$COMMAND &>/dev/null
.Hoffe das hilft!
quelle
Ich denke, Bildschirm könnte Ihr Problem lösen
quelle
In tcsh (und möglicherweise auch in anderen Shells) können Sie Klammern verwenden, um den Prozess zu trennen.
Vergleichen Sie dies:
Dazu:
Dadurch wird Firefox aus der Jobliste entfernt, es ist jedoch weiterhin mit dem Terminal verbunden. Wenn Sie sich über 'ssh' bei diesem Knoten angemeldet haben, wird der ssh-Prozess beim Versuch, sich abzumelden, immer noch hängen bleiben.
quelle
Einfachste und einzig richtige Antwort für bash:
Sie müssen den Prozess nicht vom Terminal trennen, sondern von der Shell.
quelle
Um die Zuordnung der tty-Shell aufzuheben, führen Sie den Befehl über die Sub-Shell aus, z
(Befehl)&
Beim Beenden wird das verwendete Terminal geschlossen, der Prozess ist jedoch noch aktiv.
prüfen -
Anderes Terminal öffnen
Prozess ist noch am Leben.
quelle
Das Hinterlegen und Vordergrunden eines Jobs ist wahrscheinlich eines der allerersten Dinge, die jeder Unix-Systemadministrator wissen sollte.
So wird es mit bash gemacht:
quelle
Sie können Ihren Befehl mit dem Befehl nohup ausführen. Dadurch wird Ihr Prozess getrennt und die Ausgabe in eine bestimmte Datei umgeleitet. Ich bin mir jedoch nicht sicher, ob dies genau das ist, was Sie benötigen.
quelle
Try Daemon - sollte bei Ihrem freundlichen Paketmanager erhältlich sein und sich umfassend darum kümmern, sich vom Terminal zu trennen.
quelle
Fügen Sie dies einfach in Ihren bashrc / zshrc ein:
Dann können Sie abgelehnte Befehle wie folgt ausführen:
quelle
In meinem .bashrc habe ich genau zu diesem Zweck folgende Funktionen:
Stellen Sie einem Befehl das Präfix voran
dos
, um ihn vom Terminal getrennt auszuführen.Die Funktion ist für die Arbeit mit
bash
und geschriebenzsh
.quelle
( "$@" & disown) &> /dev/null
. Es macht auch nicht viel Sinn,1>
und2>
, weil Sie verwendendisown
, was bedeutet, dass Sie bash verwenden, und in bash können Sie einfach tun&>
, um sowohl stdout als auch stderr umzuleitenrun_disowned
Funktionalität an anderen Stellen in meinen Punktedateien. Da hast du&>
natürlich recht .Ich habe unter Mac OS X festgestellt, dass ich sowohl nohup als auch disown verwenden muss, um sicherzustellen, dass der untergeordnete Prozess nicht mit dem Terminal abgerissen wird.
quelle
Ich benutze das folgende Skript, um dies zu tun. Es stoppt den Druckvorgang auf dem Terminal, löst sich mit
nohup
und beendet sich mit dem Rückgabestatus, wenn der Befehl innerhalb von beendet wirdTIMEOUT
.Anwendungsbeispiel:
quelle
sudo apt install ucommon-utils
pdetach command
Los geht's :)
quelle
Viele Antworten schlugen vor, nohup zu verwenden . Ich würde eher empfehlen, pm2 zu verwenden . Die Verwendung von pm2 über nohup bietet viele Vorteile, z. B. die Aufrechterhaltung des Betriebs der Anwendung, die Verwaltung von Protokolldateien für die Anwendung und viele weitere Funktionen. Weitere Informationen finden Sie hier .
Um pm2 zu installieren, müssen Sie npm herunterladen . Für Debian-basiertes System
und für Redhat
Oder folgen Sie diesen Anweisungen . Nach der Installation von npm benutze es, um pm2 zu installieren
Sobald es fertig ist, können Sie Ihre Anwendung durch starten
Verwenden Sie zur Prozessüberwachung folgende Befehle:
Verwalten Sie Prozesse mithilfe des App-Namens oder der Prozess-ID oder verwalten Sie alle Prozesse zusammen:
Protokolldateien finden Sie in
quelle
nohup
ist ein einfacher POSIX-Standardbefehl, daher die gleiche Bemerkung: auf keinen Fall veraltet. @see unix.com/man-page/posix/1p/nohupWenn Sie lediglich eine Befehlszeilenanwendung starten möchten, ohne das Terminalfenster dabei zu belassen, können Sie versuchen, die Anwendung nach dem Starten des Terminals mit Alt-F2 auszuführen.
quelle