Maison > Article > interface Web > Linux utilise screen pour gérer les méthodes d'instance de session à distance
Avez-vous souvent besoin de SSH ou de Telent pour vous connecter à distance à un serveur Linux ? Avez-vous souvent des maux de tête avec des tâches de longue durée, telles que la sauvegarde du système, le transfert FTP, etc. Normalement, nous ouvrons une fenêtre de terminal distant pour chacune de ces tâches car leur exécution prend trop de temps. Vous devez attendre la fin de l'exécution. Pendant cette période, vous ne pouvez pas fermer la fenêtre ou vous déconnecter, sinon la tâche sera tuée et tout sera abandonné à mi-chemin.
Voyons pourquoi la fermeture de la fenêtre/la déconnexion entraînera la mort du programme en cours d'exécution.
Sous Linux/Unix, il existe plusieurs concepts :
Groupe de processus (process group) : un ensemble d'un ou plusieurs processus, chaque groupe de processus a le seul processus ID de groupe, qui est l'ID du processus responsable du processus.
Session : un ensemble d'un ou plusieurs groupes de processus, avec un animateur de session unique. L'ID de session est l'ID du premier processus.
Une session peut avoir un terminal de contrôle séparé. Le premier processus de la session connecté au terminal de contrôle est appelé processus de contrôle. Le processus qui interagit actuellement avec le terminal est appelé groupe de processus de premier plan. Les groupes de processus restants sont appelés groupes de processus en arrière-plan.
Selon la définition POSIX.1 :
L'action par défaut du signal de raccrochage (SIGHUP) est de terminer le programme.
Lorsque l'interface du terminal détecte que la connexion réseau est déconnectée, elle envoie un signal de raccrochage au processus de contrôle (le premier processus de la session).
Si le processus de tête de session se termine, ce signal est envoyé au groupe de processus de premier plan de la session.
Lorsqu'un processus se termine et qu'un groupe de processus orphelins est créé, si un processus de groupe de processus orphelins est à l'état STOP, les signaux SIGHUP et SIGCONT sont envoyés à tous les processus du groupe de processus.
Par conséquent, lorsque le réseau est déconnecté ou que la fenêtre du terminal est fermée, le processus de contrôle reçoit le signal SIGHUP et se termine, ce qui entraînera la fermeture des autres processus de la session.
Regardons un exemple. Ouvrez deux fenêtres de terminal SSH et exécutez la commande top dans l'une d'elles.
[root@tivf09 root]# top
Dans une autre fenêtre de terminal, recherchez l'ID de processus top comme 5180, et son ID de processus parent est 5128, qui est le shell de connexion.
[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
Utilisez la commande pstree pour voir cette relation plus clairement :
[root@tivf09 root]# pstree -H 5180|grep top |-sshd-+-sshd---bash---top
Utilisez la commande ps-xj pour voir que le shell de connexion (PID 5128) et top sont dans le idem Pendant la session, le shell est le premier processus de la session et son PGID de groupe de processus est 5128. Le PGID du groupe de processus de Top est 5180, qui est le groupe de processus de premier plan.
[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
Fermez la première fenêtre SSH et vous pourrez voir dans une autre fenêtre que top a également été supprimé.
[root@tivf09 root]# ps -ef|grep 5128 root 18699 3672 0 04:35 pts/2 00:00:00 grep 5128
Si l'on peut ignorer le signal SIGHUP, la fermeture de la fenêtre ne devrait pas affecter le fonctionnement du programme. La commande nohup peut atteindre cet objectif si la sortie standard/erreur standard du programme est le terminal, nohup le redirigera vers le fichier nohup.out par défaut. Il convient de noter que la commande nohup amène uniquement le programme à ignorer le signal SIGHUP. Vous devez également utiliser la marque & pour l'exécuter en arrière-plan.
nohup e2b9f03cad787b9644e1f51fd23b7dac [argument…] &
Bien que nohup soit facile à utiliser, il reste relativement "brut". Il peut gérer des commandes simples, mais il est gênant pour les tâches complexes qui nécessitent une interaction homme-machine.
En fait, nous pouvons utiliser un écran utilitaire plus puissant. Les distributions Linux populaires (telles que Red Hat Enterprise Linux 4) sont généralement fournies avec l'utilitaire screen. Sinon, vous pouvez le télécharger depuis le site Web officiel de GNU screen.
[root@tivf06 ~]# rpm -qa|grep screen xscreensaver-4.18-5.rhel4.11 screen-4.0.2-5
En termes simples, Screen est un gestionnaire de fenêtres qui peut multiplexer un terminal physique entre plusieurs processus. Screen a le concept de session. Les utilisateurs peuvent créer plusieurs fenêtres d'écran dans une session d'écran, et chaque fenêtre d'écran revient à exploiter une véritable fenêtre de connexion telnet/SSH. Il existe plusieurs façons de créer une nouvelle fenêtre dans screen :
1. Tapez la commande screen
[root@tivf06 ~]# screen
Screen directement sur la ligne de commande pour créer une fenêtre plein écran pour exécuter le shell. Vous pouvez exécuter des programmes shell arbitraires comme dans une fenêtre ssh. Tapez exit dans la fenêtre pour quitter la fenêtre. S'il s'agit de la seule fenêtre pour la session d'écran, la session d'écran se termine, sinon l'écran passe automatiquement à la fenêtre précédente.
2. La commande Screen est suivie du programme que vous souhaitez exécuter.
[root@tivf06 ~]# screen vi test.c
Screen crée une session à fenêtre unique qui exécute vi test.c Quitter vi quittera la fenêtre/session.
3. Les deux méthodes ci-dessus créent une nouvelle session d'écran. Nous pouvons également créer de nouvelles fenêtres au sein d’une session d’écran existante. Tapez C-a c dans la fenêtre d'écran actuelle, c'est-à-dire la touche Ctrl + une touche, puis appuyez sur la touche c, écran Créez une nouvelle fenêtre dans la session et accédez-y.
l'écran dispose également de fonctions plus avancées. Vous pouvez temporairement déconnecter (détacher) la session d'écran sans interrompre l'exécution du programme dans la fenêtre d'écran, et reconnecter (attacher) la session ultérieurement pour reprendre le contrôle des programmes exécutés dans chaque fenêtre. Par exemple, nous ouvrons une fenêtre d'écran pour éditer le fichier /tmp/abc :
[root@tivf06 ~]# screen vi /tmp/abc
Ensuite, nous voulons quitter temporairement et faire autre chose, comme aller se promener, puis taper C-a d dans le champ fenêtre d'écran, et Screen donnera Une invite détachée apparaît :
半个小时之后回来了,找到该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 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:
使用telnet:
Screen提供了丰富强大的定制功能。你可以在Screen的默认两级配置文件/etc/screenrc和$HOME/.screenrc中指定更多,例如设定screen选项,定制绑定键,设定screen会话自启动窗口,启用多用户模式,定制用户访问权限控制等等。如果你愿意的话,也可以自己指定screen配置文件。
以多用户功能为例,screen默认是以单用户模式运行的,你需要在配置文件中指定multiuser on 来打开多用户模式,通过acl*(acladd,acldel,aclchg...)命令,你可以灵活配置其他用户访问你的screen会话。更多配置文件内容请参考screen的man页。
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!