>  기사  >  웹 프론트엔드  >  Linux는 화면을 사용하여 원격 세션 인스턴스 방법을 관리합니다.

Linux는 화면을 사용하여 원격 세션 인스턴스 방법을 관리합니다.

小云云
小云云원래의
2018-03-13 15:14:481295검색

Linux 서버에 원격으로 로그인하기 위해 SSH나 Telent가 자주 필요합니까? 시스템 백업, FTP 전송 등 장시간 실행되는 작업으로 인해 골치 아픈 경우가 자주 있습니까? 일반적으로 이러한 작업은 실행하는 데 시간이 너무 오래 걸리기 때문에 각 작업에 대해 원격 터미널 창을 엽니다. 실행이 완료될 때까지 기다려야 합니다. 이 기간 동안 창을 닫거나 연결을 끊을 수 없습니다. 그렇지 않으면 작업이 종료되고 모든 것이 중간에 취소됩니다.

범인: SIGHUP 신호

창을 닫거나 연결을 끊으면 실행 중인 프로그램이 죽는 이유를 살펴보겠습니다.

Linux/Unix에는 여러 개념이 있습니다.

  • 프로세스 그룹(프로세스 그룹): 하나 이상의 프로세스 모음 각 프로세스 그룹에는 고유한 프로세스 그룹 ID, 즉 프로세스 그룹 리더 프로세스 ID가 있습니다. .

  • 세션: 고유한 세션 리더가 있는 하나 이상의 프로세스 그룹 모음입니다. 세션 ID는 첫 번째 프로세스의 ID입니다.

  • 세션은 별도의 제어 터미널을 가질 수 있습니다. 제어 단말에 연결된 세션의 첫 번째 프로세스를 제어 프로세스라고 합니다. 현재 터미널과 상호 작용하는 프로세스를 포그라운드 프로세스 그룹이라고 합니다. 나머지 프로세스 그룹을 백그라운드 프로세스 그룹이라고 합니다.

POSIX.1 정의에 따르면:

  • 중단 신호(SIGHUP)의 기본 동작은 프로그램을 종료하는 것입니다.

  • 터미널 인터페이스가 네트워크 연결이 끊어진 것을 감지하면 제어 프로세스(세션의 첫 번째 프로세스)에 끊김 신호를 보냅니다.

  • 세션 헤드 프로세스가 종료되면 이 신호는 세션 포그라운드 프로세스 그룹으로 전송됩니다.

  • 프로세스가 종료되고 고아 프로세스 그룹이 생성될 때 고아 프로세스 그룹 프로세스가 STOP 상태에 있으면 SIGHUP 및 SIGCONT 신호가 프로세스 그룹의 모든 프로세스에 전송됩니다.

그래서 네트워크 연결이 끊기거나 터미널 창이 닫히면 제어 프로세스가 SIGHUP 신호를 받고 종료되며, 이로 인해 세션의 다른 프로세스가 종료됩니다.

예를 살펴보겠습니다. 두 개의 SSH 터미널 창을 열고 그 중 하나에서 top 명령을 실행합니다.

[root@tivf09 root]# top

다른 터미널 창에서 top의 프로세스 ID는 5180이고 상위 프로세스 ID는 로그인 셸인 5128입니다.

[root@tivf09 root]# ps -ef|grep top
root      5180  5128  0 01:03 pts/0    00:00:02 top
root      5857  3672  0 01:12 pts/2    00:00:00 grep top

이 관계를 더 명확하게 보려면 pstree 명령을 사용하십시오.

[root@tivf09 root]# pstree -H 5180|grep top
|-sshd-+-sshd---bash---top

ps-xj 명령을 사용하여 로그인 셸(PID 5128)과 top이 동일한 세션에 있고 셸이 로그인 셸의 첫 번째 프로세스인지 확인하세요. 세션이며 프로세스 그룹에 속해 있습니다. PGID는 5128이고, top이 위치한 프로세스 그룹의 PGID는 5180으로 포그라운드 프로세스 그룹입니다.

[root@tivf09 root]# ps -xj|grep 5128
 5126  5128  5128  5128 pts/0     5180 S        0   0:00 -bash
 5128  5180  5180  5128 pts/0     5180 S        0   0:50 top
 3672 18095 18094  3672 pts/2    18094 S        0   0:00 grep 5128

첫 번째 SSH 창을 닫으면 다른 창에서 top도 종료된 것을 볼 수 있습니다.

[root@tivf09 root]# ps -ef|grep 5128
root     18699  3672  0 04:35 pts/2    00:00:00 grep 5128

SIGHUP 신호를 무시할 수 있다면 창을 닫아도 프로그램 실행에 영향을 미치지 않습니다. nohup 명령을 사용하면 프로그램의 표준 출력/표준 오류가 터미널인 경우 기본적으로 nohup.out 파일로 리디렉션됩니다. nohup 명령은 프로그램이 SIGHUP 신호를 무시하게만 한다는 점은 주목할 가치가 있습니다. 또한 백그라운드에서 실행하려면 & 표시를 사용해야 합니다.

