任务控制
结束进程
输入 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
确实很方便