Iniciar un proceso en un tty diferente


31

Después de aproximadamente una hora de buscar en Google esto, no puedo creer que nadie haya hecho esta pregunta antes ...

Así que tengo un script ejecutándose en TTY1. ¿Cómo hago para que ese script inicie algún programa arbitrario en TTY2?

  • Encontré tty, que te dice en qué TTY estás actualmente.
  • Encontré writevt, que escribe una sola línea de texto en un TTY diferente.
  • Encontré chvt, que cambia qué TTY se muestra actualmente.

No quiero mostrar TTY2. Solo quiero que el script principal continúe ejecutándose normalmente, pero si cambio manualmente a TTY2 puedo interactuar con el segundo programa.


Desde TTY1, ¿lo ha intentado [command] > /dev/tty2(ya debe iniciar sesión en tty2)?
Pandya

1
esto podría ser un problema XY ... ¿qué estás tratando de lograr? ¿Cuál es el objetivo general?
Olivier Dulac

Respuestas:


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

Mientras nada más esté usando el otro TTY ( /dev/tty2en este ejemplo), esto debería funcionar. Esto incluye un gettyproceso que puede estar esperando que alguien inicie sesión; tener más de un proceso de lectura de su entrada desde un TTY será conducir a resultados inesperados.

setsid se encarga de iniciar el comando en una nueva sesión.

Tenga en cuenta que commandtendrá que ocuparse de configurar los sttyajustes correctamente, p. Ej., Active el "modo cocinado" y, de este onlcrmodo, al generar una nueva línea se agregará un retorno de carro, etc.


2
Eso no es correcto. Se mezcla hasta la terminal de control con /dev/stdin, /dev/stdouty /dev/stderr. psmuestra fácilmente que commandno tiene un terminal de control en absoluto en su caso.
Hauke ​​Laging

1
@HaukeLaging, un líder de sesión toma el control de un terminal tan pronto como lo abre. El problema era que el dispositivo de la terminal no estaba abierto por el líder de la sesión. Debería arreglarse ahora.
Stéphane Chazelas

@ StéphaneChazelas probé sleep 1000y todavía no funciona aquí. Sin embargo, usé un pseudo tty (no debería hacer una diferencia, supongo).
Hauke ​​Laging

@HaukeLaging ¿Cómo lo hiciste exactamente? ¿Ese terminal ya no tenía una sesión de control ( mientras que nada más esté usando la otra parte TTY )?
Stéphane Chazelas

1
@ StéphaneChazelas Corrí setsid sh -c 'exec sleep 1000 <>/dev/pts/4 >&0 2>&1'en una ventana de emulador de terminal. /dev/pts/4es otra ventana del emulador de terminal (mismo usuario, con bashejecución).
Hauke ​​Laging

6

En el segundo tty normalmente habrá un programa en ejecución, ya sea algún programa de inicio de sesión o algún shell como bash. Si desea interactuar, deberá reemplazar el programa de inicio de sesión con el suyo o indicarle a un shell que ejecute el programa como si el programa se iniciara desde la línea de comandos.

Una solución más simple, IMO, sería iniciar una tmuxsesión después de iniciar sesión en la segunda pantalla y luego usar:

tmux send yourcommand ENTER

para iniciar el programa en la tmuxsesión que se mostrará después de cambiar al segundo terminal.


2

Acabo de hacer un descubrimiento:

¿Cómo puedo iniciar aplicaciones desde 2 ttys en el lanzamiento?

Uno de los comentarios menciona algo llamado openvt. ¡Este comando parece hacer exactamente lo que busco!

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

A menos que alguien sepa algo diferente, creo que esta es probablemente la forma "correcta" de hacerlo.

(Acabo de probarlo y parece funcionar bien, aunque se gettyestá ejecutando, elige el siguiente terminal no utilizado. Supongo que los VT no se "abren" hasta que cambie a uno para intentar iniciar sesión ...)


0

Comienzo una nueva sesión gráfica en el vt5 con el siguiente comando

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

por ejemplo :

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

Si desea iniciar una aplicación gráfica en una sesión gráfica ya activa, puede hacerlo con:

DISPLAY=:0 "/usr/bin/playonlinux"
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.