nohup e2b9f03cad787b9644e1f51fd23b7dac [argument…] &

nohup은 사용하기 쉽지만 여전히 비교적 "초보적"입니다. 간단한 명령을 처리할 수 있지만 인간과 컴퓨터의 상호 작용이 필요한 복잡한 작업에는 문제가 있습니다.

실제로는 더 강력한 유틸리티 화면을 사용할 수 있습니다. 인기 있는 Linux 배포판(예: Red Hat Enterprise Linux 4)에는 일반적으로 screen 유틸리티가 함께 제공됩니다. 그렇지 않은 경우 공식 GNU screen 웹사이트에서 다운로드할 수 있습니다.

[root@tivf06 ~]# rpm -qa|grep screen
xscreensaver-4.18-5.rhel4.11
screen-4.0.2-5

Screen 사용 시작

간단히 말해서 Screen은 여러 프로세스 간에 물리적 터미널을 다중화할 수 있는 창 관리자입니다. Screen은 세션이라는 개념을 가지고 있으며, 사용자는 하나의 Screen 세션에서 여러 개의 스크린 창을 생성할 수 있으며, 각 스크린 창은 실제 Telnet/SSH 연결 창을 운영하는 것과 같습니다. 화면에 새 창을 만드는 방법에는 여러 가지가 있습니다:

1.

[root@tivf06 ~]# screen

Screen 명령줄에 직접 screen 명령을 입력하면 셸 실행을 위한 전체 화면 창이 생성됩니다. SSH 창에서와 마찬가지로 임의의 쉘 프로그램을 실행할 수 있습니다. 창을 종료하려면 창에 exit를 입력하세요. 이 창이 screen 세션의 유일한 창인 경우 screen 세션이 종료되고, 그렇지 않으면 screen이 자동으로 이전 창으로 전환됩니다.

2. Screen 명령 다음에는 실행하려는 프로그램이 옵니다.

[root@tivf06 ~]# screen vi test.c

Screen은 vi test.c를 실행하는 단일 창 세션을 생성합니다. vi를 종료하면 창/세션이 종료됩니다.

3. 위의 두 가지 방법 모두 새로운 화면 세션을 생성합니다. 기존 스크린 세션 내에서 새 창을 만들 수도 있습니다. 현재 화면 창에서 C-a c, 즉 Ctrl 키 + a 키를 입력한 후 c 키를 누르면 화면이 나타납니다. 세션 내에 새 창을 만들고 그 창으로 전환합니다.

화면에는 더욱 고급 기능도 있습니다. 스크린 창에서 프로그램 실행을 중단하지 않고 스크린 세션을 일시적으로 연결 해제(분리)하고 나중에 세션을 다시 연결(연결)하여 각 창에서 실행 중인 프로그램에 대한 제어권을 다시 얻을 수 있습니다. 예를 들어, /tmp/abc 파일을 편집하기 위해 스크린 창을 엽니다:

[root@tivf06 ~]# screen vi /tmp/abc

그런 다음 일시적으로 종료하고 산책과 같은 다른 작업을 수행하고 스크린 창에 C-a d를 입력하면 Screen이 분리된 프롬프트 제공:

暂时中断会话

半个小时之后回来了,找到该screen会话:

[root@tivf06 ~]# screen -ls
There is a screen on:
        16582.pts-1.tivf06      (Detached)
1 Socket in /tmp/screens/S-root.

重新连接会话:

[root@tivf06 ~]# screen -r 16582

看看出现什么了,太棒了,一切都在。继续干吧。

你可能注意到给screen发送命令使用了特殊的键组合C-a。这是因为我们在键盘上键入的信息是直接发送给当前screen窗口,必须用其他方式向screen窗口管理器发出命令,默认情况下,screen接收以C-a开始的命令。这种命令形式在screen中叫做键绑定(key binding),C-a叫做命令字符(command character)。

可以通过C-a ?来查看所有的键绑定,常用的键绑定有:

