任务控制
结束进程
输入 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命令只能通过%来操作任务,fg、bg可以直接123
jobs中+为最后第一个放入后台的任务,-为倒数第二个放入后台的任务
恢复暂停的工作fg、bg(前台、后台)
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,再按某功能键
- 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最大/小化当前paneCtrl+d关闭当前pane
确实很方便
