Bắt đầu một quá trình trên một tty khác nhau


31

Sau khoảng một giờ làm việc này, tôi không thể tin rằng chưa có ai thực sự hỏi câu hỏi này trước khi ...

Vì vậy, tôi đã có một tập lệnh chạy trên TTY1. Làm cách nào để tạo tập lệnh đó khởi chạy một số chương trình tùy ý trên TTY2?

  • Tôi đã tìm thấy tty, thông báo cho bạn biết TTY nào bạn đang sử dụng.
  • Tôi tìm thấy writevt, nó viết một dòng văn bản lên một TTY khác.
  • Tôi đã tìm thấy chvt, những thay đổi mà TTY hiện đang được hiển thị.

Tôi không muốn hiển thị TTY2. Tôi chỉ muốn tập lệnh chính tiếp tục thực thi bình thường, nhưng nếu tôi tự chuyển sang TTY2, tôi có thể tương tác với chương trình thứ hai.


Từ TTY1, bạn đã thử chưa [command] > /dev/tty2(bạn phải đăng nhập vào tty2)?
Pandya

1
đây có thể là một biểu tượng ... bạn đang cố gắng đạt được điều gì? mục tiêu tổng thể là gì?
Olivier Dulac

Câu trả lời:


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

Miễn là không có gì khác sử dụng TTY khác ( /dev/tty2trong ví dụ này), điều này sẽ hoạt động. Điều này bao gồm một gettyquá trình có thể đang chờ ai đó đăng nhập; có nhiều hơn một quá trình đọc đầu vào của nó từ TTY sẽ dẫn đến kết quả không mong muốn.

setsid chăm sóc bắt đầu lệnh trong một phiên mới.

Lưu ý rằng commandsẽ phải chăm sóc cài đặt các sttycài đặt một cách chính xác, ví dụ: bật "chế độ nấu" và onlcrdo đó, việc xuất một dòng mới sẽ thêm trở lại vận chuyển, v.v.


2
Đó là không đúng. Bạn trộn lên các thiết bị đầu cuối kiểm soát với /dev/stdin, /dev/stdout, và /dev/stderr. psdễ dàng cho thấy rằng commandkhông có thiết bị đầu cuối kiểm soát nào trong trường hợp của bạn.
Hauke ​​Laging

1
@HaukeLaging, một nhà lãnh đạo phiên kiểm soát một thiết bị đầu cuối ngay khi nó mở nó. Vấn đề là thiết bị đầu cuối không được mở bởi nhà lãnh đạo phiên. Nên sửa ngay.
Stéphane Chazelas

@ StéphaneChazelas Tôi đã thử nghiệm sleep 1000và nó vẫn không hoạt động ở đây. Tôi đã sử dụng một giả giả, mặc dù (tôi không nên làm cho một sự khác biệt, tôi đoán).
Hauke ​​Laging

@HaukeLaging Làm thế nào chính xác bạn đã làm điều đó? Có phải thiết bị đầu cuối đó chưa có phiên kiểm soát ( miễn là không có gì khác sử dụng phần TTY khác )?
Stéphane Chazelas

1
@ StéphaneChazelas Tôi đã chạy setsid sh -c 'exec sleep 1000 <>/dev/pts/4 >&0 2>&1'trong một cửa sổ giả lập thiết bị đầu cuối. /dev/pts/4là một cửa sổ giả lập thiết bị đầu cuối khác (cùng người dùng, bashđang chạy).
Hauke ​​Laging

6

Trên tty thứ hai, thông thường sẽ có một chương trình đang chạy, một số chương trình đăng nhập hoặc một số shell như bash. Nếu bạn muốn tương tác, bạn sẽ phải thay thế chương trình đăng nhập bằng chương trình của bạn hoặc yêu cầu trình bao chạy chương trình như thể chương trình được bắt đầu từ dòng lệnh.

Một giải pháp đơn giản hơn, IMO, sẽ là bắt đầu một tmuxphiên sau khi đăng nhập vào màn hình thứ hai và sau đó sử dụng:

tmux send yourcommand ENTER

để khởi động chương trình trong tmuxphiên sẽ hiển thị sau khi bạn chuyển sang thiết bị đầu cuối thứ hai.


2

Tôi mới thực hiện một khám phá:

Làm cách nào tôi có thể khởi chạy ứng dụng từ 2 tty khi khởi chạy?

Một trong những ý kiến ​​đề cập đến một cái gì đó gọi là openvt. Lệnh này xuất hiện để làm chính xác những gì tôi đang theo sau!

http://linux.about.com/l Library / cmd / blcmdl1_openvt.htm

Trừ khi có ai biết khác nhau, tôi nghĩ rằng đây có lẽ là cách "chính xác" để làm điều này.

(Tôi vừa thử nó, và nó có vẻ hoạt động tốt - mặc dù gettyđang chạy, nó chọn thiết bị đầu cuối không sử dụng tiếp theo. Tôi đoán VT không được "mở" cho đến khi bạn chuyển sang một để thử đăng nhập ...)


0

tôi bắt đầu một phiên đồ họa mới trên vt5 bằng lệnh follow

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

ví dụ :

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

Nếu bạn muốn khởi chạy một ứng dụng đồ họa trên phiên đồ họa đã hoạt động, bạn có thể thực hiện với:

DISPLAY=:0 "/usr/bin/playonlinux"
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.