Command-line Environment
SIGNAL
您的 shell
会使用 UNIX
提供的信号机制执行进程间通信。
我们可以使用man signal
来查看signal
的帮助文档。
对于如下的 python
程序
1 | #!/usr/bin/env python |
运行该程序后按 ctrl+c
会捕捉到信号程序继续运行。
视频中按 ctrl+\
可以结束程序,但是我这里不知道为什么不行,得按 ctrl+z
。
在 zsh
下按 ctrl+z
会将进程 suspended
1 | sleep 1000 |
在bash
下ctrl+z
会将进程 stopped
不知道两者有何区别
1 | sleep 1000 |
以下命令可以启动一个后台程序
1 | nohup sleep 2000 & |
一旦关闭终端(会发送另外一个信号SIGHUP
),后台进程会终止。
为了防止这种情况发生,您可以使用 nohup
(一个用来忽略 SIGHUP
的封装) 来运行程序。
最后 &
的意思是在后台运行程序。
1 | jobs |
使用 jobs
可以查看运行或停止的进程。
我们可以用 bg
继续执行进程。
1 | bg %1 |
kill
可以向进程发送信号
如下,我们可以发送 -STOP
信号
1 | jobs |
kill可以发送 -HUP
信号,这个信号和关掉中断时发送的信号相同。
1 | kill -KILL %1 |
-KILL
信号可以杀死进程。
fg
命令可以将后台程序放到前台
1 | sleep 2000 & |
TMUX
TMUX
有三个重要的概念
- Sessions
- Windows
- Panes
- Windows
session
包含Windows
,Windous
包含Panes
。
tmux
启动tmux
,ctrl+b d
(先一起按下ctrl+b
,然后一起松开ctrl+b
,最后按下d
) 保留运行的程序暂时退出tmux
。
默认前缀一般都是ctrl+b
,但是很多人把它设置为 ctrl+a
,因为它通常更加方便。
tmux a可以重新返回终端。
就是在wsl的zsh中每次都要切换下字体,有点烦。
1 | tmux new -s <session-name> |
可以创建一个名为session-name
的session
,但是教程里是用 -t
不知道有什么区别。
tmux ls查看
1 | tmux ls |
1 | tmux a -t <session-name> |
可以进入指定名称的session
。
Windows
<C-b> c
创建一个新的窗口,使用<C-d>
关闭<C-b> N
跳转到第 N 个窗口,注意每个窗口都是有编号的<C-b> p
切换到前一个窗口<C-b> n
切换到下一个窗口<C-b> ,
重命名当前窗口<C-b> w
列出当前所有窗口
plane
<C-b> "
水平分割<C-b> %
垂直分割<C-b> <方向>
切换到指定方向的面板,<方向> 指的是键盘上的方向键<C-b> z
切换当前面板的缩放<C-b> [
开始往回卷动屏幕。您可以按下空格键来开始选择,回车键复制选中的部分<C-b> <空格>
在不同的面板排布间切换
htop
可以查看进程的资源占用情况。
别名
有的时候你要经常输入一些很长的命令,这个时候你可以用别名来取代这个很长的命令。
比如:
1 | # 创建常用命令的缩写 |
注意,
=
两边是没有空格的,因为alias
是一个 shell 命令,它只接受一个参数。值得注意的是,在默认情况下 shell 并不会保存别名。为了让别名持续生效,您需要将配置放进 shell 的启动文件里,像是
.bashrc
或.zshrc
配置文件(Dotfiles)
很多程序的配置都是通过纯文本格式的被称作点文件的配置文件来完成的(之所以称为点文件,是因为它们的文件名以 .
开头,例如 ~/.vimrc
。也正因为此,它们默认是隐藏文件,ls
并不会显示它们)。
shell 的配置也是通过这类文件完成的。在启动时,您的 shell 程序会读取很多文件以加载其配置项。根据 shell 本身的不同,您从登录开始还是以交互的方式完成这一过程可能会有很大的不同。关于这一话题,这里 有非常好的资源。
如下工具可以用如下配置文件进行配置。
bash
-~/.bashrc
,~/.bash_profile
git
-~/.gitconfig
vim
-~/.vimrc
和~/.vim
目录ssh
-~/.ssh/config
tmux
-~/.tmux.conf
本课程的老师们也在 GitHub 上开源了他们的配置文件: Anish, Jon, Jose.
我们可以建立一个 dotfiles
文件夹来统一管理配置文件,并使用版本控制系统进行管理,然后通过脚本将其 符号链接 到需要的地方。
SSH
我们可以通过 ssh-keygen
来生成密匙对,
1 | ssh-keygen -o -a 100 -t ed5519 |
其实直接 ssh-keygen
就行,后面那一串可能是用来加强安全性的。
我们可以通过如下命令将公钥传递到服务器:
1 | cat ~/.ssh/id_rsa.pub | ssh ubuntu@101.35.161.* tee .ssh/authorized_keys |
照理来说就能免密登录了,但我不行不知道为什么。
可以用 ssh-copy-id
不用输入passphrase
。
我们可以通过scp发送文件
1 | scp motes.md ubuntu@101.35.161.*:foobar.md |
如果文件较多,可以用rsync
发送文件,当传到一半中断时,可以从中断处继续传,因为rsync
只对差异文件进行修改。
1 | rsync -avP . ubuntu@101.35.161.*:missing |
我们可以在 ~/.ssh/config
中加入以下内容
1 | Host txy |
来避免每次都输入很长的远程端口地址。
一个技巧是我们可以在远程服务器的tmux
中跑程序,退出以后再回来程序还在跑,所以我们可以用这种方式跑耗时比较长的程序。