当前位置: 首页 > 科技观察

&详解

时间:2023-03-12 07:07:53 科技观察

inLinux其实命令的使用并不难。例如mkdir、touch和find也可以分别简单概括为“新建目录”、“更新文件”和“在目录树中查找文件”,仅此而已。但是如果你想了解命令串mkdirtest_dir2>/dev/null||touchimages.txt&&find.-iname"*jpg">backup/dir/images.txt&的用途,以及为什么要这样写,它不是那么简单。键是命令之间的连接符号。掌握这些符号的用法,不仅能让你更好地理解整体的工作原理,还能让你知道如何有效组合不同的命令,提高工作效率。在本文和后续文章中,我将介绍如何在不同的场景中使用“&”和管道符号(|)。幕后花絮我举一个简单的例子,看看如何使用&符号把下面的命令放到后台:cp-Roriginal/dir/backup/dir/这个命令的目的是递归复制original/的内容dir/到backup/dir/。虽然看起来很简单,但是如果原目录下的文件太大,在执行的过程中会一直卡在终端。因此,可以在命令末尾添加一个&符号,将此任务放入后台执行:cp-Riginal/dir/backup/dir/&任务放入后台执行后,可以立即继续在同一个终端上是有效的,即使关闭终端也不影响这个任务的正常执行。需要注意的是,如果任务需要输出内容到标准输出(如echo或ls),即使使用了&,它也会在前台等待这些输出任务运??行完毕。当使用&将一个进程置于后台时,Bash会提示该进程的进程ID。Linux系统中运行的每一个进程都有一个唯一的进程ID,可以使用进程ID来挂起、恢复或终止相应的进程,因此进程ID非常重要。这时,只要停留在启动进程的终端,就可以使用以下命令来管理后台进程:jobs命令可以显示终端当前运行的进程,包括前台运行的进程和后台运行的进程。它为每一个正在执行的流程任务分配一个序号(这个序号不是进程ID),这些序号可以用来指代每一个流程任务。$jobs[1]-Runningcp-i-Roriginal/dir/*backup/dir/&[2]+Runningfind.-iname"*jpg">backup/dir/images.txt&fg命令可以把进程任务运行在background到前台运行,这样可以更方便的进行交互。根据jobs命令提供的进程任务序号,然后在前面加上%符号,就可以将对应的进程任务放到前台运行。$fg%1#把上面序列号为1的cp任务放到前台运行cp-i-Roriginal/dir/*backup/dir/如果这个进程任务被挂起,fg命令会启动它。使用ctrl+z组合键可以暂停在前台运行的任务,只是暂停,而不是终止任务。当使用fg或bg命令重新启动任务时,任务将从暂停的地方恢复执行。但是sleep[4]命令是个特例,sleep任务挂起的时间会算在sleep时间内。因为sleep命令是以系统时钟的时间为准,而不是实际运行的时间。也就是说,如果你运行sleep30,然后暂停任务超过30秒,任务将在恢复执行时立即终止并退出。?bg命令会将任务置于后台执行,如果任务处于暂停状态,也会启动。$bg%1[1]+cp-i-Roriginal/dir/*backup/dir/&如前所述,以上命令只能在同一个终端下使用。如果启动流程任务的终端关闭或切换到其他终端,则无法使用上述命令。如果你想从另一个终端管理后台进程,你需要其他工具。例如,您可以使用kill[5]命令从另一个终端终止进程:kill-sSTOP其中PID是当您使用&将进程置于后台时Bash显示的进程ID。如果当时没有记录进程ID,也可以使用ps命令(代表进程)获取所有正在运行的进程的进程ID,像这样:ps|grepcp执行后会显示所有包含cp字符串的进程,比如上例中的cp进程。同时会显示对应的进程ID:$ps|grepcp14444pts/300:00:13cp本例中进程ID为14444,可以使用以下命令挂起该后台进程:kill-sSTOP14444注意那这里的STOP就相当于上面说的ctrl+z组合键的作用只是暂停进程而已。如果你想启动一个挂起的进程,你可以发送一个CONT信号给进程:kill-sCONT14444这给出了一个可以发送给进程的常见信号列表[6]。如果要终止一个进程,可以发送TERM信号:kill-sTERM14444如果进程不响应TERM信号拒绝退出,也可以发送KILL信号强制终止进程:kill-sKILL14444强制终止进程可能会有一定的风险,但是如果遇到进程无节制地消耗资源时,这样的信号还是可以派上用场的。另外,如果不确定进程ID是否正确,可以在ps命令中加上x参数:$psx|grepcp14444pts/3D0:14cp-i-Roriginal/dir/Hols_2014.mp4original/dir/Hols_2015.mp4original/目录/Hols_2016。mp4original/dir/Hols_2017.mp4original/dir/Hols_2018.mp4backup/dir/所以你可以看看是不是你需要的进程ID。***介绍一个ps和grep结合的命令:$pgrepcp8181926334047546172889613633966801373514444pgrep可以直接显示字符串为cp的进程的进程ID。可以加一些参数让输出更清晰:$pgrep-lxcp14444cp这里,-l参数会让pgrep显示进程名,-x参数会让pgrep完全匹配cp命令。如果您仍想了解有关此命令的更多详细信息,请尝试运行pgrep-ax。总结在命令末尾加上&可以让我们理解前台和后台进程的概念以及如何管理它们。在UNIX/Linux术语中,在后台运行的进程称为守护进程。如果您曾经听过这个词,那么您现在就知道它的意思了。与其他符号一样,&在命令行中有许多其他用途。在下一篇文章中,我将进行更详细的介绍。