Tạo màn hình và chạy lệnh mà không cần đính kèm


28

Tôi đang làm việc để tự động hóa một thói quen bảo trì liên quan đến việc bắt đầu và dừng một tập lệnh đang chạy trong một phiên màn hình. Cách tiếp cận của tôi là giết phiên màn hình, sau đó khởi động lại nó và chạy lệnh từ trong tập lệnh bằng cách sử dụng các khả năng để tạo màn hình và truyền lệnh mà không cần phải gắn vào màn hình.

Tuy nhiên, tôi đang gặp khó khăn với điều này. Tôi có thể tạo màn hình chính xác mà không cần gắn nó bằng cách sử dụng screen -d -m -S screen_name. Tuy nhiên, nếu tôi chạy một lệnh dựa trên:

screen -S screen_name-X stuff "command 1"'echo -ne '\015''"command 2"'echo -ne '\015''

với tiếng vang -ne '\ 015' được bao bọc bằng backticks thay vì dấu ngoặc đơn. Nó là để mô phỏng người dùng nhấn phím enter vì các lệnh tôi sử dụng đang di chuyển đến một thư mục và thực thi một tập lệnh nằm ở đó. Lệnh này hoạt động, nhưng chỉ khi màn hình đã được gắn vào khi nó được tạo. Khi tôi đang cố gắng tự động hóa quá trình tạo màn hình và chạy các lệnh bên trong nó, tôi muốn tránh phải đính kèm và tách ra trong một tập lệnh. Tôi sẽ thử đề xuất tạo tập lệnh shell chứa các lệnh tôi cần thực thi trong màn hình và chỉnh sửa theo kết quả của mình.

Có cách nào để tạo màn hình và chạy lệnh trong màn hình trong một lệnh hoặc không phải gắn vào màn hình sau khi tạo nhưng trước khi thực hiện lệnh?

Cảm ơn trước.

** Cập nhật - đã thử đề xuất đặt các lệnh tôi cần thực thi trong tập lệnh shell Tôi đã có thể tạo thành công màn hình và thực hiện các lệnh từ bên trong màn hình, nhưng tôi nhận được hành vi khi tập lệnh dừng chạy màn hình cũng đóng lại Đây không phải là một vấn đề vì tập lệnh là tập lệnh ghi nhật ký chỉ dừng lại với kiến ​​thức của quản trị viên hệ thống hoặc thông qua tập lệnh tôi đang cố gắng phát triển, tuy nhiên, tốt hơn là nên thiết lập màn hình theo cách mà màn hình hiển thị không biến mất nếu tập lệnh bị dừng. Có thể đạt được hành vi này? **


1
Tôi gặp vấn đề tương tự và tìm ra giải pháp trên superuser.com cho bất kỳ ai khác tình cờ gặp phải vấn đề này superuser.com/questions/342463/ Kẻ
Dan Herbert

Để giữ cho màn hình mở, bạn có thể sử dụng một cái gì đó như: màn hình bash -c 'echo "test"; / bin / bash '
gwyn

1
Đối với sự cố tự động đóng của bạn, bạn có thể sử dụng một đặc biệt .screenrccó chứa dòng zombie kr, nó sẽ giữ cho cửa sổ hoàn thành mở và bạn có thể nhấn kđể đóng winodw hoặc rchạy lại lệnh trong cửa sổ. Tôi có cái này cho .screenrc mặc định của tôi.
Martin C.

Câu trả lời:


17

Tôi nghĩ rằng bạn có thể đang gặp phải một số vấn đề.

Nếu lệnh kết thúc trước khi bạn gắn lại, màn hình sẽ biến mất. Bạn có thể demo bản này bằng cách sử dụng:

screen -d -m ls -l

Nó sẽ chạy ls -llệnh, nhưng screen -listsẽ không hiển thị khi quá trình màn hình kết thúc.

Tôi cũng không biết bạn đang cố gắng làm gì với thứ \ 015 này. Có lẽ cập nhật câu hỏi của bạn sẽ giúp ích, vì những gì tôi nghĩ bạn đang cố gắng làm là chạy nhiều lệnh trong một phiên màn hình. Điều này nên đơn giản như:

screen -d -m bash -c "command1 ; command2 ; command3"

Nếu chúng được sử dụng nhiều, có lẽ bạn nên tạo một kịch bản shell chỉ chạy các lệnh này, sau đó sử dụng đơn giản hơn:

