Tôi phải biết gì để sử dụng GNU Screen đúng cách? [đóng cửa]


106

Tôi vừa giới thiệu một người bạn với GNU Screen và họ đang gặp khó khăn để làm quen với nó. Điều đó khiến tôi nghĩ về những điều cần thiết mà anh ấy cần biết về tiện ích Screen tuyệt vời , những điều tương tự mà bạn nghĩ là đáng giá để dạy cho ai đó, một người mới bắt đầu, từ đầu. Một số phép loại suy và mẹo hữu ích để ghi nhớ các liên kết, v.v. là gì?

Nó sẽ rất tuyệt.


1
Có một số câu trả lời tốt cho điều này cũng ở đây: stackoverflow.com/questions/70661/what-is-gnu-screen
Chris

Ai đó đã đăng một câu hỏi tương tự như vậy trên Server Fault .
Vagnerr

Nếu ai đó mới bắt đầu và gặp khó khăn với Screen, họ có thể muốn xem tmux thay thế .
Christopher Bottoms

Câu trả lời:


93

Tôi đã sử dụng Screenhơn 10 năm và có thể sử dụng ít hơn một nửa các tính năng. Vì vậy, chắc chắn không cần thiết phải tìm hiểu tất cả các tính năng của nó ngay lập tức (và tôi không khuyên bạn nên thử). Các lệnh hàng ngày của tôi là:

^A ^W - window list, where am I
^A ^C - create new window
^A space - next window
^A p - previous window
^A ^A - switch to previous screen (toggle)
^A [0-9] - go to window [0-9]
^A esc - copy mode, which I use for scrollback

Tôi nghĩ đó là nó. Đôi khi tôi sử dụng các tính năng chia đôi màn hình, nhưng chắc chắn không phải hàng ngày. Mẹo khác là nếu màn hình dường như đã bị khóa do bạn vô tình nhấn vào một tổ hợp phím ngẫu nhiên nào đó, hãy thực hiện cả hai ^Q^A ^Qcố gắng mở khóa.


1
^ Một k nên được thêm vào danh sách để đóng một cửa sổ.
Léo Léopold Hertz 준영

7
Tôi không sử dụng ^ A k vì khả năng vô tình giết người nhiều hơn tôi dự định. Thay vào đó, tôi chỉ thoát ra khỏi shell trong một cửa sổ bằng cách sử dụng ^ D (hoặc exit). Cửa sổ màn hình tự động đóng sau khi thoát khỏi trình bao cuối cùng trong một cửa sổ.
Greg Hewgill

9
"^ Một chế độ esc - copy, mà tôi sử dụng để cuộn ngược" Bạn là một vị thần trong số những người đàn ông, thưa ngài.
Rob Howard

4
^ A [thực hiện chính xác điều tương tự.
atx

Cảm ơn vì ^ A ^ D trick ... Tôi đã bị mắc kẹt và không thể quay lại phiên của mình. Trong trường hợp này giúp người mà tôi đã viết một bài báo một khi trở lại điều này giải thích cơ bản của màn hình như ở đây nhưng có một vài chi tiết thủ thuật geekpad.ca/blog/post/...
Patrick Forget

36

Tôi không thể quen với màn hình cho đến khi tôi tìm thấy cách đặt 'thanh trạng thái' ở cuối màn hình hiển thị 'tab' hoặc 'màn hình ảo' mà bạn đang ở và có những cái nào khác. Đây là thiết lập của tôi:

[roel@roel ~]$ cat .screenrc
# Here comes the pain...
caption always "%{=b dw}:%{-b dw}:%{=b dk}[ %{-b dw}%{-b dg}$USER%{-b dw}@%{-b dg}%H %{=b dk}] [ %= %?%{-b dg}%-Lw%?%{+b dk}(%{+b dw}%n:%t%{+b dk})%?(%u)%?%{-b dw}%?%{-b dg}%+Lw%? %{=b dk}]%{-b dw}:%{+b dw}:"

backtick 2 5 5 $HOME/scripts/meminfo
hardstatus alwayslastline "%{+b dw}:%{-b dw}:%{+b dk}[%{-b dg} %0C:%s%a %{=b dk}]-[   %{-b dw}Load%{+b dk}:%{-b dg}%l %{+b dk}] [%{-b dg}%2`%{+b dk}] %=[ %{-b dg}%1`%{=b dk} ]%{-b dw}:%{+b dw}:%<"

sorendition "-b dw"
[roel@roel ~]$ cat ~/scripts/meminfo
#!/bin/sh
RAM=`cat /proc/meminfo | grep "MemFree" | awk -F" " '{print $2}'`
SWAP=`cat /proc/meminfo | grep "SwapFree" | awk -F" " '{print $2}'`
echo -n "${RAM}kb/ram ${SWAP}kb/swap"
[roel@roel ~]$

3
Kiểm tra byobu (hồ sơ trên màn hình): launcpad.net/byobu
Drew Stephens

Điều này là tuyệt vời, cảm ơn bạn. Tôi đang đấu tranh để tìm hiểu điều gì đang thực sự xảy ra khi tôi cố gắng tách thiết bị đầu cuối của mình. Tôi đã không nhận ra rằng mình cần phải chạy màn hình trước để có được bất kỳ lệnh nào trong số này hoạt động, thật ngớ ngẩn, tôi biết.
Ogaday

30

Ctrl+ A? - hiển thị màn hình trợ giúp!


Tôi hoàn toàn đồng ý với điều này. Điều này hữu ích hơn nhiều so với các câu trả lời khác, vì bạn có thể trừ các lệnh khác bằng nó, nhưng bạn không thể làm điều đó ngược lại. Ngoài ra, nó dễ dàng hơn rất nhiều để ghi nhớ.
Léo Léopold Hertz 준영

26

Nếu bạn của bạn có thói quen nhấn ^Ađể đến đầu dòng trong Bash, anh ấy / cô ấy sẽ gặp một số ngạc nhiên, vì ^Aphím lệnh trên màn hình là ràng buộc. Thông thường, tôi kết thúc với màn hình bị đóng băng, có thể do một số phím ngẫu nhiên tôi đã nhấn sau ^A:-)

