wys的个人博客

你有很多事放不下?做人要潇洒一点~

0%

Command-line Environment

Command-line Environment

SIGNAL

您的 shell 会使用 UNIX 提供的信号机制执行进程间通信。

我们可以使用man signal 来查看signal的帮助文档。

对于如下的 python 程序

1
2
3
4
5
6
7
8
9
10
11
12
#!/usr/bin/env python
import signal, time

def handler(signum, time):
print("\nI got a SIGINT, but I am not stopping")

signal.signal(signal.SIGINT, handler)
i = 0
while True:
time.sleep(.1)
print("\r{}".format(i), end="")
i += 1

运行该程序后按 ctrl+c 会捕捉到信号程序继续运行。

视频中按 ctrl+\ 可以结束程序,但是我这里不知道为什么不行,得按 ctrl+z

zsh 下按 ctrl+z 会将进程 suspended

1
2
3
sleep 1000
^Z
[2] + 894 suspended sleep 1000

bashctrl+z 会将进程 stopped 不知道两者有何区别

1
2
3
 sleep 1000
^Z
[1]+ Stopped sleep 1000

以下命令可以启动一个后台程序

1
2
3
nohup sleep 2000 &
[2] 1053
nohup: ignoring input and appending output to 'nohup.out'

一旦关闭终端(会发送另外一个信号SIGHUP),后台进程会终止。

为了防止这种情况发生,您可以使用 nohup (一个用来忽略 SIGHUP 的封装) 来运行程序。

最后 & 的意思是在后台运行程序。

1
2
3
jobs
[1] + suspended sleep 1000
[2] - running nohup sleep 2000

使用 jobs 可以查看运行或停止的进程。

我们可以用 bg 继续执行进程。

1
2
3
 bg %1
[1] - 1000 continued sleep 1000
[1] - 1000 done sleep 1000

kill 可以向进程发送信号

如下,我们可以发送 -STOP 信号

1
2
3
4
5
 jobs
[2] + running nohup sleep 2000
bg %1
[1] - 1000 continued sleep 1000
[1] - 1000 done sleep 1000

kill可以发送 -HUP信号,这个信号和关掉中断时发送的信号相同。

1
2
kill -KILL %1
[1] + 1393 killed nohup sleep 2000

-KILL 信号可以杀死进程。

fg 命令可以将后台程序放到前台

1
2
3
4
5
6
sleep 2000 &
[1] 1524

fg %1
[1] + 1524 running sleep 2000

TMUX

TMUX有三个重要的概念

  • Sessions
    • Windows
      • Panes

session包含WindowsWindous包含Panes

tmux 启动tmuxctrl+b d (先一起按下ctrl+b,然后一起松开ctrl+b,最后按下d) 保留运行的程序暂时退出tmux

默认前缀一般都是ctrl+b,但是很多人把它设置为 ctrl+a,因为它通常更加方便。

tmux a可以重新返回终端。

就是在wsl的zsh中每次都要切换下字体,有点烦。

1
tmux new -s <session-name>

可以创建一个名为session-namesession,但是教程里是用 -t 不知道有什么区别。

tmux ls查看

1
2
3
tmux ls
0: 1 windows (created Tue Mar 29 17:20:57 2022) [189x49]
foobar: 1 windows (created Tue Mar 29 17:38:50 2022) [189x49]
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# 创建常用命令的缩写
alias ll="ls -lh"

# 能够少输入很多
alias gs="git status"
alias gc="git commit"
alias v="vim"

# 手误打错命令也没关系
alias sl=ls

# 重新定义一些命令行的默认行为
alias mv="mv -i" # -i prompts before overwrite
alias mkdir="mkdir -p" # -p make parent dirs as needed
alias df="df -h" # -h prints human readable format

# 别名可以组合使用
alias la="ls -A"
alias lla="la -l"

# 在忽略某个别名
\ls
# 或者禁用别名
unalias la

# 获取别名的定义
alias ll
# 会打印 ll='ls -lh'

注意, =两边是没有空格的,因为 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
2
3
4
5
Host txy
User ubuntu
HostName 101.35.161.126
IdentityFile ~/.ssh/id_rsa
RemoteForward 9999 localhost:8888

来避免每次都输入很长的远程端口地址。

一个技巧是我们可以在远程服务器的tmux中跑程序,退出以后再回来程序还在跑,所以我们可以用这种方式跑耗时比较长的程序。