Linux 서버에 원격으로 로그인하기 위해 SSH나 Telent가 자주 필요합니까? 시스템 백업, FTP 전송 등 장시간 실행되는 작업으로 인해 골치 아픈 경우가 자주 있습니까? 일반적으로 이러한 작업은 실행하는 데 시간이 너무 오래 걸리기 때문에 각 작업에 대해 원격 터미널 창을 엽니다. 실행이 완료될 때까지 기다려야 합니다. 이 기간 동안 창을 닫거나 연결을 끊을 수 없습니다. 그렇지 않으면 작업이 종료되고 모든 것이 중간에 취소됩니다.
창을 닫거나 연결을 끊으면 실행 중인 프로그램이 죽는 이유를 살펴보겠습니다.
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 <command> [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 세션에서 여러 개의 스크린 창을 생성할 수 있으며, 각 스크린 창은 실제 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 [ | 进入拷贝/回滚模式 |
使用键绑定C-a ?命令可以看到, 默认的命令字符(Command key)为C-a,转义C-a(literal ^a)的字符为a:
因为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
[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
最好能给每个窗口起一个名字,这样好记些。使用C-a A给窗口起名字。使用C-a w可以看到这些窗口名字,可能名字出现的位置不同。使用putty:
使用telnet:
Screen提供了丰富强大的定制功能。你可以在Screen的默认两级配置文件/etc/screenrc和$HOME/.screenrc中指定更多,例如设定screen选项,定制绑定键,设定screen会话自启动窗口,启用多用户模式,定制用户访问权限控制等等。如果你愿意的话,也可以自己指定screen配置文件。
以多用户功能为例,screen默认是以单用户模式运行的,你需要在配置文件中指定multiuser on 来打开多用户模式,通过acl*(acladd,acldel,aclchg...)命令,你可以灵活配置其他用户访问你的screen会话。更多配置文件内容请参考screen的man页。
위 내용은 Linux는 화면을 사용하여 원격 세션 인스턴스 방법을 관리합니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!