Mulai proses pada tty yang berbeda


31

Setelah sekitar satu jam Googling ini, saya tidak percaya tidak ada yang benar-benar mengajukan pertanyaan ini sebelumnya ...

Jadi saya punya skrip yang berjalan di TTY1. Bagaimana saya membuat skrip itu meluncurkan beberapa program arbitrer di TTY2?

  • Saya menemukan tty, yang memberi tahu Anda TTY saat ini.
  • Saya menemukan writevt, yang menulis satu baris teks ke TTY yang berbeda.
  • Saya menemukan chvt, perubahan TTY mana yang sedang ditampilkan.

Saya tidak ingin menampilkan TTY2. Saya hanya ingin skrip utama untuk melanjutkan eksekusi secara normal, tetapi jika saya secara manual beralih ke TTY2 saya dapat berinteraksi dengan program kedua.


Dari TTY1, Sudahkah Anda mencoba [command] > /dev/tty2(Anda harus sudah masuk ke tty2)?
Pandya

1
ini bisa menjadi masalah XY ... apa yang ingin Anda capai? apa tujuan keseluruhan?
Olivier Dulac

Jawaban:


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

Selama tidak ada lagi yang menggunakan TTY lainnya ( /dev/tty2dalam contoh ini), ini harus bekerja. Ini termasuk gettyproses yang mungkin menunggu seseorang untuk masuk; memiliki lebih dari satu proses membaca inputnya dari TTY akan menghasilkan hasil yang tidak terduga.

setsid mengurus memulai perintah dalam sesi baru.

Perhatikan bahwa Anda commandharus mengatur sttypengaturan dengan benar, mis. Hidupkan "mode matang" dan onlcragar keluaran baris baru akan menambah carriage return, dll.


2
Itu tidak benar. Anda mencampur terminal pengendali dengan /dev/stdin, /dev/stdout, dan /dev/stderr. psdengan mudah menunjukkan bahwa commandtidak memiliki terminal pengendali sama sekali dalam kasus Anda.
Hauke ​​Laging

1
@ HaukeLaging, pemimpin sesi mengambil kendali terminal segera setelah terminal dibuka. Masalahnya adalah perangkat terminal tidak terbuka oleh ketua sesi. Harus diperbaiki sekarang.
Stéphane Chazelas

@ StéphaneChazelas yang saya uji sleep 1000dan masih tidak berfungsi di sini. Saya menggunakan pseudo tty, meskipun (seharusnya tidak membuat perbedaan, saya kira).
Hauke ​​Laging

@ HaukeLaging Bagaimana tepatnya Anda melakukannya? Apakah terminal itu belum memiliki sesi pengendali ( Selama tidak ada lagi yang menggunakan bagian TTY lainnya )?
Stéphane Chazelas

1
@ StéphaneChazelas Saya berlari setsid sh -c 'exec sleep 1000 <>/dev/pts/4 >&0 2>&1'di jendela terminal emulator. /dev/pts/4adalah jendela emulator terminal lainnya (pengguna yang sama, dengan bashmenjalankan).
Hauke ​​Laging

6

Pada tty kedua biasanya akan ada program yang berjalan, baik program masuk atau beberapa shell seperti bash. Jika Anda ingin interaksi, Anda harus mengganti program login dengan milik Anda, atau memberi tahu shell untuk menjalankan program seolah-olah program tersebut dimulai dari commandline.

Solusi yang lebih sederhana, IMO, akan memulai tmuxsesi setelah masuk ke layar kedua dan kemudian gunakan:

tmux send yourcommand ENTER

untuk memulai program pada tmuxsesi yang akan ditampilkan setelah Anda beralih ke terminal kedua.


2

Saya baru saja menemukan:

Bagaimana saya bisa meluncurkan aplikasi dari 2 ttys saat peluncuran?

Salah satu komentar menyebutkan sesuatu yang disebut openvt. Perintah ini tampaknya melakukan hal yang persis saya kejar!

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

Kecuali ada yang tahu yang berbeda, saya pikir ini mungkin cara yang "benar" untuk melakukan ini.

(Saya baru saja mencobanya, dan sepertinya berfungsi dengan baik - meskipun gettysedang berjalan, ia mengambil terminal yang tidak digunakan berikutnya. Saya kira VTs tidak bisa "dibuka" sampai Anda beralih ke yang lain untuk mencoba masuk ...)


0

saya memulai sesi grafis baru pada vt5 dengan mengikuti perintah

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

sebagai contoh :

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

Jika Anda ingin meluncurkan aplikasi grafis pada sesi grafis yang sudah aktif, Anda dapat melakukannya dengan:

DISPLAY=:0 "/usr/bin/playonlinux"
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.