screen -d -m /path/to/script.sh

Có cách nào để có được hành vi tương tự mà không cần tách màn hình ngay lập tức? Nói rằng tôi muốn bắt đầu một phiên ssh và sau đó tách ra ngay sau đó; screen -d -m sshsẽ tách ra tại dấu nhắc mật khẩu trước khi phiên được thực hiện.
ngôi sao sáng

Điều này không làm việc cho tôi. Thay thế hte "lệnhN" bằng một số chương trình chạy dài, kết quả là không có gì hiển thị screen -list. Ngoài ra, điều này không đặt tên cho màn hình như OP đang cố gắng thực hiện.
Cerin

Tôi đang tìm cách chạy một chương trình python bằng phương pháp này. Tôi đã cố gắng tạo một tập lệnh sh để chạy nó, nhưng không thấy màn hình trong danh sách. Thay vào đó tôi đã sử dụng screen -d -m python EventGenerator.py, nó hoạt động rất tốt
Dan Ciborowski - MSFT

1
Đó có lẽ nên bash -c "commands"thay vìbash "commands"
marcovtwout

Bạn nói đúng, phải có -c.
Xdg

8

Bắt đầu một màn hình tách ra

screen -dmS <screen name>

Thực thi lệnh trong màn hình tách ra được tạo trước đó

screen -S <screen name> -X stuff '<CMD>\n'

Có, bạn cần phải nhập biểu tượng enter để gửi lệnh nếu không nó sẽ chỉ thêm chuỗi vào màn hình.

http://osdir.com/ml/gnu.screen/2003-09/msg00029.html


1
'công cụ' là gì?
Nadav B

stuffthực sự là một lệnh sao chép-dán một lệnh khác vào một phiên màn hình: Stuff [chuỗi] Nhồi chuỗi chuỗi vào bộ đệm đầu vào của cửa sổ hiện tại. Điều này giống như lệnh "dán" nhưng với chi phí thấp hơn nhiều. Nếu không có tham số, màn hình sẽ nhắc một chuỗi thành công cụ. Bạn không thể dán bộ đệm lớn bằng lệnh "Stuff". Nó là hữu ích nhất cho các ràng buộc quan trọng. Xem thêm "bindkey". [được trích dẫn từ theterminallife.com/seinating-commands-into-a-screen-session/]
alisa

2

Tôi đã gặp vấn đề này trước đây, đó là một lỗi với việc triển khai Cygwin.

Những gì tôi đã làm là tạo ra một ".screenrc_detaching" chỉ có lệnh sau

#detach
detach 

và sau đó bắt đầu màn hình với

screen -c ~/loginScripts/tempScreenrc/.screenrc_detaching

Sau đó, bạn có phiên màn hình của bạn và phiên đã được đính kèm và tách ra và bạn tốt để bơm lệnh cho nó.

Dễ dàng ! : P


2

Điều này đã làm công việc cho tôi, mà -ckhông làm việc

screen -d -m bash -c "command1; command2; command3"


1

Một cách sao chép để kiểm tra các câu trả lời trước đó là:

 # No sessions:
screen -ls

 # Returns immediately:
time screen -dmS screen_descritive_session_name  bash -c 'sleep 20; hostname >> /tmp/h'

 # New session present:
screen -ls

 # File with return of command was created :)
sleep 20; cat /tmp/h

Kết quả mong đợi sẽ tương tự như:

No Sockets found in /var/run/screen/S-yourusernamehere.

(Điều đó có nghĩa là không có phiên màn hình nào được tạo trước đó)

real    0m0.002s
user    0m0.000s
sys     0m0.000s

(Đó là thời gian dành để tạo màn hình và tách ra khỏi nó. Gần như tức thời.)

There is a screen on:
    20318.screen_descritive_session_name    (20/08/2018 16:29:35)   (Detached)
1 Socket in /var/run/screen/S-yourusernamehere.

(Đầu ra này hiển thị các phiên màn hình có sẵn. Được tạo trên lệnh cuối cùng.)

sleep 20; cat /tmp/h

(Điều này catcho thấy tên máy chủ được thực thi bên trong màn hình gnu)


và kết quả của các bài kiểm tra như vậy là gì?
Pierre.Vriens

Bạn nói đúng, không có ví dụ. Tôi sẽ thêm vào.
Enrique S. Filiage

tốt hơn nhiều! thương xót! +1
Pierre.Vriens

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.