改用 screen 作为 byobu 的后端

如题,一分钟Mark文。

byobu 是很方便的 Unix 窗口管理器 和 Terminal Multiplexer,它是一套 profiles 或者说 wrapper ,降低使用 tmux 或 screen 的 配置 和 操作 成本。(如果不知道我说什么,看这里《小工具专题》 ,还有 byobu主页

不过我只能算轻度用户,多数时间只使用两个功能:

  • 通过 detach 让我下线之后 Session 还能继续干活,以及下次上线不用重新找目录
  • 方便的多窗口管理(F2,F3,F4 完事)

从没关心过后面是 tmux 还是 screen。直到公司服务器的 byobu 由我一个人用,到大家都用。大家直接敲 byobu 完事,于是都挤在一个 Session 里,互相干扰。


用 byobu 之前我是一个 screen 用户,自然想到大家各自连自己的 Session 。试着给 byobu 加 screen 的参数,发现不行。这时才想到去确认,发现当前版本(5.74)byobu 默认 backend 是 tmux。(印象中是不是早期 byobu 试过以 screen 为默认?忘了)

1
2
3
4
5
$ byobu --version
byobu version 5.74
tmux 1.8
$ cat ~/.byobu/backend
BYOBU_BACKEND=tmux

我知道 tmux 也很强大,加上一些指令和参数,也可以分别创建和管理 Session。可是,我已经习惯 screen ,所以决定把后端换掉。(各位看到这里不必跟我争论哪个好用)

1
2
3
4
# 首先你要确定装了 screen,我一直有装就跳过
$ vim ~/.byobu/backend # 把里面的值改为 screen,然后保存
$ cat ~/.byobu/backend
BYOBU_BACKEND=screen

这时候开始,执行 byobu 背后已经是 screen 在干活。最初目的是为了方便分别创建 Session,对应 screen -S SessionName,相应的 byobu 指令是否可行呢?

1
2
3
4
5
6
$ byobu -S jayce
# 执行完跳到了一个新的窗口,但是不是真的成功了呢?
~ byobu -ls
There is a screen on:
151664.jayce (Tuesday, September 19, 2017 05:30:12 CST) (Attached)
1 Socket in /var/run/screen/jayce.

注意最后的那个 Attached,表明现在就在这个 Session 里。

如果按 F6 或者 Ctrl-A,Ctrl-D detach ,之后再看:(注意,如果第一次在 screen 按 Ctrl-A ,它会询问 Escape Sequence,建议选 1 screen mode 就好)

1
2
3
4
$ byobu -ls
There is a screen on:
151664.jayce (Tuesday, September 19, 2017 05:30:12 CST) (Detached)
1 Socket in /var/run/screen/jayce.

基本能用了,只是还有一个小问题:如果不记得/不确定之前的 Session 还在不在,那么操作流程是

1
2
3
$ byobu -ls # 列出当前所有 Session
$ byobu -r mysession # 如果 Session 还在就重连
$ byobu -S mysession # 如果因为重启的原因不在,新建一个

比较麻烦。screen 自带 -R SessionName 参数实现『有则重连,无则新建』 的动作。可尝试把 -R加载 byobu 后面,不支持。byobu 是怎样接受参数并传递给 screen 的呢?试一下在没有 Session 的情况下,执行没有参数的 byobu:

1
2
3
4
5
6
$ byobu
# Ctrl-A,D detach
$ screen -ls # 跟 byobu -ls 等价
There is a screen on:
152910.byobu (Tuesday, September 19, 2017 05:48:24 CST) (Detached)
1 Socket in /var/run/screen/jayce.

byobu 背后执行的是 screen -S byobu ,也就是说,如果不指定任何参数,byobu 默认会创建一个名字叫 『byobu』 的 Session。而如果指定了(某些)参数,默认名字就不会起效。但 -R 不算在某些参数里。

1
2
3
4
5
6
7
8
9
10
11
$ sudo vim `which byobu`
# 省略....
148 BYOBU_SESSION_NAME="-S $PKG" # 这里的 $PKG 的值就是 byobu
149 # Zero out $BYOBU_SESSION_NAME if user has specified a session name
150 for i in "$@"; do
151 case $i in
152 -*r*|-*d*|-*D*|-*S*|-ls|-list)
153 BYOBU_SESSION_NAME=
154 ;;
155 esac
156 done

看完上面的内容,应该就知道了『某些参数』是哪些。当指定这几个参数时,默认 Session 名就会被清空。

那容易,把『某些参数』改成下面的样子:

1
152 -*r*|-*R*|-*d*|-*D*|-*S*|-ls|-list)

保存。好了,-R 可以用了。

就酱。


知识共享 “署名-非商业性使用-相同方式共享” 4.0 (CC BY-NC-SA 4.0)”许可协议
本文为本人原创,采用知识共享 “署名-非商业性使用-相同方式共享” 4.0 (CC BY-NC-SA 4.0)”许可协议进行许可。
本作品可自由复制、传播及基于本作品进行演绎创作。如有以上需要,请留言告知,在文章开头明显位置加上署名(Jayce Chant)、原链接及许可协议信息,并明确指出修改(如有),不得用于商业用途。谢谢合作。
详情请点击查看协议具体内容。