返回

如何永久禁用 Bash 的任务控制功能?

Linux

如何将后台任务调至前台并永久禁用 Bash 的任务控制功能?

你是否曾遇到这样的情况:在终端运行程序时,不小心按下了 Ctrl+Z,导致程序被挂起?你可能希望程序能够持续运行,不受干扰,却又不想每次都要使用 fg 命令将后台任务恢复到前台。那么,本文将为你提供解决方案,帮助你将后台任务调至前台,并永久禁用 Bash 的任务控制功能。

首先,我们需要了解 Ctrl+Z 在 Bash 中的作用机制。默认情况下,按下 Ctrl+Z 会发送一个 SIGTSTP 信号给前台进程,使其暂停运行并进入后台。我们可以使用 jobs 命令查看当前 shell 中所有后台任务,每个任务都会显示一个作业号,格式为 [数字]

要将后台任务切换回前台,可以使用 fg 命令,后跟百分号和作业号,例如 fg %1 会将作业号为 1 的任务切换到前台。

然而,每次都要手动将后台任务切换到前台操作起来十分繁琐。为了彻底解决这个问题,我们可以选择禁用 Bash 的任务控制功能。

Bash 提供了 set 命令来设置 shell 的各种选项,其中就包括控制任务控制功能的选项 -m+mset -m 用于启用任务控制功能,而 set +m 则用于禁用任务控制功能。

当你执行 set +m 后,当前 shell 的任务控制功能就会被永久禁用,这意味着 Ctrl+Z 将不再起作用,任何正在运行的程序都不会被挂起。

下面是一个简单的示例,展示了如何将后台任务切换到前台并禁用任务控制功能:

# 启动一个后台任务
sleep 100 &

# 列出所有后台任务
jobs

# 将作业号为 1 的任务切换到前台
fg %1

# 禁用任务控制功能
set +m

# 再次尝试将程序放入后台,此时 Ctrl+Z 将不再起作用
sleep 100 &

需要注意的是,禁用任务控制功能是一个全局设置,它会影响到当前 shell 中的所有程序。如果你需要在将来重新启用任务控制功能,可以使用 set -m 命令。

此外,在编写 shell 脚本时,你可能也需要禁用任务控制功能,以防止脚本意外终止。在这种情况下,你可以将 set +m 命令添加到脚本的开头部分。

常见问题解答

1. 禁用任务控制功能后,如何终止正在运行的程序?

虽然 Ctrl+C 仍然可以终止前台程序,但对于后台程序,你需要使用 kill 命令。你可以使用 jobs 命令找到要终止的程序的作业号,然后使用 kill %[作业号] 来终止它。

2. 禁用任务控制功能后,如何将程序放到后台运行?

你可以使用 nohup 命令来运行程序,例如 nohup command &。这将会忽略程序收到的所有 HUP 信号,即使你关闭终端,程序也会继续在后台运行。

3. 我可以只针对特定的程序禁用任务控制功能吗?

很遗憾,Bash 中没有提供只针对特定程序禁用任务控制功能的选项。

4. 我在脚本中禁用了任务控制功能,但是当我运行脚本时,它仍然会被 Ctrl+Z 挂起,这是为什么?

这可能是因为你的终端程序设置了特殊的快捷键,覆盖了 Bash 的默认设置。你需要检查你的终端程序的设置,看看是否有类似 "disable background jobs" 或 "disable Ctrl+Z" 的选项。

5. 除了 set +m,还有其他方法可以禁用任务控制功能吗?

你可以修改 shopt 选项来禁用任务控制功能,例如 shopt -u monitor。这与 set +m 的效果相同。