侧边栏壁纸
Linux入门自学网博主等级

每日学一条Linux命令,终成Linux大神

  • 累计撰写 725 篇文章
  • 累计创建 143 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

Linux fg命令教程:如何将后台运行的作业放到前台(附实例详解和注意事项)

Linux fg命令介绍

fg命令是foreground的缩写,它用来将后台运行的作业放到前台继续执行。当我们在终端中执行一个命令时,有时候我们想要暂停它,或者让它在后台运行,不占用终端。这时候我们可以使用Ctrl+Z组合键来暂停当前的命令,或者在命令后面加上&符号来让它在后台运行。但是如果我们想要恢复暂停的命令,或者查看后台运行的命令的输出,我们就需要用到fg命令。fg命令可以让我们在多个后台作业之间切换,或者将后台作业转移到前台。

Linux fg命令适用的Linux版本

fg命令是一个shell内置命令,它适用于大多数的Linux发行版,如Ubuntu, Debian, CentOS, Fedora等。不同的shell可能有不同的实现方式,但是基本的功能和用法都是一致的。我们可以使用type fg命令来查看fg命令的类型,一般会显示fg is a shell builtin,表示它是一个shell内置命令。如果显示fg: command not found,表示当前的shell不支持fg命令,我们可以尝试切换到其他的shell,如bash, zsh等。

Linux fg命令的基本语法

fg命令的基本语法格式如下:

fg [作业ID]

其中,作业ID是一个数字,表示后台运行的作业的编号。我们可以使用jobs命令来查看当前有哪些后台作业,以及它们的编号。如果不指定作业ID,fg命令默认会将最近的一个后台作业放到前台。

Linux fg命令的常用选项或参数说明

fg命令没有选项,只有一个可选的参数,就是作业ID。如果不指定作业ID,fg命令默认会将最近的一个后台作业放到前台。如果指定了作业ID,fg命令会将对应的后台作业放到前台。作业ID可以是一个数字,也可以是一个百分号加上一个数字,如%1,表示第一个后台作业。

Linux fg命令的实例

实例1:将最近的一个后台作业放到前台

假设我们在终端中执行了一个耗时的命令,如ping www.bing.com,然后我们想要暂停它,我们可以按下Ctrl+Z组合键,这时候我们会看到类似下面的输出:

[linux@bashcommandnotfound.cn ~]$ ping www.bing.com
PING a-0001.a-msedge.net (204.79.197.200) 56(84) bytes of data.
64 bytes from a-0001.a-msedge.net (204.79.197.200): icmp_seq=1 ttl=117 time=1.67 ms
64 bytes from a-0001.a-msedge.net (204.79.197.200): icmp_seq=2 ttl=117 time=1.66 ms
64 bytes from a-0001.a-msedge.net (204.79.197.200): icmp_seq=3 ttl=117 time=1.67 ms
^Z
[1]+  Stopped                 ping www.bing.com
[linux@bashcommandnotfound.cn ~]$ 

这里的[1]+表示这是第一个后台作业,Stopped表示它已经被暂停了。如果我们想要恢复这个命令,我们可以使用fg命令,不需要指定作业ID,因为它是最近的一个后台作业。我们会看到类似下面的输出:

[linux@bashcommandnotfound.cn ~]$ fg
ping www.bing.com
64 bytes from a-0001.a-msedge.net (204.79.197.200): icmp_seq=4 ttl=117 time=1.67 ms
64 bytes from a-0001.a-msedge.net (204.79.197.200): icmp_seq=5 ttl=117 time=1.66 ms
64 bytes from a-0001.a-msedge.net (204.79.197.200): icmp_seq=6 ttl=117 time=1.67 ms
...

这时候,ping命令就会继续在前台运行,我们可以看到它的输出。如果我们想要停止它,我们可以按下Ctrl+C组合键。

实例2:将指定的后台作业放到前台

假设我们在终端中执行了多个后台作业,如ping www.bing.com &ping www.google.com &ping www.baidu.com &,然后我们想要查看其中一个的输出,我们可以使用fg命令,指定作业ID,如fg 2,表示将第二个后台作业放到前台。我们会看到类似下面的输出:

[linux@bashcommandnotfound.cn ~]$ ping www.bing.com &
[1] 1234
[linux@bashcommandnotfound.cn ~]$ ping www.google.com &
[2] 1235
[linux@bashcommandnotfound.cn ~]$ ping www.baidu.com &
[3] 1236
[linux@bashcommandnotfound.cn ~]$ fg 2
ping www.google.com
PING www.google.com (142.250.181.228) 56(84) bytes of data.
64 bytes from nrt20s09-in-f4.1e100.net (142.250.181.228): icmp_seq=1 ttl=115 time=1.64 ms
64 bytes from nrt20s09-in-f4.1e100.net (142.250.181.228): icmp_seq=2 ttl=115 time=1.64 ms
64 bytes from nrt20s09-in-f4.1e100.net (142.250.181.228): icmp_seq=3 ttl=115 time=1.64 ms
...

这时候,ping www.google.com命令就会在前台运行,我们可以看到它的输出。其他的后台作业仍然在后台运行,我们可以使用`jobs`命令来查看它们的状态。如果我们想要切换到其他的后台作业,我们可以再次使用fg命令,指定不同的作业ID。

