Làm thế nào để liệt kê các phiên màn hình đang chạy?


232

Tôi có một loạt các máy chủ, trên đó tôi chạy thử nghiệm bằng cách sử dụng screen. Thủ tục như sau:

  1. ssh đến máy chủ XXX
  2. phóng screen
  3. bắt đầu thử nghiệm trong một vài tab
  4. tách ra screen
  5. ngắt kết nối với máy chủ

Trong khi các thử nghiệm đang chạy, tôi có thể dễ dàng tìm thấy chúng trên máy chủ nào bằng cách sshvào tất cả các máy chủ và liệt kê các quy trình đang chạy của tôi (sử dụng tophoặc ps).

Tuy nhiên, sau khi thử nghiệm kết thúc, làm thế nào tôi có thể tìm thấy trên máy chủ nào tôi có phiên màn hình được mở (để tôi có thể xem kết quả đầu ra, khởi chạy lại chúng, v.v.)?

PS: các thí nghiệm của tôi cũng in đầu ra của chúng thành các tệp ... nhưng đây không phải là câu hỏi của tôi.

Câu trả lời:


419

Để liệt kê tất cả các phiên màn hình cho người dùng, hãy chạy lệnh sau với tư cách là người dùng đó:

screen -ls

Để xem tất cả các phiên màn hình trên một máy cụ thể, bạn có thể làm:

ls -laR /var/run/screen/

Tôi nhận được điều này trên máy của tôi:

gentle ~ # ls -laR /var/run/screen/

/var/run/screen/:
total 1
drwxrwxr-x  4 root utmp   96 Mar  1  2005 .
drwxr-xr-x 10 root root  840 Feb  1 03:10 ..
drwx------  2 josh users  88 Jan 13 11:33 S-josh
drwx------  2 root root   48 Feb 11 10:50 S-root

/var/run/screen/S-josh:
total 0
drwx------ 2 josh users 88 Jan 13 11:33 .
drwxrwxr-x 4 root utmp  96 Mar  1  2005 ..
prwx------ 1 josh users  0 Feb 11 10:41 12931.pts-0.gentle

/var/run/screen/S-root:
total 0
drwx------ 2 root root 48 Feb 11 10:50 .
drwxrwxr-x 4 root utmp 96 Mar  1  2005 ..

Đây là một cách sử dụng Unix Sockets khá rực rỡ được bao bọc trong các quyền của hệ thống tệp để xử lý bảo mật, trạng thái và luồng.


1
Tôi tự hỏi tại sao câu trả lời này, một câu trả lời hoàn hảo cho câu hỏi, lại bị
hạ bệ

Ngoài ra, nếu bạn muốn có một màn hình cụ thể dựa trên quy ước đặt tên, bạn có thể grep kết quả. ls -R /var/run/screen/S-root/ | grep "NamingConvention". Màn hình lưu ở <pid>.<screen_name>định dạng. Điều này rất hữu ích cho các tập lệnh bash. Vì vậy, nếu bạn có một màn hình có tên, 0000.NamingConventionnó sẽ chỉ trả về tên của các màn hình mà bạn đang tìm kiếm ở dạng dễ phân tích cú pháp.
Elias Ranz


13

Mặc dù câu trả lời của joshperry là chính xác, tôi thấy rất khó chịu vì nó không cho bạn biết tên màn hình (tên bạn đặt với tùy chọn -t), đó thực sự là những gì bạn sử dụng để xác định phiên. (tất nhiên không phải lỗi của anh ấy, đó là lỗi của màn hình)

Đó là lý do tại sao tôi thay vì sử dụng một tập lệnh như thế này: ps auxw|grep -i screen|grep -v grep


2
Hãy xem tùy chọn -S. Giá trị được cung cấp được lưu trữ trong tên tệp ổ cắm unix và hiển thị trong lsđầu ra. Nếu bạn cần, bạn cũng có thể giữ tùy chọn -t.
joshperry

Tùy chọn -S rất tuyệt vời, vì nó cũng cho phép bạn tiếp tục với tên phiên đó:screen -rd <sessionname>
jorisw

7

