Posiziona il lavoro in background senza congelamento


9

Di 'che inizi il lavoro in questo modo

foo

e poi desidero che tu voglia metterlo in background. Digitando Ctrl+ Ze poi bgfa il trucco, ma si bloccherà footra Ctrl+ Ze bg. Come posso posizionare foo in background senza prima congelarlo?


7
Qual è il caso d'uso? Perché è un problema che il processo si blocca per un breve periodo?
l0b0

Risposte:


4

Tecnicamente foofunziona già in background. È possibile avviare una seconda sessione terminale e la prima continuerà a funzionare foomentre si eseguono altre operazioni.

In X, ciò implica semplicemente l'avvio di una seconda applicazione terminale o l'apertura di un'altra scheda se l'emulatore di terminale scelto ha tali funzionalità.

Sulla console, se non l'hai pianificato, dovrai passare a un altro terminale virtuale ed eseguire nuovamente l'accesso.

Se usi un terminale multiplexer come screeno tmuxpuoi avviare un'altra sessione al suo interno. Ad esempio, sullo schermo, questo viene fatto usando Ctrl+ Aimmediatamente seguito da Ctrl+ C. Per passare da una all'altra, usare Ca Cn e Ca Cp per andare avanti e indietro tra le sessioni terminali.


Cioè, non è possibile in bash.
user877329

1
Questa risposta sembra basarsi su un fraintendimento del concetto di lavoro in background. Un terminale ha un attributo "gruppo di processo in primo piano", generalmente impostato dalla shell, che rende i processi in quel gruppo in grado di leggere dal terminale e ricevere segnali relativi a tty come SIGINT. Tutti i processi in esecuzione sul terminale che non fanno parte del gruppo di processi in primo piano sono processi in background. Quando si crea un nuovo terminale, il lavoro in primo piano del terminale originale rimane il lavoro in primo piano su quel terminale, anche se non lo si sta guardando.

@ WumpusQ.Wumbley Il punto della mia risposta è che la maggior parte (tutti?) Dei sistemi che possono eseguire bash sono multi-tasking per loro stessa natura. Su un sistema di questo tipo, anche se un processo ha, diciamo, input focus, non c'è nulla intrinsecamente "in primo piano" sul processo stesso; foo stesso (assente controllo specifico, che immagino in natura sia da qualche parte tra raro e inesistente) non importa se sta funzionando nella finestra più in alto o anche se c'è qualcosa che mostra il suo output.
un CVn il

1
il mio punto è che quando la domanda menziona in modo specifico le parole "background" e "job" - entrambi i termini tecnici con significati definiti dal framework del gruppo di processi POSIX - nonché i meccanismi di Ctrl-Z e bg, entrambi i quali operare su gruppi di processi - e la tua risposta suggerisce di non utilizzare affatto la funzionalità del gruppo di processi e usi la parola "sfondo" in un modo che non corrisponde alla sua definizione effettiva - non stai adattando la tua risposta alla domanda. E per iniziare con "Tecnicamente foofunziona già in background" ... solo ... No. Tecnicamente.

@ WumpusQ.Wumbley In qualche modo non penso che l'OP abbia letto lo standard POSIX e abbia pensato "hmm, mi piacerebbe usarlo, ma ho già iniziato foocosì ora cosa devo fare?". Se ritieni che questa risposta (o altre risposte) non sia utile nel rispondere alla domanda, ti incoraggio a esercitare i tuoi privilegi di voto , nonché a lasciare una tua risposta alla domanda da quello che ritieni sia l'angolazione corretta, piuttosto che discutendo di una delle risposte lasciate sulla domanda. Forse pensi che la risposta di l0b0 sia migliore, ma la mia risposta offre un modo di fare almeno all'incirca ciò che l'OP vuole.
un CVn il

3

L'aggiunta di un &segno dopo il comando ( foo &) lo farà immediatamente in background. Ma credo che non ci sia modo, in una configurazione terminale / shell standard , di mettere immediatamente in background qualcosa una volta che è in primo piano.


3

L'invio di un'applicazione dal primo piano allo sfondo richiede la cooperazione sia dal terminale che dalla shell. Il terminale non può farlo da solo, poiché la shell deve impostare il gruppo di processi in primo piano. La shell non può farcela da sola, perché il terminale deve elaborare la pressione del tasto (la shell non è in primo piano, quindi non può ricevere una pressione del tasto).

Ho una configurazione zsh in cui posso premere Ctrl+ Zdue volte in rapida successione; la prima stampa sospende il processo e la seconda lo riprende in background. Non so come portarlo a Bash.

Se stai eseguendo un emulatore di terminale che ti consente di iniettare i tasti, puoi iniettare ^Zbg^M(usando la ^notazione per i caratteri di controllo). Ad esempio, con un emulatore di terminale X11, eseguire xdotool --window 1234 Ctrl_L+Z b g Returndove 1234 è l'ID della finestra dell'emulatore di terminale. Con Schermo, esegui screen -S foo -p 12 -X stuff $'\032bg\r'dove si footrova il nome della sessione schermo e 12l'ID della finestra.


2

Se la digitazione non è abbastanza rapida per il caso, eseguire kill -s SIGSTOP 1023 && kill -s SIGCONT 1023da un'altra shell, supponendo 1023 come PID di destinazione.

NOTA BENE: Come probabilmente sapeva Ruslan , quella sequenza riavvia il lavoro così rapidamente bashche non se ne accorge.


Come metterebbe il lavoro in secondo piano?
Ruslan,

Quanto è veloce?
user877329
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.