友链
导航
These are the good times in your life,
so put on a smile and it'll be alright
友链
导航
SIGHUP 信号, that's why 关掉窗口/断开连接会使得正在运行的程序死掉.
在Linux/Unix中,有这样几个概念:
根据POSIX.1定义:
因此当网络断开或终端窗口关闭后,控制进程收到SIGHUP信号退出,会导致该会话期内其他进程退出。
How do I put an already-running process under nohup?
Ctrl+Z
to stop (pause) the program and get back to the shell.bg
to run it in the background.disown -h [job-spec]
where [job-spec] is the job number (like %1
for the first running job; find about your number with the jobs command) so that the job isn't killed when the terminal closes.如果我们可以忽略SIGHUP信号,关掉窗口应该就不会影响程序的运行了。nohup命令可以达到这个目的,如果程序的标准输出/标准错误是终端,nohup默认将其重定向到nohup.out文件。值得注意的是nohup命令只是使得程序忽略SIGHUP信号,还需要使用标记&把它放在后台运行。
nohup <command> [argument…] &
虽然nohup很容易使用,但还是比较“简陋”的,对于简单的命令能够应付过来,对于复杂的需要人机交互的任务就麻烦了。
简单来说,Screen是一个可以在多个进程之间多路复用一个物理终端的窗口管理器。Screen中有会话的概念,用户可以在一个screen会话中创建多个screen窗口,在每一个screen窗口中就像操作一个真实的telnet/SSH连接窗口那样。
#1 $ screen #2 $ screen vi foo # 退出vi将退出该 screen
在 screen 窗口内 C-a d
$ screen -ls
$ screen -r 16582
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 S | 新建一个水平的分屏1) |
C-a <tab> | 在分屏之间切换 |
C-a Q | 关闭当前活跃分屏外的所有分屏 |
-c file | 使用配置文件file,而不使用默认的$HOME/.screenrc |
-d or -D [pid.tty.host] | 不开启新的screen会话,而是断开其他正在运行的screen会话 |
-h num | 指定历史回滚缓冲区大小为num行 |
-list or -ls | 列出现有screen会话,格式为pid.tty.host |
-d -m | 启动一个开始就处于断开模式的会话 |
-r sessionowner/ [pid.tty.host] | 重新连接一个断开的会话。多用户模式下连接到其他用户screen会话需要指定sessionowner,需要setuid-root权限 |
-S sessionname | 创建screen会话时为会话指定一个名字 |
-v | 显示screen版本信息 |
-wipe [match] | 同-list,但删掉那些无法连接的会话 |
-d –m 选项是一对很有意思的搭档。他们启动一个开始就处于断开模式的会话。你可以在随后需要的时候连接上该会话。有时候这是一个很有用的功能,比如我们可以使用它调试后台程序。该选项一个更常用的搭配是:-dmS sessionname
$ screen -d -m tailf /var/log/php5/cgi.log
你是不是每次登录到系统都要开很多窗口,然后每天都要重复打开关闭这些窗口?让screen来帮你“保存”吧,你只需要打开一个ssh窗口,创建需要的screen窗口,退出的时候C-a d“保存”你的工作,只要别杀掉screen会话,下次登录后直接screen -r <screen_pid>就可以了。
最好能给每个窗口起一个名字,这样好记些。使用C-a A给窗口起名字。使用C-a w可以看到这些窗口名字。
# 开启 screen toksea@ubuntu:~$ screen # 在 screen 中再建立一个会话 C-a c # 查看进程 toksea@ubuntu:~$ pstree ├─sshd───sshd───sshd───bash───screen───screen─┬─bash | └─bash───pstree
# 显示 tab bar caption always "%{= kw}%-w%{= BW}%n %t%{-}%+w %-= @%H - %LD %d %LM - %c" # 重设 Escape Key escape ^A^A bind o other # 使用鼠标滚轮 termcapinfo xterm* ti@:te@
tmux 默认不能用滚轮查看之前的输出… wtf
http://superuser.com/questions/209437/how-do-i-scroll-in-tmux
# 开启 tmux toksea@ubuntu:~$ tmux # 在 tmux 中再建立一个会话 C-b c # 查看进程 toksea@ubuntu:~$ pstree ├─sshd───sshd───sshd───bash───tmux ├─tmux─┬─bash │ └─bash───pstree