Démarrer un processus sur un autre terminal

31

Après environ une heure de recherche sur Google, je ne peux pas croire que personne n'ait posé cette question auparavant ...

J'ai donc un script en cours d'exécution sur TTY1. Comment faire pour que ce script lance un programme arbitraire sur TTY2?

  • J'ai trouvé tty, qui vous indique sur quel ATS vous êtes actuellement.
  • J'ai trouvé writevt, qui écrit une seule ligne de texte sur un autre ATS.
  • J'ai trouvé chvt, ce qui change quel TTY est actuellement affiché.

Je ne veux pas afficher TTY2. Je veux juste que le script principal continue de s'exécuter normalement, mais si je passe manuellement à TTY2, je peux interagir avec le deuxième programme.

MathematicalOrchid
la source
Depuis TTY1, avez-vous essayé [command] > /dev/tty2(vous devez déjà être connecté à tty2)?
Pandya
1
cela pourrait être un problème XY ... qu'essayez-vous de réaliser? quel est l'objectif global?
Olivier Dulac

Réponses:

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

Tant que rien d'autre n'utilise l'autre ATS ( /dev/tty2dans cet exemple), cela devrait fonctionner. Cela inclut un gettyprocessus qui peut attendre que quelqu'un se connecte; ayant plus d'un processus de lecture de son entrée à partir d' un ATS va conduire à des résultats inattendus.

setsid prend soin de démarrer la commande dans une nouvelle session.

Notez que vous commanddevrez prendre soin de régler sttycorrectement les paramètres, par exemple activer le "mode cuit" et de onlcrsorte que la sortie d'une nouvelle ligne ajoute un retour chariot, etc.

gémir
la source
2
Ce n'est pas correct. Vous mélangez le terminal de contrôle avec /dev/stdin, /dev/stdoutet /dev/stderr. psmontre facilement qu'il commandn'a pas de terminal de contrôle du tout dans votre cas.
Hauke ​​Laging du
1
@HaukeLaging, un chef de session prend le contrôle d'un terminal dès qu'il l'ouvre. Le problème était que le terminal n'était pas ouvert par le chef de session. Devrait être corrigé maintenant.
Stéphane Chazelas
@ StéphaneChazelas J'ai testé avec sleep 1000et ça ne marche toujours pas ici. J'ai utilisé un pseudo tty, cependant (cela ne devrait pas faire de différence, je suppose).
Hauke ​​Laging
@HaukeLaging Comment l'avez-vous fait exactement? Ce terminal n'avait-il pas déjà une session de contrôle ( tant que rien d'autre n'utilise l'autre partie TTY )?
Stéphane Chazelas
1
@ StéphaneChazelas J'ai couru setsid sh -c 'exec sleep 1000 <>/dev/pts/4 >&0 2>&1'dans une fenêtre d'émulateur de terminal. /dev/pts/4est une autre fenêtre d'émulateur de terminal (même utilisateur, en bashcours d' exécution).
Hauke ​​Laging du
6

Sur le deuxième terminal, il y aura normalement un programme en cours d'exécution, soit un programme de connexion, soit un shell comme bash. Si vous souhaitez une interaction, vous devrez soit remplacer le programme de connexion par le vôtre, soit demander à un shell d'exécuter le programme comme si le programme avait été démarré à partir de la ligne de commande.

Une solution plus simple, IMO, serait de démarrer une tmuxsession après vous être connecté au deuxième écran, puis d'utiliser:

tmux send yourcommand ENTER

pour démarrer le programme dans la tmuxsession qui s'affichera après le passage au deuxième terminal.

Anthon
la source
2

Je viens de faire une découverte:

Comment puis-je lancer des applications à partir de 2 ttys au lancement?

L'un des commentaires mentionne quelque chose appelé openvt. Cette commande semble faire exactement ce que je recherche!

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

À moins que quelqu'un sait différent, je pense que c'est probablement la « bonne » façon de le faire.

(Je viens de l'essayer, et cela semble bien fonctionner - même s'il gettyest en cours d'exécution, il choisit le prochain terminal inutilisé. Je suppose que les VT ne sont pas "ouverts" jusqu'à ce que vous passiez à l'un pour essayer de vous connecter ...)

MathematicalOrchid
la source
0

je démarre une nouvelle session graphique sur le vt5 avec la commande follow

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

par exemple :

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

Si vous souhaitez lancer une application graphique sur une session graphique déjà active, vous pouvez le faire avec:

DISPLAY=:0 "/usr/bin/playonlinux"
inukaze
la source