Inizia un processo su un diverso tty


31

Dopo circa un'ora di Google, non riesco a credere che nessuno abbia effettivamente posto questa domanda prima ...

Quindi ho uno script in esecuzione su TTY1. Come posso fare in modo che lo script avvii un programma arbitrario su TTY2?

  • Ho trovato tty, che ti dice su quale TTY sei attualmente.
  • Ho trovato writevt, che scrive una singola riga di testo su un TTY diverso.
  • Ho trovato chvt, che cambia quale TTY è attualmente visualizzato.

Non voglio visualizzare TTY2. Voglio solo che lo script principale continui a funzionare normalmente, ma se passo manualmente a TTY2 posso interagire con il secondo programma.


Da TTY1, hai provato [command] > /dev/tty2(devi già aver effettuato l'accesso a tty2)?
Pandya,

1
questo potrebbe essere un problema XY ... cosa stai cercando di ottenere? qual è l'obiettivo generale?
Olivier Dulac il

Risposte:


32
setsid sh -c 'exec command <> /dev/tty2 >&0 2>&1'

Finché nient'altro sta usando l'altro TTY ( /dev/tty2in questo esempio), questo dovrebbe funzionare. Ciò include un gettyprocesso che potrebbe essere in attesa che qualcuno acceda al login; avere più di un processo di lettura dell'input da un TTY sarà portare a risultati inaspettati.

setsid si occupa dell'avvio del comando in una nuova sessione.

Si noti che commanddovrà occuparsi di impostare sttycorrettamente le impostazioni, ad es. Attivare la "modalità di cottura" e in onlcrmodo che l'output di una nuova riga aggiunga un ritorno a capo, ecc.


2
Questo non è corretto Mescolate il terminale di controllo con /dev/stdin, /dev/stdoute /dev/stderr. psmostra facilmente che commandnon ha affatto un terminale di controllo nel tuo caso.
Hauke ​​Laging,

1
@HaukeLaging, un leader della sessione prende il controllo di un terminale non appena lo apre. Il problema era che il terminale non era aperto dal leader della sessione. Ora dovrebbe essere risolto.
Stéphane Chazelas,

@ StéphaneChazelas con cui ho provato sleep 1000e ancora non funziona qui. Ho usato una pseudo tty, però (non dovrebbe fare la differenza, immagino).
Hauke ​​Laging,

@HaukeLaging Come hai fatto esattamente? Quel terminale non aveva già una sessione di controllo ( fintanto che nient'altro sta usando l'altra parte TTY )?
Stéphane Chazelas,

1
@ StéphaneChazelas Ho corso setsid sh -c 'exec sleep 1000 <>/dev/pts/4 >&0 2>&1'in una finestra dell'emulatore terminale. /dev/pts/4è un'altra finestra dell'emulatore di terminale (stesso utente, con in bashesecuzione).
Hauke ​​Laging,

6

Sul secondo tty normalmente ci sarà un programma in esecuzione, o un programma di login o una shell come bash. Se si desidera l'interazione, è necessario sostituire il programma di accesso con il proprio oppure dire a una shell di eseguire il programma come se il programma fosse stato avviato dalla riga di comando.

Una soluzione più semplice, IMO, sarebbe quella di avviare una tmuxsessione dopo aver effettuato l'accesso alla seconda schermata e quindi utilizzare:

tmux send yourcommand ENTER

per avviare il programma nella tmuxsessione che verrà visualizzato dopo il passaggio al secondo terminale.


2

Ho appena fatto una scoperta:

Come posso avviare le applicazioni da 2 ttys all'avvio?

Uno dei commenti menziona qualcosa chiamato openvt. Questo comando sembra fare esattamente quello che sto cercando!

http://linux.about.com/library/cmd/blcmdl1_openvt.htm

A meno che qualcuno non sappia diversamente, penso che questo sia probabilmente il modo "corretto" per farlo.

(L'ho appena provato e sembra funzionare bene - anche se gettyè in esecuzione, seleziona il prossimo terminale inutilizzato. Immagino che i VT non si "aprano" fino a quando non si passa a uno per provare ad accedere ...)


0

inizio una nuova sessione grafica sul vt5 con il seguente comando

xinit "/usr/bin/<binary_executable>" -- :1 vt5

per esempio :

xinit "/usr/bin/playonlinux" -- :1 vt5

Se vuoi avviare un'applicazione grafica su sessione grafica già attiva, puoi fare con:

DISPLAY=:0 "/usr/bin/playonlinux"
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.