Trong những trường hợp đó tôi cố gắng

^A s^A qchặn / bỏ chặn cuộn đầu cuối

để khắc phục điều đó. Để đi đến đầu dòng bên trong màn hình, dãy phím là ^A a.


1
Thật dễ dàng để thay đổi ký tự thoát từ ^ A sang ký tự khác. Tôi đã đưa chi tiết vào câu trả lời của mình.
Andrew Johnson,

3
+ 1 + 1 + 1 ^ Một s ... cảm ơn bạn ... màn hình bị khóa :)
Yuji 'Tomita' Tomita

1
@agnul +1 cho bạn cho ^ A a Tôi là người dùng của ^ A trong phiên cơ bản bình thường và tôi không thể sử dụng nó trong phiên màn hình. Cám ơn về tiền bo nhiều! :)
icasimpan

Cảm ơn bạn 100 lần vì bạn đã cho tôi biết cách làm cho ctrl A hoạt động bên trong màn hình. Tôi đã tìm kiếm điều này cả đời.
user674669,

Chữ 'A' và 'a' có nhạy cảm ở đây không?
Aditya MP

12

Bạn có thể sửa lại khóa thoát từ Ctrl+ Athành một khóa khác mà bạn chọn, vì vậy nếu bạn sử dụng nó cho việc khác, ví dụ: để đi đến đầu dòng trong bash, bạn chỉ cần thêm một dòng vào ~ / của mình. tập tin screenrc. Để biến nó thành ^ b hoặc ^ B, hãy sử dụng:

escape ^bB

Từ dòng lệnh, sử dụng tên các phiên để kiểm soát nhiều phiên. Tôi sử dụng một phiên cho mỗi tác vụ, mỗi phiên có nhiều tab:

  screen -ls # Liệt kê các phiên màn hình hiện tại của bạn
  screen -S <name> # Tạo một phiên màn hình mới được gọi là tên
  screen -r <name> # Kết nối với các phiên màn hình đã đặt tên

Khi sử dụng màn hình, bạn chỉ cần một vài lệnh:

  ^ A c Tạo một trình bao mới
  ^ A [0-9] Chuyển vỏ
  ^ A k Kill shell hiện tại
  ^ A d Ngắt kết nối khỏi màn hình
  ^ A? Hiển thị sự giúp đỡ

Một tài liệu tham khảo nhanh tuyệt vời có thể được tìm thấy ở đây . Nó là giá trị đánh dấu.


Tôi sử dụng các phiên màn hình lồng nhau. Tôi bắt đầu cái bên ngoài với screen -e^oođể tôi có thể sử dụng Ctrl + O cho cái đó và sau đó bắt đầu cái bên trong bằng screen -mđể chúng bắt đầu các phiên mới.
staticsan

