Chạy màn hình (GNU) từ tập lệnh


11

Tôi muốn khởi chạy một số ứng dụng bên trong phiên màn hình nhưng từ một kịch bản.
Nếu không có script tôi sẽ chỉ khởi chạy màn hình, sau đó mở N windows bằng crtl-ac và thực thi các chương trình trong mỗi cửa sổ.

Tôi đã thử như sau

screen -d -m -S test
screen -S test -X exec tail -f /var/log/messages
screen -S test -X screen
screen -S test -X exec tail -f /var/log/xinetd.log

Nhưng khi tôi đính kèm thì đuôi phiên không chạy. Nếu tôi đính kèm phiên ngay sau đó screen -d -m -S startupvà chạy screen -S startup -X exec tail -f /var/log/messagestừ thiết bị đầu cuối khác thì nó hoạt động.

Tôi đã bỏ lỡ một cái gì đó?

Chỉnh sửa sau khi AlexD trả lời:

Một giải pháp làm việc một nửa là

screen -d -m -S test tail -f /var/log/messages
screen -S test -X screen tail -f /var/log/xinetd.log

Lệnh màn hình chuỗi (lệnh sau -X) với lệnh đang hoạt động trong khi exec không có thể vì exec thực hiện một cửa sổ hiện tại được xác định trong khi không có cửa sổ hiện tại khi màn hình bị tách ra. Cảm ơn AlexD cho lời khuyên này.

Nhưng có một tác dụng phụ kỳ lạ: khi chương trình dừng lại (nếu bạn đính kèm phiên màn hình và crtl-c đuôi, hoặc giết đuôi), cửa sổ màn hình sẽ đóng lại.
Vì vậy, hành vi không giống như Crtl-A c và chạy lệnh
Một tác dụng phụ khác là bạn không thể xâu chuỗi 2 lệnh


screen luôn luôn chấm dứt khi lệnh được khởi chạy kết thúc - đó là một tính năng bình thường của công cụ :) .. vì vậy nếu bạn chạy screen top, khi bạn thoát top, screencũng sẽ thoát
warren

Có tôi bây giờ, đây là lý do tại sao tôi đã thử khởi chạy màn hình dưới dạng deamon sau đó sử dụng exec sau đó sử dụng lệnh màn hình để mở một cửa sổ mới (lau vỏ). Tôi cũng đã thử tu bash trước giữa exec và tail hoặc giữa màn hình và nói nhưng không hoạt động
bán kính

Câu trả lời:


14

Các screen -S test -X screen commandlệnh là những gì bạn cần phải thêm cửa sổ để phiên daemon của bạn, nhưng không phải vì những lý do bạn đưa ra. Nó hoạt động vì -X nhận lệnh màn hình chứ không phải lệnh shell và lệnh màn hình để tạo cửa sổ được gọi, màn hình khó hiểu. Không có lệnh màn hình exec. Không có chuỗi nào, trừ khi bạn xây dựng lệnh của mình bằng cách sử dụng shell script (như thế này screen -S script -X screen sh -c 'command1; command2;':).

Gọi screen -S test -X screenkhông có lệnh là vô ích vì lệnh mặc định là shell và một khi bạn đã sinh ra một shell, bạn không có cách không tương tác (và không sai lệch) để chạy các lệnh bên trong shell đó. Nó là tốt hơn để chạy lệnh của chính nó, mà không cần một vỏ tương tác. Một tác dụng phụ là khi lệnh thoát ra, cửa sổ màn hình sẽ không còn con nữa và sẽ đóng lại.

Bây giờ, bạn có thể yêu cầu màn hình giữ cửa sổ mở bằng mọi cách, sau khi lệnh đã thoát. Sử dụng zombielệnh màn hình để kích hoạt điều đó. Trình tự của bạn trông giống như:

screen -d -m -S script
screen -S script -X zombie qr
screen -S script -X screen tail -f /var/log/messages
screen -S script -X screen tail -f /var/log/xinetd.log

Để gắn lại tương tác:

screen -S script -r

Và cuối cùng, bạn có thể viết lại các lệnh -X này dưới dạng tập lệnh screenrc.

Màn hình:

zombie qr
screen tail -f /var/log/messages
screen tail -f /var/log/xinetd.log

Kịch bản:

screen -d -m -S script -c screenrc