实例3:将后台运行的交互式程序放到前台

有些程序是交互式的,需要我们输入一些信息,如密码,选项等。如果我们在终端中执行这些程序,并让它们在后台运行,那么我们就无法看到它们的提示,也无法输入信息。这时候,我们可以使用fg命令,将它们放到前台,然后进行交互。例如,我们可以使用ssh命令来远程登录到另一台Linux服务器,我们可以在命令后面加上&符号,让它在后台运行,如ssh user@host &,然后我们可以使用fg命令,将它放到前台,输入密码,登录成功后,就可以在远程服务器上执行命令了。我们会看到类似下面的输出:

[linux@bashcommandnotfound.cn ~]$ ssh user@host &
[1] 1234
[linux@bashcommandnotfound.cn ~]$ fg
ssh user@host
user@host's password: 
Last login: Tue Dec 26 09:36:57 2023 from bashcommandnotfound.cn
[user@host ~]$ 

这时候,ssh命令就会在前台运行,我们可以输入密码,登录到远程服务器。如果我们想要退出远程服务器,我们可以输入exit命令,或者按下Ctrl+D组合键。

实例4:将后台运行的编辑器放到前台

有些程序是编辑器,需要我们在终端中输入或修改一些文本,如vim, nano, emacs等。如果我们在终端中执行这些程序,并让它们在后台运行,那么我们就无法看到或编辑文本。这时候,我们可以使用fg命令,将它们放到前台,然后进行编辑。例如,我们可以使用vim命令来编辑一个文件,我们可以在命令后面加上&符号,让它在后台运行,如vim test.txt &,然后我们可以使用fg命令,将它放到前台,输入或修改文本,保存退出后,就可以在终端中执行其他命令了。我们会看到类似下面的输出:

[1] 1234
[linux@bashcommandnotfound.cn ~]$ fg
vim test.txt

这时候,vim命令就会在前台运行,我们可以编辑test.txt文件。如果我们想要退出vim,我们可以输入:wq命令,保存并退出。

实例5:将后台运行的音乐播放器放到前台

有些程序是音乐播放器,需要我们在终端中控制播放,暂停,停止,切换等操作,如mplayer, mpg123, cmus等。如果我们在终端中执行这些程序,并让它们在后台运行,那么我们就无法控制它们。这时候,我们可以使用fg命令,将它们放到前台,然后进行操作。例如,我们可以使用mplayer命令来播放一个音乐文件,我们可以在命令后面加上&符号,让它在后台运行,如mplayer song.mp3 &,然后我们可以使用fg命令,将它放到前台,按下空格键暂停或恢复播放,按下q键停止播放,按下左右方向键快进或快退等。我们会看到类似下面的输出:

[1] 1234
MPlayer 1.4 (C) 2000-2023 MPlayer Team
Playing song.mp3.
libavformat version 58.76.100 (external)
Audio only file format detected.
Load subtitles in ./
==========================================================================
Opening audio decoder: [mpg123] MPEG 1.0/2.0/2.5 layers I, II, III
AUDIO: 44100 Hz, 2 ch, s16le, 128.0 kbit/9.07% (ratio: 16000->176400)
Selected audio codec: [mpg123] afm: mpg123 (MPEG 1.0/2.0/2.5 layers I, II, III)
==========================================================================
AO: [pulse] 44100Hz 2ch s16le (2 bytes per sample)
Video: no video
Starting playback...
A:   0.0 (00.0) of 240.0 (04:00.0) ??,?% 
[linux@bashcommandnotfound.cn ~]$ fg
mplayer song.mp3
A:   5.0 (05.0) of 240.0 (04:00.0) ??,?% 

这时候,mplayer命令就会在前台运行,我们可以控制音乐播放。如果我们想要退出mplayer,我们可以按下q键,或者按下Ctrl+C组合键。

Linux fg命令的注意事项

  • fg命令只能在交互式的shell中使用,如果我们在脚本中使用fg命令,会报错fg: no job control,表示没有作业控制。这是因为脚本默认是不支持作业控制的,作业控制是一种允许用户在一个shell中同时运行多个进程的机制。如果我们想要在脚本中使用fg命令,我们需要在脚本的开头加上set -m命令,来启用作业控制。
  • fg命令只能将后台运行的作业放到前台,不能将前台运行的作业放到后台。如果我们想要将前台运行的作业放到后台,我们需要先按下Ctrl+Z组合键,暂停当前的作业,然后使用bg命令,将它放到后台继续运行。
  • fg命令只能将已经暂停或者正在运行的后台作业放到前台,不能将已经终止或者完成的后台作业放到前台。如果我们尝试将已经终止或者完成的后台作业放到前台,会报错fg: no such job,表示没有这样的作业。我们可以使用jobs -l命令来查看后台作业的状态,如果状态是Stopped或者Running,表示可以使用fg命令,如果状态是Done或者Terminated,表示不能使用fg命令。
  • 如果我们在执行fg命令时,没有指定作业ID,或者指定了错误的作业ID,会报错bash: fg: xxx: no such job,表示没有这样的作业。这时候,我们可以使用jobs命令来查看正确的作业ID,然后重新执行fg命令。

Linux fg命令的相关命令

0

评论区