1
Bạn có thể thay đổi phím thoát khi đang di chuyển. Trong một phiên màn hình đang chạy, nhập, ^A :sau \Bbđó nhập Enter để đặt khóa thoát thành ^ B. Nói chung, ^A :cho phép bạn đánh giá lệnh mà bạn .screenrchiểu.
malana

8

Một số mẹo cho những người quen thuộc với màn hình, nhưng những người có xu hướng không nhớ những thứ họ đọc trong trang người đàn ông:

  • Để thay đổi tên của một cửa sổ màn hình rất dễ dàng: ctrl+ A shift+ A.
  • Bạn có bỏ lỡ tin nhắn cuối cùng trên màn hình không? ctrl+ a ctrl+ msẽ hiển thị lại cho bạn.
  • Nếu bạn muốn chạy một cái gì đó (như gắn đuôi một tệp) và màn hình cho bạn biết khi có thay đổi, hãy sử dụng ctrl+ A shift+ mtrên cửa sổ đích. Cảnh báo: nó sẽ cho bạn biết nếu có thay đổi.
  • Bạn muốn chọn trực tiếp cửa sổ 15? Hãy thử những điều này trong .screenrctệp của bạn :
bind  ! select 11
bind  @ select 12
bind \# select 13
bind  $ select 14
bind  % select 15
bind \^ select 16
bind  & select 17
bind  * select 18
bind  ( select 19
bind  ) select 10

Điều đó sẽ gán ctrl+ a shift+ 0 through 9cho các cửa sổ 10 đến 19.


7

Ctrl+ Alà lệnh cơ sở

Ctrl+ A N= chuyển đến màn hình mở rộng *** N ***

Ctrl+ A P= chuyển đến màn hình quay lại *** P ***

Ctrl+ A C= *** C *** reate màn hình mới

Ctrl+ A D= *** D *** khắc màn hình của bạn


6

http://www.debian-administration.org/articles/34

Tôi đã viết điều đó một vài năm trước, nhưng nó vẫn là một phần giới thiệu tốt nhận được nhiều phản hồi tích cực.


Liên kết bị hỏng (hiệu quả):$VAR1 = \'Can\'t connect to local MySQL server through socket \'/var/run/mysqld/mysqld.sock\' (111 "Connection refused") at ../lib/Singleton/DBI.pm line 95. ';
Peter Mortensen

6

Tôi "phải" thêm cái này: thêm

bind s

cho của bạn .screenrc, nếu Bạn - như tôi - đã từng sử dụng cửa sổ chia nhỏ, như chia nhỏ cửa sổ C-a Sthực tế, nhưng C-a sđóng băng nó. Vì vậy, tôi vừa tắt phím tắt đóng băng.


2
^-Qunfreezes nếu bạn nhấn^-S
Plato

Bạn đúng @Plato. Tôi vẫn đang làm việc trong môi trường với người dùng, những người sẽ không ghi nhớ hầu hết bất kỳ phím tắt nào ... Tôi cần phải tắt nó.
Zsolt Botykai

NP tôi chỉ tìm thấy chủ đề này đầu tiên và đã tìm kiếm 'đóng băng' và không tìm thấy những gì tôi đang tìm kiếm
Plato

6

Ctrl+ alà một khóa đặc biệt.

Ctrl+ a d- [d] etach, để chương trình (irssi?) ở chế độ nền, về nhà.

Ctrl+ a c[c] reate một cửa sổ mới Ctrl+ a 0-9chuyển đổi giữa các cửa sổ bằng số

screen -r - quay lại phiên tách rời

Điều đó bao gồm 90% các trường hợp sử dụng. Đừng cố gắng hiển thị tất cả các chức năng cùng một lúc.


Mặc dù, khi lần đầu tiên tôi biết về nó, screentôi đã bối rối về ý nghĩa thực sự của việc tháo rờigắn lại màn hình. Trích dẫn : "... bạn có thể có các tác vụ đang chạy trong thời gian dài trong các bảng điều khiển riêng biệt (như ssh trên máy remmote, phiên IRC, ...) trên một máy nhất định, tách khỏi phiên, di chuyển từ vị trí thực này sang vị trí thực khác, kết nối với máy thông qua ssh và gắn lại vào phiên màn hình để tiếp tục hoạt động. "
JW.


3

Sửa đổi đầu tiên tôi thực hiện đối với .screenrc là thay đổi lệnh thoát. Không giống như nhiều người trong số các bạn, tôi không thích trình tự Ctrl-A mặc định vì nó can thiệp vào chức năng cơ bản đó trong hầu hết mọi ngữ cảnh khác. Trong tệp .screenrc của tôi, tôi thêm:

