MIT-Missing-Semester笔记(四): 命令行环境
2023-07-09  学习

任务控制

结束进程

输入 Ctrl-C 时,shell 会发送一个SIGINT 信号到进程。SIGQUIT 信号,通过输入Ctrl-\可以发送该信号。

#!/usr/bin/env python3
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)
    # \n 换新行 \r 刷新当前行
    print("\r{}".format(i), end="")
    i += 1

SIGTERM 则是一个更加通用的、也更加优雅地退出信号。为了发出这个信号我们需要使用 kill 命令, 它的语法是: kill -TERM <PID>

暂停和后台执行进程

Ctrl-Z 会让 shell 发送 SIGTSTP 信号

jobs列出当前终端会话的未完成任务,通过编号引用任务(直接123,或加%)

kill命令只能通过%来操作任务,fgbg可以直接123

jobs+为最后第一个放入后台的任务,-为倒数第二个放入后台的任务

恢复暂停的工作fgbg(前台、后台)

pgrep检索pid

$ python3 sigint.py
24^Z
[1]+  Stopped                 python3 sigint.py
$ fg 1
python3 sigint.py
43^Z
[1]+  Stopped                 python3 sigint.py
$ jobs
[1]+  Stopped                 python3 sigint.py
$ pgrep -l python
2824 python3
$ jobs
[1]-  Stopped                 python3 sigint.py
[2]+  Stopped                 sleep 1000
$ kill -SIGHUP %1
[1]-  Stopped                 python3 sigint.py
$ jobs
# 贴心地再显示一次
[1]-  Hangup                  python3 sigint.py
[2]+  Stopped                 sleep 1000
$ jobs
[2]+  Stopped                 sleep 1000

命令中的 & 后缀可以让命令在直接在后台运行,这使得可以直接在 shell 中继续做其他操作,不过它此时还是会使用 shell 的标准输出,这一点有时会比较恼人(这种情况可以使用 shell 重定向处理)。

-u Force the stdout and stderr streams to be unbuffered

python3 -u直接重定向,不经过缓冲,否则重定向到其他文件可能不显示?

关闭终端(会发送另外一个信号SIGHUP

nohup (一个用来忽略 SIGHUP 的封装) ,kill -SIGHUP对它无效

SIGKILL 是一个特殊的信号,不能被进程捕获并且它会马上结束该进程。传说中的9号,会留下孤儿进程

kill默认是15,SIGTERM

终端多路复用:tmux

tmux可以方便地在终端上操作多个窗口,通过三个层级管理:会话(session)、窗口(window)、面板(pane)

这有篇很好的教程A Quick and Easy Guide to tmux

tmux的快捷键都是先按Ctrl+b,再按某功能键

image-20230710151428980

  • session
    • tmux开始一个新的会话
    • tmux new -s NAME以指定名称开始一个新会话
    • tmux ls列出当前会话
    • 输入Ctrl+b d与当前会话分离
    • tmux attach -t NAME连接指定会话,a就行,[-t target-session]
    • tmux kill-session -t NAME删除指定会话,Ctrl+d退出则直接删除
  • window:类似浏览器的标签,下边状态栏加*的是当前窗口
    • Ctrl+b c创建新窗口
    • Ctrl+b number跳转指定窗口
    • Ctrl+b ,重命名当前窗口
  • pane 可以将当前窗口分屏
    • Ctrl+b %竖直分屏
    • Ctrl+b "水平分屏
    • Ctrl+b 上下左右在不同pane中跳转
    • Ctrl+b z最大/小化当前pane
    • Ctrl+d关闭当前pane

确实很方便