screen命令
Screen是一个可以在多个进程之间多路复用一个物理终端的窗口管理器。Screen中有会话的概念,用户可以在一个screen会话中创建多个screen窗口,在每一个screen窗口中就像操作一个真实的telnet/SSH连接窗口那样。创建screen窗口的方法有:
1. 直接在命令行键入screen命令
[sjy@xxx ~]$ screen
2. Screen命令+要执行的程序(创建一个执行vim test.txt的新窗口会话,退出vim会退出该窗口/会话)
[sjy@xxx ~]$ screen vim test.txt
3. 最常用的是,Screen建立一个自定义名称的窗口会话
[sjy@xxx ~]$ screen -R myname
screen常用选项及示例
-d <作业名称> 将指定的screen作业离线。
-r <作业名称> 恢复离线的screen作业。
-R 先试图恢复离线的作业。若找不到离线的作业,即建立新的screen作业。
-s 指定建立新视窗时,所要执行的shell。
-S <作业名称> 指定screen作业的名称。
-v 显示版本信息。
-x 恢复之前离线的screen作业。
-ls或--list 显示目前所有的screen作业。
-wipe 检查目前所有的screen作业,并删除已经无法使用的screen作业。
screen -S yourname -> 新建一个叫yourname的session
screen -ls -> 列出当前所有的session
screen -r yourname -> 回到yourname这个session
screen -d yourname -> 远程detach某个session
screen -XS yourname quit -> 删除yourname这个detached的session(wipe删不掉的)
给screen窗口发送的常用命令【C-a是Ctrl+A的快捷键】
C-a c -> 创建一个新的运行shell的窗口并切换到该窗口
C-a n -> Next,切换到下一个 window
C-a p -> Previous,切换到前一个 window
C-a d -> detach,暂时离开当前session,将目前的 screen session (可能含有多个 windows) 丢到后台执行,并会回到还没进 screen 时的状态,此时在 screen session 里,每个 window 内运行的 process (无论是前台/后台)都在继续执行,即使 logout 也不影响。
C-a k -> kill window,强行关闭当前的 window
SIGHUP 信号:为什么关掉窗口/断开连接会使得正在运行的远端程序死掉
在Linux/Unix中,有这样几个概念:
· 进程组(process group):一个或多个进程的集合,每一个进程组有唯一一个进程组ID,即进程组长进程的ID。
· 会话期(session):一个或多个进程组的集合,有唯一一个会话期首进程(session leader)。会话期ID为首进程的ID。
会话期可以有一个单独的控制终端。与控制终端连接的会话期首进程叫做控制进程。当前与终端交互的进程称为前台进程组。其余进程组称为后台进程组。
挂断信号(SIGHUP)默认的动作是终止程序。当终端接口检测到网络连接断开,将挂断信号发送给控制进程(会话期首进程)。如果会话期首进程终止,则该信号发送到该会话期前台进程组。一个进程退出导致一个孤儿进程组中产生时,如果任意一个孤儿进程组进程处于STOP状态,发送SIGHUP和SIGCONT信号到该进程组中所有进程。
因此当网络断开或终端窗口关闭后,控制进程收到SIGHUP信号退出,会导致该会话期内其他进程退出。
tee命令
说明:tee命令会从标准输入设备读取数据,将其内容输出到标准输出设备,同时保存成文件。参数: -a 或 --append 附加到既有文件的后面,而非覆盖它。
-i-i 或 --ignore-interrupts 忽略中断信号。
--version 显示版本信息。
[sjy@xxx ~]$pwd | tee a.out
/home/sjy
[sjy@xxx ~]$cat a.out
/home/sjy
创建一个视窗用于在后台执行程序,并将打印到视窗屏幕上的内容保存成文件,供后期查看。
[sjy@xxx ~]screen -S mysession | ./myprogram.sh | tee myprogram.log