thoát khỏi

Đó là backtick-e.

Điều này cho phép tôi sử dụng backtick làm phím thoát (ví dụ: để tạo một màn hình mới, tôi nhấn backtick-c, detach là backtick-d, backtick-? Là trợ giúp, backtick-backtick là màn hình trước đó, v.v.). Cách duy nhất mà nó can thiệp (và tôi đã phải tự phá bỏ thói quen) là sử dụng backtick trên dòng lệnh để nắm bắt kết quả thực thi hoặc dán bất kỳ thứ gì có chứa backtick. Trước đây, tôi đã sửa đổi thói quen của mình bằng cách sử dụng quy ước BASH $ (lệnh). Đối với phần sau, tôi thường chỉ mở một xterm khác hoặc tách khỏi màn hình sau đó dán nội dung có chứa backtick. Cuối cùng, nếu tôi muốn chèn một backtick theo nghĩa đen, tôi chỉ cần nhấn backtick-e.


xuất sắc. Tôi sử dụng backticks mọi lúc, mặc dù tôi biết tôi phải sử dụng $ (...), vì vậy bây giờ tôi đoán tôi có thể phải thay đổi cách của mình. Backtick hơi khác thường, nhưng thật tuyệt khi có một phím duy nhất mà không cần bổ sung. Nhưng tại sao lại là "e", và làm thế nào bạn nhớ được điều đó?
iconoclast

Tôi vừa thử nghiệm 'thoát' 'và nó hoạt động tốt và có vẻ dễ nhớ hơn. Nếu bạn nhấn backtick và không nhận được những gì bạn mong đợi, chỉ cần nhấn lại.
iconoclast

Tôi đã thực hiện điều này, nhưng có cách nào để thực sự gõ phím quay lại khi đang ở trên màn hình không? Đôi khi, nó là cần thiết để làm điều này, và tôi ghét phải tách để làm điều đó ...
Guillochon

@Guillouchon: bình luận trước giải thích chính xác điều đó.
tripleee

3

Có một số công việc thú vị đang được thực hiện để có được thiết lập màn hình GNU tốt đang diễn ra theo mặc định trong phiên bản tiếp theo của Ubuntu Server, bao gồm việc sử dụng cuối màn hình để hiển thị tất cả các cửa sổ cũng như các chi tiết hữu ích khác của máy (như số lượng bản cập nhật có sẵn và máy có cần khởi động lại hay không). Bạn có thể lấy chúng .screenrcvà tùy chỉnh nó theo nhu cầu của bạn.

Các lệnh hữu ích nhất mà tôi có trong đó .screenrclà:

shelltitle "$ |bash" # Make screen assign window titles automatically
hardstatus alwayslastline "%w" # Show all window titles at bottom line of term

Bằng cách này, tôi luôn biết những cửa sổ nào đang mở và những gì đang chạy trong chúng vào lúc này.


3

Tôi sử dụng những thứ sau cho ssh:

#!/bin/sh
# scr - Runs a command in a fresh screen
#
# Get the current directory and the name of command

wd=`pwd`
cmd=$1
shift

# We can tell if we are running inside screen by looking
# for the STY environment variable.  If it is not set we
# only need to run the command, but if it is set then
# we need to use screen.

if [ -z "$STY" ]; then
        $cmd $*