C-a ? 显示所有键绑定信息
C-a w 显示所有窗口列表
C-a C-a 切换到之前显示的窗口
C-a c 创建一个新的运行shell的窗口并切换到该窗口
C-a n 切换到下一个窗口
C-a p 切换到前一个窗口(与C-a n相对)
C-a 0..9 切换到窗口0..9
C-a a 发送 C-a到当前窗口
C-a d 暂时断开screen会话
C-a k 杀掉当前窗口
C-a [ 进入拷贝/回滚模式

Screen常用选项

使用键绑定C-a ?命令可以看到, 默认的命令字符(Command key)为C-a,转义C-a(literal ^a)的字符为a:

Screen 常用选项

因为screen把C-a看作是screen命令的开始,所以如果你想要screen窗口接收到C-a字符,就要输入C-a a。Screen也允许你使用-e选项设置自己的命令字符和转义字符,其格式为:

-exy x为命令字符,y为转义命令字符的字符

下面命令启动的screen会话指定了命令字符为C-t,转义C-t的字符为t,通过C-t ?命令可以看到该变化。

[root@tivf18 root]# screen -e^tt
自定义命令字符和转义字符

其他常用的命令选项有:

-c file 使用配置文件file,而不使用默认的$HOME/.screenrc
-d|-D [pid.tty.host] 不开启新的screen会话,而是断开其他正在运行的screen会话
-h num 指定历史回滚缓冲区大小为num行
-list|-ls 列出现有screen会话,格式为pid.tty.host
-d -m 启动一个开始就处于断开模式的会话
-r sessionowner/ [pid.tty.host] 重新连接一个断开的会话。多用户模式下连接到其他用户screen会话需要指定sessionowner,需要setuid-root权限
-S sessionname 创建screen会话时为会话指定一个名字
-v 显示screen版本信息
-wipe [match] 同-list,但删掉那些无法连接的会话

下例显示当前有两个处于detached状态的screen会话,你可以使用screen -r 06e838b839169df1cfa03248ef419f73重新连接上:

[root@tivf18 root]# screen –ls
There are screens on:
        8736.pts-1.tivf18       (Detached)
        8462.pts-0.tivf18       (Detached)
2 Sockets in /root/.screen.

[root@tivf18 root]# screen –r 8736

如果由于某种原因其中一个会话死掉了(例如人为杀掉该会话),这时screen -list会显示该会话为dead状态。使用screen -wipe命令清除该会话:

[root@tivf18 root]# kill -9 8462
[root@tivf18 root]# screen -ls  
There are screens on:
        8736.pts-1.tivf18       (Detached)
        8462.pts-0.tivf18       (Dead ???)
Remove dead screens with 'screen -wipe'.
2 Sockets in /root/.screen.

[root@tivf18 root]# screen -wipe
There are screens on:
        8736.pts-1.tivf18       (Detached)
        8462.pts-0.tivf18       (Removed)
1 socket wiped out.
1 Socket in /root/.screen.

[root@tivf18 root]# screen -ls  
There is a screen on:
        8736.pts-1.tivf18       (Detached)
1 Socket in /root/.screen.

[root@tivf18 root]#

-d –m 选项是一对很有意思的搭档。他们启动一个开始就处于断开模式的会话。你可以在随后需要的时候连接上该会话。有时候这是一个很有用的功能,比如我们可以使用它调试后台程序。该选项一个更常用的搭配是:-dmS sessionname

启动一个初始状态断开的screen会话:

[root@tivf06 tianq]# screen -dmS mygdb gdb execlp_test

连接该会话:

[root@tivf06 tianq]# screen -r mygdb

管理你的远程会话

先来看看如何使用screen解决SIGHUP问题,比如现在我们要ftp传输一个大文件。如果按老的办法,SSH登录到系统,直接ftp命令开始传输,之后。。如果网络速度还可以,恭喜你,不用等太长时间了;如果网络不好,老老实实等着吧,只能传输完毕再断开SSH连接了。让我们使用screen来试试。

SSH登录到系统,在命令行键入screen。

[root@tivf18 root]# screen

在screen shell窗口中输入ftp命令,登录,开始传输。不愿意等了?OK,在窗口中键入C-a d:

管理你的远程会话

然后。。退出SSH登录?随你怎样,只要别杀掉screen会话。

是不是很方便?更进一步,其实我们可以利用screen这种功能来管理你的远程会话,保存你所有的工作内容。你是不是每次登录到系统都要开很多窗口,然后每天都要重复打开关闭这些窗口?让screen来帮你“保存”吧,你只需要打开一个ssh窗口,创建需要的screen窗口,退出的时候C-a d“保存”你的工作,下次登录后直接screen -r 06e838b839169df1cfa03248ef419f73就可以了。

最好能给每个窗口起一个名字,这样好记些。使用C-a A给窗口起名字。使用C-a w可以看到这些窗口名字,可能名字出现的位置不同。使用putty:

putty

使用telnet:

telnet


更多Screen功能

Screen提供了丰富强大的定制功能。你可以在Screen的默认两级配置文件/etc/screenrc和$HOME/.screenrc中指定更多,例如设定screen选项,定制绑定键,设定screen会话自启动窗口,启用多用户模式,定制用户访问权限控制等等。如果你愿意的话,也可以自己指定screen配置文件。

以多用户功能为例,screen默认是以单用户模式运行的,你需要在配置文件中指定multiuser on 来打开多用户模式,通过acl*(acladd,acldel,aclchg...)命令,你可以灵活配置其他用户访问你的screen会话。更多配置文件内容请参考screen的man页。

위 내용은 Linux는 화면을 사용하여 원격 세션 인스턴스 방법을 관리합니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.