Làm thế nào để thực hiện một lệnh trong màn hình và tách ra?


75

Làm cách nào tôi có thể nhận được màn hình để thực thi một lệnh và sau đó tách ra (Nghĩa là, tự động trong một tập lệnh duy nhất mà không cần nhập thêm ngoài việc bắt đầu tập lệnh ban đầu)? ví dụ: tôi chạy myscript.sh và nó tự động bắt đầu một phiên màn hình, thực thi một lệnh, sau đó tách ra.

Câu trả lời:


114

Đây là một điều dễ dàng:

screen -d -m yourcommand

4
không có con xúc xắc. lệnh màn hình -d -m, danh sách màn hình nói không có ổ cắm, màn hình -r không có phiên
darkfeline

1
Bằng cách nào đó, lệnh của bạn không được tìm thấy hoặc không hoạt động chính xác trong môi trường màn hình được tạo tự động. Cố gắng chỉ làm screen yourcommandmà không có sự -d-mvà xem làm thế nào mà đi đầu tiên.
Alan Curry

Bạn đúng rồi. màn hình chấm dứt khi lệnh kết thúc, trái với mong đợi của tôi. Nhưng câu trả lời của bạn không hoạt động.
darkfeline

3
Bạn có thể thay đổi điều đó bằng cách kích hoạt zombietùy chọn trong màn hình. Đặt zombie xytrong của bạn ~/.screenrc. Cũng có thể kích hoạt nó cho một phiên chỉ b đưa zombie xyvào một tệp khác và sử dụng -c filenhưng vì một số lý do không hoạt động khi tôi thử. Hoặc chỉ sử dụngsh -c 'yourcommand;while :;do sleep 9999; done'
Alan Curry

@AlanCurry, Không, điều này cũng không hiệu quả với tôi, mặc dù lệnh chạy hoàn hảo (và mất vài giờ) khi chạy trong màn hình theo cách thủ công.
Cerin

47

Để chạy một lệnh duy nhất trong màn hình và tách ra, bạn có thể thử:

screen -dm sleep 10

Để chạy nhiều lệnh, hãy thử:

screen -dm bash -c "sleep 10; myscript.sh"

Xin lưu ý rằng khi chương trình kết thúc, màn hình (theo mặc định) sẽ giết chết cửa sổ chứa nó.

Nếu bạn không muốn phiên của mình bị giết sau khi tập lệnh kết thúc, hãy thêm exec shvào cuối, ví dụ:

screen -dm bash -c 'sleep 5; exec sh'

Để liệt kê tất cả các phiên của bạn, hãy thử:

screen -list

Liên quan: Khởi động màn hình Unix, Chạy lệnh, Detach .


2
Điều này làm việc cho tôi trên Ubuntu 16.04. Ngoài việc đặt tên cho phiên của bạn để bạn có thể quay lại phiên sau, hãy thêm -S sessionname: screen -dmS MyLongRunningScript bash -c "...".
Dan Dascalescu

16

Để bắt đầu phiên mới trong nền với tên 'buồn ngủ'

screen -S sleepy -dm sleep 60

Để giết phiên 'buồn ngủ'

screen -S sleepy -X quit      

Tại sao nó không hoạt động như thế screen -S sleepy -dm "cd myfolder;sleep 60"nào?
Bộ công cụ

@Toolkit Vấn đề là bạn có lệnh trong dấu ngoặc kép và vì vậy nó được coi là một lệnh lớn. Rõ ràng là chúng ta không thể lấy nó ra khỏi dấu ngoặc kép vì dấu chấm phẩy. Để giải quyết vấn đề này, hãy thực thi lệnh như vậy: screen -S ngái ngủ -dm bash -c "cd myfolder; ngủ 60"
Jason Thompson

3
screen -dmS screen_session_name bash -c 'echo "doing stuff"; exec bash'

0

nó xảy ra với tôi khi tôi nhấn control c (sig int) để thoát khỏi chương trình của tôi. nó thoát ra khỏi tất cả các bash. Vì vậy, tôi tìm thấy điều này để bắt SIGINT. và ngăn chặn lối ra từ bash cuối cùng. (cần gõ exit để thoát)

screen -dmS "screenNameHere" bash -c "trap 'echo gotsigint' INT; cd /mydir ; my_command_here;  bash"


example:

screen -dmS "status_updates" bash -c "trap 'echo gotsigint' INT; cd /opt/status_update ; forever index.js ;  bash"

Tôi thấy hữu ích khi sử dụng cron để chạy các chương trình nodejs khi khởi động. và để chạy màn hình lúc khởi động. trong cron có các sự kiện đặc biệt cú pháp sự kiện @reboot

to edit cron, execute:
crontab -e

then type
@reboot screen -dmS "screenNameHere" bash -c "trap 'echo gotsigint' INT; cd /mydir ; my_command_here;  bash"
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.