else
        # Screen needs to change directory so that
        # relative file names are resolved correctly.
        screen -X chdir $wd

        # Ask screen to run the command
        if [ $cmd == "ssh" ]; then
                screen -X screen -t ""${1##*@}"" $cmd $*
        else
                screen -X screen -t "$cmd $*" $cmd $*
        fi
fi

Sau đó, tôi đặt các bí danh bash sau:

vim() {
        scr vim $*
}

man() {
        scr man $*
}

info() {
        scr info $*
}

watch() {
        scr watch $*
}

ssh() {
        scr ssh $*
}

Nó mở ra một màn hình mới cho các bí danh trên và iff bằng ssh, nó đổi tên tiêu đề màn hình bằng tên máy chủ ssh.


2

Tôi muốn thiết lập một phiên màn hình với tên mô tả cho các cửa sổ. ^ a A sẽ cho phép bạn đặt tên cho cửa sổ hiện tại và ^ a "sẽ cung cấp cho bạn danh sách các cửa sổ của bạn. Khi hoàn tất, hãy tách màn hình bằng ^ ad và gắn lại với màn hình -R


1

Tôi thích sử dụng screen -d -RRđể tự động tạo / đính kèm vào một màn hình nhất định. Tôi đã tạo các hàm bash để làm cho nó dễ dàng hơn ...

function mkscreen
{
    local add=n

    if [ "$1" == '-a' ]; then
        add=y
        shift;
    fi

    local name=$1;
    shift;
    local command="$*";

    if [ -z "$name" -o -z "$command" ]; then
        echo 'Usage: mkscreen [ -a ] name command

    -a          Add to .bashrc.' 1>&2;
        return 1;
    fi

    if [ $add == y ]; then
        echo "mkscreen $name $command" >> $HOME/.bashrc;
    fi

    alias $name="/usr/bin/screen -d -RR -S $name $command";

    return 0;
}

function rmscreen
{
    local delete=n

    if [ "$1" == '-d' ]; then
        delete=y
        shift;
    fi

    local name=$1;

    if [ -z "$name" ]; then
        echo 'Usage: rmscreen [ -d ] name

    -d          Delete from .bashrc.' 1>&2;
        return 1;
    fi

    if [ $delete == y ]; then
        sed -i -r "/^mkscreen $name .*/d" $HOME/.bashrc;
    fi

    unalias $name;

    return 0;
}

Họ tạo một bí danh cho /usr/bin/screen -d -RR -S $name $command. Ví dụ: tôi thích sử dụng irssi trong một phiên màn hình, vì vậy trong .bashrc của tôi (bên dưới các hàm đó), tôi có:

mkscreen irc /usr/bin/irssi

Sau đó, tôi có thể chỉ cần gõ irc một thiết bị đầu cuối để truy cập irssi. Nếu màn hình 'irc' chưa tồn tại thì nó sẽ được tạo và / usr / bin / irssi được chạy từ nó (tất nhiên là kết nối tự động). Nếu nó đã chạy thì tôi chỉ cần gắn lại nó, buộc phải tách bất kỳ phiên bản nào khác đã được gắn vào nó. Nó khá tốt.

Một ví dụ khác là tạo bí danh màn hình tạm thời cho perldocs khi tôi bắt gặp chúng:

mkscreen perlipc perldoc perlipc
perlipc # Start reading the perldoc, ^A d to detach.
...
# Later, when I'm done reading it, or at least finished
# with the alias, I remove it.
rmscreen perlipc 

Tùy chọn -a (phải là đối số đầu tiên) gắn bí danh màn hình với .bashrc (vì vậy nó liên tục) và -d xóa nó (những bí danh này có thể phá hủy, vì vậy hãy tự chịu rủi ro khi sử dụng). xD

Nối:

Một cơ sở khác mà tôi thấy thuận tiện khi làm việc nhiều với màn hình:

alias sls='/usr/bin/screen -ls'

Bằng cách đó, bạn có thể liệt kê các màn hình của mình với ít lần nhấn phím hơn. Tôi không biết có slsva chạm với bất kỳ tiện ích hiện có nào không, nhưng nó không có trên hệ thống của tôi vào thời điểm đó nên tôi đã sử dụng nó.



0

Ctrl+ Alà một ký tự đặc biệt tuyệt vời đối với người dùng Unix, nhưng nếu bạn đang sử dụng màn hình để nói chuyện với OpenVMS , thì việc không thể ^ A sẽ khiến bạn bị hói sớm.

Trong VMS , nếu bạn đang chỉnh sửa một lệnh DCL trước khi thực thi từ bộ đệm lịch sử, chế độ Chèn sẽ tắt (phải vì một số lý do mà tôi sẽ không vào đây) ... để bật nó lên để bạn không 'Không gõ quá lệnh của bạn thay vì khoảng trống mọi thứ, bạn phải nhấn `^ A.


Tôi sử dụng screen -e ^Llvì những lý do tương tự; Tôi chỉ đơn giản là không thể mở khóa để gõ ctrl-A để chuyển đến đầu dòng trong Emacs. May mắn thay, ctrl-L là một tổ hợp phím mà tôi hiếm khi cần đến, và IMHO cũng kết nối độc đáo với ý nghĩa chung của nó (vẽ lại / xóa màn hình).
tripleee

@tripleee: My .screenrcescape ^@^@, sử dụng ký tự null thay vì control-A. Trên hầu hết các hệ thống, bạn có thể nhập ký tự null làm control-space, rất dễ nhập. (Tôi có một phiên màn hình lồng nhau chạy bên trong một cửa sổ trong phiên chính của tôi, vì một mà tôi có escape ^]^].)
Keith Thompson
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.