Tôi không thực sự chắc chắn về câu hỏi của bạn, nhưng nếu tất cả những gì bạn thực sự muốn là danh sách phiên màn hình hiện đang mở, hãy thử:

screen -ls

6
 For windows system

 Open putty 
 then login in server

Nếu bạn muốn xem màn hình trong Console thì bạn phải viết lệnh

 Screen -ls

Nếu bạn phải truy cập màn hình thì bạn phải sử dụng lệnh bên dưới

 screen -x screen id

Viết PWDvào dòng lệnh để kiểm tra xem bạn đang ở thư mục nào


3

Trong hầu hết các trường hợp screen -RRx $username/ sẽ đủ :)

Nếu bạn vẫn muốn liệt kê tất cả các màn hình thì hãy đặt đoạn script sau vào đường dẫn của bạn và gọi nó là màn hình hoặc bất cứ thứ gì bạn thích:

#!/bin/bash
if [[ "$1" != "-ls-all" ]]; then
    exec /usr/bin/screen "$@"
else
    shopt -s nullglob
    screens=(/var/run/screen/S-*/*)
    if (( ${#screens[@]} == 0 )); then
        echo "no screen session found in /var/run/screen"
    else
        echo "${screens[@]#*S-}"
    fi
fi

Nó sẽ hoạt động chính xác như màn hình ngoại trừ hiển thị tất cả các phiên màn hình, khi đưa ra tùy chọn -ls-all là tham số đầu tiên.


3

Nhiều người đã chỉ ra rằng

$ screen -ls

sẽ liệt kê các phiên màn hình.

Đây là một mẹo khác có thể hữu ích cho bạn.

Nếu bạn thêm lệnh sau làm dòng cuối cùng trong tệp .bashrc trên máy chủ xxx, thì nó sẽ tự động kết nối lại với phiên màn hình của bạn khi đăng nhập.

screen -d -r

Hi vọng bạn tìm được thứ hữu dụng.


1
Tôi muốn lưu ý rằng bạn sẽ phải đăng nhập với cùng một người dùng đã khởi động màn hình, tôi lo lắng phiên màn hình của tôi đã biến mất, nhưng bản sao tệp của tôi vẫn tiếp tục dưới "phương tiện" của người dùng. Nghe có vẻ hợp lý, nhưng nó có thể tiết kiệm một số hoảng loạn nếu bạn giám sát nó.
Paul

0

ps x | màn hình grep

để xem màn hình đó đang chạy gì trong trường hợp bạn sử dụng lệnh

màn hình -A -m -d php make_s Something.php


-4

Vậy bạn đang sử dụng màn hình để giữ cho các thử nghiệm chạy ở chế độ nền hay sao? Nếu vậy, tại sao không chỉ bắt đầu nó trong nền?

./experiment &

Và nếu bạn đang hỏi làm thế nào để nhận thông báo về công việc tôi đã thực hiện, làm thế nào về việc xâu chuỗi thử nghiệm cùng với một lệnh mail?

./experiment && echo "the deed is done" | mail youruser@yourlocalworkstation -s "job on server $HOSTNAME is done"

Tôi đang sử dụng màn hình để tôi có thể ngắt kết nối với máy chủ mà không chấm dứt thử nghiệm. Câu hỏi không phải là làm thế nào để nhận thông báo (mặc dù thư có thể là một cách hay để thực hiện), nhưng làm thế nào để tìm xem một máy cụ thể có phiên mở màn hình hay không. Dù sao cũng cảm ơn câu trả lời của bạn!
Wookai

Tôi không phải là một sysadmin có kinh nghiệm, nhưng tôi thấy việc sử dụng màn hình để chạy các quy trình máy chủ hoạt động tốt: nếu có sự cố, bạn có thể lướt qua cửa sổ đó và xem tất cả đầu ra dẫn đến sự cố - bạn không cần phải bắt đầu mở tập tin nhật ký Điều đó cũng có nghĩa là bạn có thể dễ dàng giết chết một tiến trình với ctrl + c. Điều này rất hữu ích nếu bạn thường xuyên bắt đầu và tắt cùng một dịch vụ.
Steve Bennett
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.