& 号和管道符号(|)在不一样场景下的使用方法

掌握链接各个命令之间的链接符号用法也是很重要的。实际上,命令的用法并不难,例如 mkdir、touch和 find 也分别能够简单归纳为“创建新目录”、“更新文件”和“在目录树中查找文件”而已。html

但若是要理解linux

mkdir test_dir 2>/dev/null || touch images.txt && find . -iname "*jpg" > backup/dir/images.txt &

这一串命令的目的,以及为何要这样写,就没有这么简单了。工具

关键之处就在于命令之间的链接符号。掌握了这些符号的用法,不只可让你更好理解总体的工做原理,还可让你知道如何将不一样的命令有效地结合起来,提升工做效率。命令行

在这一篇文章和接下来的文章中,我会介绍如何使用 & 号和管道符号(|)在不一样场景下的使用方法。htm

幕后工做递归

我来举一个简单的例子,看看如何使用 & 号将下面这个命令放到后台运行:进程

cp -R original/dir/ backup/dir/

这个命令的目的是将 original/dir/ 的内容递归地复制到 backup/dir/ 中。虽然看起来很简单,可是若是原目录里面的文件太大,在执行过程当中终端就会一直被卡住。资源

因此,能够在命令的末尾加上一个 & 号,将这个任务放到后台去执行:字符串

cp -R original/dir/ backup/dir/ &

任务被放到后台执行以后,就能够当即继续在同一个终端上工做了,甚相当闭终端也不影响这个任务的正常执行。须要注意的是,若是要求这个任务输出内容到标准输出中(例如 echo 或 ls),即便使用了 &,也会等待这些输出任务在前台运行完毕。get

当使用 & 将一个进程放置到后台运行的时候,Bash 会提示这个进程的进程 ID。在 Linux 系统中运行的每个进程都有一个惟一的进程 ID,你可使用进程 ID 来暂停、恢复或者终止对应的进程,所以进程 ID 是很是重要的。

这个时候,只要你还停留在启动进程的终端当中,就可使用如下几个命令来对管理后台进程:

jobs 命令能够显示当前终端正在运行的进程,包括前台运行和后台运行的进程。它对每一个正在执行中的进程任务分配了一个序号(这个序号不是进程 ID),可使用这些序号来引用各个进程任务。

$ jobs[1]- Running cp -i -R original/dir/* backup/dir/ &[2]+ Running find . -iname "*jpg" > backup/dir/images.txt &

fg 命令能够将后台运行的进程任务放到前台运行,这样能够比较方便地进行交互。根据 jobs 命令提供的进程任务序号,再在前面加上 % 符号,就能够把相应的进程任务放到前台运行。

$ fg %1 # 将上面序号为 1 的 cp 任务放到前台运行
cp -i -R original/dir/* backup/dir/

若是这个进程任务是暂停状态,fg 命令会将它启动起来。

使用 ctrl+z 组合键能够将前台运行的任务暂停,仅仅是暂停,而不是将任务终止。当使用 fg 或者 bg 命令将任务从新启动起来的时候,任务会从被暂停的位置开始执行。但 sleep 命令是一个特例,sleep 任务被暂停的时间会计算在 sleep 时间以内。由于 sleep 命令依据的是系统时钟的时间,而不是实际运行的时间。也就是说,若是运行了 sleep 30,而后将任务暂停 30 秒以上,那么任务恢复执行的时候会当即终止并退出。
bg 命令会将任务放置到后台执行,若是任务是暂停状态,也会被启动起来。

$ bg %1
[1]+ cp -i -R original/dir/* backup/dir/ &

如上所述,以上几个命令只能在同一个终端里才能使用。若是启动进程任务的终端被关闭了,或者切换到了另外一个终端,以上几个命令就没法使用了。

若是要在另外一个终端管理后台进程,就须要其它工具了。例如可使用 kill 命令从另外一个终端终止某个进程:

kill -s STOP <PID>

这里的 PID 就是使用 & 将进程放到后台时 Bash 显示的那个进程 ID。若是你当时没有把进程 ID 记录下来,也可使用 ps 命令(表明 process)来获取全部正在运行的进程的进程 ID,就像这样:

ps | grep cp

执行之后会显示出包含 cp 字符串的全部进程,例如上面例子中的 cp 进程。同时还会显示出对应的进程 ID:

$ ps | grep cp
14444 pts/3 00:00:13 cp

在这个例子中,进程 ID 是 14444,所以可使用如下命令来暂停这个后台进程:

kill -s STOP 14444
注意,这里的 STOP 等同于前面提到的 ctrl+z 组合键的效果,也就是仅仅把进程暂停掉。

若是想要把暂停了的进程启动起来,能够对进程发出 CONT 信号:

kill -s CONT 14444
这个给出一个能够向进程发出的经常使用信号列表。若是想要终止一个进程,能够发送 TERM 信号:
kill -s TERM 14444
若是进程不响应 TERM 信号并拒绝退出,还能够发送 KILL 信号强制终止进程:
kill -s KILL 14444
强制终止进程可能会有必定的风险,但若是遇到进程无节制消耗资源的状况,这样的信号仍是可以派上用场的。

另外,若是你不肯定进程 ID 是否正确,能够在 ps 命令中加上 x 参数:

$ ps x| grep cp
14444 pts/3 D 0:14 cp -i -R original/dir/Hols_2014.mp4
original/dir/Hols_2015.mp4 original/dir/Hols_2016.mp4
original/dir/Hols_2017.mp4 original/dir/Hols_2018.mp4 backup/dir/

这样就能够看到是否是你须要的进程 ID 了。

最后介绍一个将 ps 和 grep 结合到一块儿的命令:

$ pgrep cp
8
18
19
26
33
40
47
54
61
72
88
96
136
339
6680
13735
14444

pgrep 能够直接将带有字符串 cp 的进程的进程 ID 显示出来。

能够加上一些参数让它的输出更清晰:

$ pgrep -lx cp
14444 cp

在这里,-l 参数会让 pgrep 将进程的名称显示出来,-x 参数则是让 pgrep 彻底匹配 cp 这个命令。若是还想了解这个命令的更多细节,能够尝试运行 pgrep -ax。

总结

在命令的末尾加上 & 可让咱们理解前台进程和后台进程的概念,以及如何管理这些进程。

在 UNIX/Linux 术语中,在后台运行的进程被称为守护进程daemon。若是你曾经据说过这个词,那你如今应该知道它的意义了。

和其它符号同样,& 在命令行中还有不少别的用法。在下一篇文章中,我会更详细地介绍。


 

原文来自: https://www.linuxprobe.com/linux-commands-fuhao.html

相关文章
相关标签/搜索