Iniciar um processo em um tty diferente

31

Depois de uma hora pesquisando no Google, não acredito que ninguém tenha feito essa pergunta antes ...

Então, eu tenho um script em execução no TTY1. Como faço para que esse script inicie algum programa arbitrário no TTY2?

  • Eu encontrei tty, que diz em qual TTY você está atualmente.
  • Eu descobri writevt, que escreve uma única linha de texto em um TTY diferente.
  • Eu encontrei chvt, que altera qual TTY é exibido atualmente.

Não quero exibir TTY2. Eu só quero que o script principal continue executando normalmente, mas se eu alternar manualmente para o TTY2, posso interagir com o segundo programa.

MathematicsOrchid
fonte
No TTY1, você já tentou [command] > /dev/tty2(você já deve estar logado no tty2)?
precisa
11
isso pode ser um problema XY ... o que você está tentando alcançar? qual é o objetivo geral?
Olivier Dulac

Respostas:

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

Enquanto nada mais estiver usando o outro TTY ( /dev/tty2neste exemplo), isso deve funcionar. Isso inclui um gettyprocesso que pode estar esperando alguém entrar; ter mais de um processo lendo sua entrada a partir de um TTY irá levar a resultados inesperados.

setsid cuida de iniciar o comando em uma nova sessão.

Observe que commandserá necessário definir as sttyconfigurações corretamente, por exemplo, ativar o "modo cozido" e, onlcrpara que a saída de uma nova linha adicione um retorno de carro, etc.

Wurtel
fonte
2
Isso não está correto. Você mistura-se o terminal de controle com /dev/stdin, /dev/stdoute /dev/stderr. psmostra facilmente que commandnão possui um terminal de controle no seu caso.
Hauke Laging
11
@HaukeLaging, um líder de sessão assume o controle de um terminal assim que ele é aberto. O problema era que o dispositivo do terminal não estava aberto pelo líder da sessão. Deve ser corrigido agora.
Stéphane Chazelas
@ StéphaneChazelas eu testei com sleep 1000e ainda não funciona aqui. Eu usei uma pseudo-tty, no entanto (acho que não deveria fazer diferença).
Hauke ​​Laging
@HaukeLaging Como exatamente você fez isso? Esse terminal ainda não tinha uma sessão de controle (o contanto que nada mais esteja usando a outra parte TTY )?
Stéphane Chazelas
11
@ StéphaneChazelas Corri setsid sh -c 'exec sleep 1000 <>/dev/pts/4 >&0 2>&1'em uma janela de emulador de terminal. /dev/pts/4é outra janela do emulador de terminal (mesmo usuário, com bashexecução).
Hauke ​​Laging
6

No segundo tty, normalmente haverá um programa em execução, algum programa de login ou algum shell como o bash. Se você deseja interação, teria que substituir o programa de login pelo seu ou pedir ao shell para executar o programa como se o programa tivesse sido iniciado a partir da linha de comando.

Uma solução mais simples, a IMO, seria iniciar uma tmuxsessão após fazer login na segunda tela e depois usar:

tmux send yourcommand ENTER

para iniciar o programa na tmuxsessão que será exibida depois que você alternar para o segundo terminal.

Anthon
fonte
2

Acabei de fazer uma descoberta:

Como posso iniciar aplicativos de 2 ttys no lançamento?

Um dos comentários menciona algo chamado openvt. Este comando parece fazer exatamente o que estou procurando!

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

A menos que alguém saiba diferente, acho que essa é provavelmente a maneira "correta" de fazer isso.

(Eu apenas tentei e parece funcionar bem - embora gettyesteja em execução, ele escolhe o próximo terminal não utilizado. Acho que os VTs não são "abertos" até que você mude para um para tentar fazer login ...)

MathematicsOrchid
fonte
0

inicio uma nova sessão gráfica no vt5 com o comando follow

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

por exemplo :

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

Se você deseja iniciar um aplicativo gráfico em uma sessão gráfica já ativa, é possível:

DISPLAY=:0 "/usr/bin/playonlinux"
inukaze
fonte