Stellen Sie den Job ohne Einfrieren in den Hintergrund

9

Angenommen, Sie starten den Job so

foo

und dann wünschen Sie, dass Sie es in den Hintergrund stellen möchten. Wenn Sie Ctrl+ eingeben Zund dann bgden Trick ausführen, frieren Sie foozwischen Ctrl+ Zund ein bg. Wie kann ich foo in den Hintergrund stellen, ohne es vorher einzufrieren?

user877329
quelle
7
Was ist der Anwendungsfall? Warum ist es ein Problem, dass der Prozess für kurze Zeit einfriert?
10b0

Antworten:

4

Technisch fooläuft schon im Hintergrund. Sie können eine zweite Terminalsitzung starten, und die erste wird weiter ausgeführt, foowährend Sie andere Aufgaben ausführen .

In X müssen Sie lediglich eine zweite Terminalanwendung starten oder eine andere Registerkarte öffnen, wenn der Terminalemulator Ihrer Wahl über solche Funktionen verfügt.

Wenn Sie dies auf der Konsole nicht geplant haben, müssen Sie zu einem anderen virtuellen Terminal wechseln und sich erneut anmelden.

Wenn Sie einen Terminal-Multiplexer wie verwenden screenoder eine tmuxandere Sitzung darin starten können. Im Bildschirm erfolgt dies beispielsweise mit Ctrl+ Aunmittelbar gefolgt von Ctrl+ C. Um zwischen ihnen zu wechseln, verwenden Sie Ca Cn und Ca Cp, um zwischen Terminalsitzungen hin und her zu wechseln.

ein CVn
quelle
Das heißt, es ist nicht in Bash möglich.
user877329
1
Diese Antwort scheint auf einem Missverständnis des Konzepts eines Hintergrundjobs zu beruhen. Ein Terminal verfügt über ein Attribut "Vordergrundprozessgruppe", das normalerweise von der Shell festgelegt wird. Dadurch können Prozesse in dieser Gruppe vom Terminal lesen und tty-bezogene Signale wie SIGINT empfangen. Alle auf dem Terminal ausgeführten Prozesse, die sich nicht in der Vordergrundprozessgruppe befinden, sind Hintergrundprozesse. Wenn Sie ein neues Terminal erstellen, ist der Vordergrundjob des ursprünglichen Terminals immer noch der Vordergrundjob auf diesem Terminal, auch wenn Sie ihn nicht betrachten.
@ WumpusQ.Wumbley Der Punkt meiner Antwort ist, dass die meisten (alle?) Systeme, die Bash ausführen können, von Natur aus Multitasking sind. Selbst wenn ein Prozess in einem solchen System beispielsweise einen Eingabefokus hat, ist der Prozess selbst von Natur aus nicht "im Vordergrund" . foo selbst (ohne spezifische Überprüfung, die ich in freier Wildbahn vermuten würde, liegt irgendwo zwischen selten und nicht vorhanden) ist es egal, ob es im obersten Fenster ausgeführt wird oder ob etwas seine Ausgabe anzeigt.
Ein CVn
1
Mein Punkt ist, dass, wenn die Frage speziell die Wörter "Hintergrund" und "Job" erwähnt - beides Fachbegriffe mit Bedeutungen, die durch das POSIX-Prozessgruppen-Framework definiert sind - sowie die Mechanismen von Strg-Z und bg, die beide sind Prozessgruppen bearbeiten - und Ihre Antwort schlägt vor, die Prozessgruppenfunktion überhaupt nicht zu verwenden, und Sie verwenden das Wort "Hintergrund" in einer Weise, die nicht der tatsächlichen Definition entspricht - Sie passen Ihre Antwort nicht an die Frage an. Und um mit "Technisch fooläuft schon im Hintergrund" zu beginnen ... nur ... Nein. Technisch.
@ WumpusQ.Wumbley Irgendwie glaube ich nicht, dass das OP den POSIX-Standard gelesen hat und dachte "hmm, ich würde das gerne verwenden, aber ich habe schon angefangen, fooalso was mache ich jetzt?". Wenn Sie diese Antwort fühlen (oder andere Antworten) sind bei der Beantwortung der Frage nicht sinnvoll, möchte ich Sie ermutigt , Ihr Stimmrecht auszuüben sowie zu verlassen , eine Antwort der eigenen Antwort auf die Frage aus , was Sie fühlen , den richtigen Winkel, anstatt über eine der Antworten auf die Frage streiten . Vielleicht haben Sie zum Beispiel das Gefühl, dass die Antwort von l0b0 besser ist, aber meine Antwort bietet eine Möglichkeit, zumindest ungefähr das zu tun, was das OP will.
Ein CVn
3

Wenn Sie &nach dem Befehl ( foo &) ein Zeichen hinzufügen, wird es sofort als Hintergrund angezeigt. Ich glaube jedoch, dass es in einer Standard- Terminal- / Shell-Konfiguration keine Möglichkeit gibt, etwas sofort in den Hintergrund zu rücken, wenn es im Vordergrund steht.

l0b0
quelle
3

Das Senden einer Anwendung vom Vordergrund in den Hintergrund erfordert die Zusammenarbeit sowohl des Terminals als auch der Shell. Das Terminal kann dies nicht alleine tun, da die Shell die Prozessgruppe im Vordergrund festlegen muss. Die Shell kann dies nicht alleine tun, da das Terminal den Tastendruck verarbeiten muss (die Shell steht nicht im Vordergrund, kann also keinen Tastendruck empfangen).

Ich habe eine zsh-Konfiguration, in der ich kurz hintereinander zweimal Ctrl+ drücken kann Z. Die erste Presse unterbricht den Vorgang und die zweite Presse setzt ihn im Hintergrund fort. Ich weiß nicht, wie ich es auf Bash portieren soll.

Wenn Sie in einem Terminalemulator arbeiten, mit dem Sie Tastenanschläge einfügen können, können Sie einfügen ^Zbg^M(unter Verwendung der ^Notation für Steuerzeichen). Führen Sie beispielsweise mit einem X11-Terminalemulator aus, xdotool --window 1234 Ctrl_L+Z b g Returnwobei 1234 die Fenster-ID des Terminalemulators ist. Führen Sie unter Bildschirm aus, screen -S foo -p 12 -X stuff $'\032bg\r'wo fooder Name der Bildschirmsitzung und 12die Fenster-ID angegeben sind.

Gilles 'SO - hör auf böse zu sein'
quelle
2

Wenn Ihre Eingabe für den Fall nicht schnell genug ist, führen Sie sie kill -s SIGSTOP 1023 && kill -s SIGCONT 1023von einer anderen Shell aus und nehmen Sie 1023 als Ziel-PID an.

HAFTUNGSAUSSCHLUSS: Wie Ruslan wahrscheinlich wusste, startet diese Sequenz den Job tatsächlich so schnell neu, dass sie bashihn nicht bemerkt.

41754
quelle
Wie würde es den Job in den Hintergrund stellen?
Ruslan
Wie schnell ist schnell?
user877329