运行命令(如何在Linux后台运行命令)
在终端上运行命令的时候,如果命令执行的很快,那就没什么好说的了。如果该命令是一个耗时的操作,或者我们只是希望它一直运行,那么可能会出现以下问题:
您的终端已被该命令占用。
您的终端充满了输出数据或错误和诊断信息。
如果终端关闭,程序或命令将终止。
在Unix/Linux中,在后台运行的进程称为守护进程。通常,在后台运行的进程是非交互式的,也就是说,它不读取用户的输入。那么如何运行一个命令或者程序在后台运行,而不用担心关闭终端程序,同时我们还可以继续做其他的事情呢?
后台运行...&举个简单的例子,看看如何使用&符号在后台运行下面的命令:
#cp-Rfrom/data/dir/to/backup/dir/这个命令的目的是递归地将/data/dir/中的内容复制到/backup/dir/中。看起来很简单,但是如果原目录下的文件太大,执行过程中终端会一直被占用。
因此,您可以在命令末尾添加一个&符号,将此任务置于后台:
#cp-Rfrom/data/dir/to/backup/dir/&[1]1280任务在后台执行后,可以继续在同一个终端上工作。即使关闭终端也不会影响这个任务的正常执行。
当使用&将一个进程放到后台时,shell会提示这个进程的进程ID。Linux系统中运行的每个进程都有一个唯一的进程ID。您可以使用进程ID来暂停、恢复或终止相应的进程,因此进程ID非常重要。
jobs命令可以显示终端当前运行的进程,包括前台和后台进程。它为每个正在执行的流程任务分配一个序列号(这个序列号不是流程ID),这些序列号可以用来引用每个流程任务。
#jobs[1]-Runningcp-Rfrom/data/dir/*to/backup/dir/&[2]+Runningfind.-iname"*jpg">to/backup/dir/images.txt&Fg命令可以把后台运行的任务放到前台,方便交互。根据jobs命令提供的流程任务的序号,然后在它前面加上%符号,就可以把相应的流程任务放到前台运行了。
#fg%1#将上面序号为1的cp任务放到前台运行cp-Rfrom/data/dir/*to/backup/dir/如果这个进程任务被挂起,fg命令将启动它。到目前为止,我们知道如何将命令或任务放在后台,并提取到前台运行。注意,如果这个任务有输出内容到标准输出(比如ping、echo或ls),即使使用了&也需要等待这些输出任务在前台运行,然后才能做其他工作。
此时,如果我们结合nohup命令,我们可以将标准输出和标准错误输出重定向到nohup.out文件。当我们退出终端或断开SSH连接时,终端将收到HUP(hangup)信号来关闭它的所有子进程。所以我们可以让进程忽略HUP信号,也就是nohup的作用。
#nohuppingwww.toutiao.com&[1]1418#nohup:ignoringinputandappendingoutputto‘nohup.out’屏幕/ tmux我们已经知道如何保护进程免受HUP信号的影响,但是如果有大量这样的命令需要在稳定的后台运行,我们如何避免对每个命令都这样做呢?
此时,最方便的方法就是屏幕。简单来说,screen提供了ANSI/VT100终端模拟器,使其能够在一个真实终端下运行多个全屏伪终端。屏幕参数多,功能强大。在这里,我们先来了解一下常见的函数:
screen-dmsession-name在断开模式下建立会话(并指定其会话名称)。
Screen -list列出所有会话。
Screen -r session-name重新连接指定的会话。
快捷键Ctrl-a d暂时断开当前会话。
#screen-dmShello#screen-listThereisascreenon:8824.hello(Detached)1Socketin/var/run/screen/S-root.#screen-rhello当我们使用“-r”连接屏幕会话时,我们可以在这个伪终端中为所欲为。我们再也不用担心HUP信号会影响我们的进程,也不用在每个命令前加上“nohup”。
下面我来看两个例子,看看screen如何避免HUP信号的影响。
使用&时,流程的流程树
#pingwww.toutiao.com&[1]9499#pstree-H9499init─┬─Xvnc├─acpid├─atd├─2*[sendmail]├─sshd─┬─sshd───bash───pstree│└─sshd───bash───ping当不使用screen时,我们所在的bash是sshd的一个子进程。ssh断开时,HUP信号自然会影响到它下面的所有子进程(包括我们建立的ping进程)。
使用屏幕时的流程树
#screen-rhello#pingwww.ibm.com&[1]9488#pstree-H9488init─┬─Xvnc├─acpid├─atd├─screen───bash───ping├─2*[sendmail]此时bash是screen的子进程,screen是init的子进程(PID为1)。那么当ssh断开时,HUP信号自然不会影响screen下的子进程。
然后tmux和screen实现类似的功能。看个人爱好,知道自己的选择,对大家都有好处。
最后总结一下,如果不需要检查程序的信息输出,而且只是一个比较耗时的命令任务,可以选择nohup和&的命令组合,将任务放到后台。如果有大量的命令需要在后台稳定执行,并且经常需要转移到前台执行,或者时不时的检查,可以使用screen或者tmux建立一个新的会话,使命令或者程序在后台运行。