Có tôi biết rằng -X đang nhận lệnh màn hình, ý tôi là khi tôi nói "Lệnh màn hình chuỗi (lệnh sau -X)" (Ok không rõ lắm) nhưng có một lệnh thực thi màn hình, hãy nhìn người đàn ông nhưng như bạn đã nói, không có cách nào để nó hoạt động như mong muốn trong chế độ không tương tác. Dù sao với giải pháp AlexD và lệnh zombie bạn thêm Tôi đã có những gì tôi muốn! Cảm ơn bạn
bán kính

@Tobu: +200 để đề cập đến zombie! Cuối cùng tôi đã không bao giờ nhận thấy nó trong hướng dẫn khủng khiếp đó!
dây leo

6

Nếu bạn muốn có hiệu ứng tương tự như vậy Ctrl-A cthì bạn nên sử dụng screenthay vì exec:

màn hình -S test -X đuôi màn hình -f / var / log / message
màn hình -S test -X màn hình
màn hình -S test -X đuôi màn hình -f /var/log/xinetd.log

Ngoài ra, bạn có thể di chuyển các lệnh của mình ở trên sang $HOME/.screenrc-younameittệp (không có screen -S test -Xtiền tố) và khởi chạy screen -c $HOME/.screenrc-younameitkhi bạn muốn tạo phiên màn hình cụ thể.


Ctrl-A c nằm trong dòng thứ 3 của tôi, tôi đoán exec không hoạt động vì exec chạy lệnh trong các cửa sổ hiện tại có thể không được xác định khi màn hình bị tách ra. Màn hình chuỗi giải quyết của bạn và lệnh là tốt, tôi nên đã thử nó! Tôi sẽ tự thêm câu trả lời vì câu trả lời của bạn thiếu phần tạo phiên và có một dòng vô dụng (cái thứ 2, bỏ qua 1 cửa sổ)
bán kính

Trong thực tế, nó không hoạt động như mong đợi, các cửa sổ đóng lại ngay khi chương trình dừng lại. nếu bạn thực hiện màn hình -S test -X màn hình ls, cửa sổ sẽ đóng và bạn sẽ không bao giờ thấy kết quả
bán kính

1

sử dụng byobu là một lựa chọn?


Tôi mới dùng thử, tôi không thấy nó có thể giúp như thế nào nhưng nếu bạn có giải pháp làm việc với byobu thì có thể ổn, tôi thích giải pháp chỉ màn hình hơn nhưng sử dụng add on thì tốt hơn là không có giải pháp!
bán kính

1

Tôi đã làm điều tương tự tối nay, tôi muốn mở màn hình với một vài tập tin được mở trước. Tôi phải mất một thời gian để tìm ra tất cả những điều này nhưng cuối cùng tôi cũng nghĩ ra được những thứ sau đây có vẻ hoạt động khá độc đáo:


#1/bin/sh 
screen -d -m -S CS140 
screen -S CS140 -X screen -t thread.c 
screen -p 1 -S CS140 -X eval 'stuff "vim cs140-ps2/src/threads/thread.c\015"'
screen -S CS140 -X screen -t thread.h 
screen -p 2 -S CS140 -X eval 'stuff "vim cs140-ps2/src/threads/thread.h\015"'
screen -S CS140 -X screen -t palloc.c 
screen -p 3 -S CS140 -X eval 'stuff "vim cs140-ps2/src/threads/palloc.c\015"'
screen -S CS140 -X screen -t intr-stubs.h 
screen -p 4 -S CS140 -X eval 'stuff "vim cs140-ps2/src/threads/intr-stubs.h\015"'
screen -S CS140 -X screen -t pagedir.c 
screen -p 5 -S CS140 -X eval 'stuff "vim cs140-ps2/src/userprog/pagedir.c\015"'
screen -r -d CS140 

Điều này sẽ tạo ra sáu màn hình khác nhau, với màn hình 1-5 đã mở các tệp khác nhau. Tôi không biết tất cả các chi tiết cụ thể nhưng 'nội dung' về cơ bản cho màn hình văn bản được trích dẫn sau đây không phải là lệnh màn hình. 'Eval' sau đó từ chối mọi thứ có trong các trích dẫn. Không có điều này, screen -p 4 -S CS140 -X stuff "vim cs140-ps2/src/threads/intr-stubs.h\015" chỉ đơn giản là ống dẫn văn bản trích dẫn mà không thực hiện nó. Eval sẽ đọc '\ 015' dưới dạng một dòng mới và do đó thực thi văn bản trước đó.

Về các chi tiết khác, screen -p 1 -S CS140 -X CMD yêu cầu trình bao gửi 'CMD' đến cửa sổ đầu tiên của phiên màn hình có tên 'CS140'.

Mong rằng sẽ giúp!

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.