日期:2022年11月27日标签:Developer

Shell 中的工作控制 #

很多 command 执行后,会一直运行并不会立即结束,它们会一直占据命令行,导致不会出现下一个 prompt。例如使用 python 启动 server:

$ python -m http.server
Serving HTTP on 0.0.0.0 port 8000 (http://0.0.0.0:8000/) ...

如果用户想继续使用命令行就必须新开一个命令行窗口。那么有没有其他的方式可以使这些不会立即结束的命令在后台运行呢?

Foreground 和 Background #

1)以后台进程启动命令

可以将工作转换成后台工作(background job),在运行的命令行后添加 & 将启动命令为 background job。

$ python -m http.server &
[2] 910

2)显示 background job 列表

使用 jobs 可以查看当前已有的后台工作。

$ jobs
[1]   Running                 python3 -m http.server 3000 &
[2]-  Running                 python3 -m http.server &
[3]+  Running                 python3 -m http.server 3100 &

第一列的数字表示后台工作的 id,第二列表示当前的状态(Running 或者 Stopped),最后表示启动的命令详情。

3)将已经启动的程序移动到后台继续运行

如果一个程序已经在运行了,那么你可能会执行 ^ + C (windows 中输入 ctrl + C)终止程序,然后重新以 background job 形式执行这个程序。但是如果你正在下载一个非常大的文件,如果终止了,那么就需要重新下载,更好的做法是将已经运行的程序移动到后台继续运行。

我们可以使用 ^ + Z 将程序移动到后台,并进入暂停状态:

$ python -m http.server 3100
Serving HTTP on 0.0.0.0 port 3100 (http://0.0.0.0:3100/) ...
^Z
[3]+  Stopped                 python3 -m http.server 3100

可以从上面的 shell 输出信息看到上面的程序 id 为 3,并且状态为 Stopped。然后通过 bg %3 可以使 id 为3的暂停的后台进程进入运行状态。

$ bg %3
[3]+ python3 -m http.server 3100 &

4)background 转换为 foreground

使用 fg %1 可以使 id 为 1 的后台工作变成前台工作。

$ fg %1
python3 -m http.server 3000

5)终止后台进程

使用 kill %2 可以终止 id 为 2 的后台工作。

$ kill %2
[2]-  Terminated              python3 -m http.server

分屏会更好 #

现在的 terminal 很多都支持分屏,我目前在 windows 上使用的 windows terminal 也支持分屏操作,所以无需将工作移到后台运行,如果需要执行另一个命令直接重启一个分屏即可。所以更推荐使用分屏,而不是 background jobs。

还有 screen 和 tmux 可以使 shell 支持分屏的能力。

参考资料 #

推荐一本非常棒的 shell 学习教程:Effective Shell

(完)

目录