Linux 作业控制 &、disown 和 nohup
介绍
Linux是一种在工业界广泛使用的开源操作系统。 Linux 最显着的功能之一是它的命令行界面 (CLI),它为用户提供了很大的灵活性和强大的功能。在命令行中工作时,通常会同时运行多个命令。但是,有时,您可能想要控制这些命令的执行方式以及它们如何相互交互。这就是作业控制的用武之地。
作业控制
作业控制是指管理和操作 Linux 系统中正在运行的进程的能力。它允许用户同时启动、停止、暂停、恢复和控制多个进程的执行。在Linux中,作业控制是通过一组内置的shell命令来实现的,例如bg、fg、jobs和kill。这些命令用于管理当前 shell 会话中的作业(即运行进程)。
后台执行
作业控制最常见的用例之一是在后台运行命令。这意味着执行命令时不会阻止 shell 提示符,从而允许您继续在同一 shell 会话中工作。要在后台运行命令,您可以在命令末尾附加与号 (&)。
例如,假设您想要运行一个需要很长时间才能完成的长时间运行的命令。您可以使用以下语法在后台运行命令 -
$ long_running_command &
shell 提示符将立即返回,并且命令将在后台执行。当命令在后台运行时,您可以继续在同一 shell 会话中工作。
管理后台作业
一旦开始后台作业,您可能需要对其进行管理,例如将其带到前台、发送到后台或终止它。以下是一些管理后台作业的最常用命令 -
jobs - 此命令显示当前 shell 会话中所有正在运行的作业的列表。它提供作业 ID、状态和命令等信息。
例如
$ jobs
[1] Running long_running_command &
[2]- Stopped another_command
上面的输出显示当前 shell 会话中有两个作业正在运行。第一个作业在后台运行,而第二个作业则停止。
fg - 此命令将后台作业带到前台,允许您直接与其交互。
例如
$ fg %1
上面的命令将 ID 为 1 的作业带到前台。您现在可以直接与作业交互。
bg - 此命令将停止或正在运行的作业发送到后台,允许其继续在后台运行。
例如
$ bg %2
上述命令将 ID 为 2 的作业发送到后台。作业将继续在后台运行。
kill - 此命令向正在运行的作业发送信号,允许您终止作业。
例如
$ kill %1
上述命令向 ID 为 1 的作业发送 SIGTERM 信号,终止该作业。
否认
Disown 是一个 shell 命令,用于从 shell 的作业控制中删除作业。当您拒绝某个作业时,它不再属于当前 shell 会话,并且不会从 shell 接收任何信号。这意味着即使您关闭 shell 会话,作业也将继续运行。
disown 的语法如下 -
$ disown [job ID]
例如
$ long_running_command &
$ disown %1
上述命令在后台启动一个长时间运行的命令,然后放弃它,将其从 shell 的作业控制中删除。这意味着即使您关闭 shell 会话,命令也将继续在后台运行。
诺哈普
Nohup 是一个实用程序命令,用于运行不受挂起影响的命令(即从终端断开连接)。当您使用 nohup 运行命令时,即使您注销系统、关闭终端窗口或丢失网络连接,它也会继续运行。
nohup 的语法如下 -
$ nohup [command]
例如
$ nohup long_running_command &
上面的命令在后台运行 long_running_command ,使其免受挂起的影响。这意味着即使您注销系统、关闭终端窗口或丢失网络连接,该命令也将继续运行。
当您正在运行一个长时间运行的命令并且您希望继续在后台运行(即使您没有连接到系统)时,Nohup 特别有用。
附加信息
除了作业控制、disown 和 nohup 命令的基本用法之外,还有一些附加功能和选项可用于微调其行为。这里有一些例子 -
作业控制
Ctrl + Z - 此键盘快捷键用于暂停正在运行的作业并将其发送到后台。这与 bg 命令类似,但它是在作业仍在运行时完成的。您可以使用 fg 命令将作业带回前台。
例如
$ long_running_command
^Z
[1]+ Stopped long_running_command
$ bg %1
上述命令启动一个长时间运行的命令,使用 Ctrl + Z 暂停它,然后使用 bg 命令将其发送到后台。
Ctrl + C - 此键盘快捷键用于通过向其发送 SIGINT 信号来终止正在运行的作业。这类似于带有 SIGINT 信号的 Kill 命令。
例如
$ long_running_command
^C
上面的命令启动一个长时间运行的命令并使用 Ctrl + C 终止它。
否认
-h 选项 - 此选项用于将作业标记为在 shell 收到 SIGHUP 信号时不会被终止。这类似于 nohup 命令,但它是在作业已经开始之后完成的。
例如
$ long_running_command &
$ disown -h %1
上述命令在后台启动一个长时间运行的命令,然后使用带 -h 选项的 disown 命令将其标记为不被终止。
诺哈普
-p 选项 - 此选项用于将 nohup 命令的进程 ID (PID) 写入文件。如果您需要监视命令的状态或手动终止它,这会很有用。
例如
$ nohup -p pid_file long_running_command &
上面的命令在后台启动一个长时间运行的命令,并使用带 -p 选项的 nohup 命令将其 PID 写入 pid_file。
-e 和 -o 选项 - 这些选项用于将命令的标准错误和标准输出流重定向到文件。这对于调试目的或记录命令输出很有用。
例如
$ nohup -e error_file -o output_file long_running_command &
上面的命令在后台启动一个长时间运行的命令,并使用带有 -e 和 -o 选项的 nohup 命令将其标准错误和标准输出流分别重定向到 error_file 和 output_file。
结论
总而言之,Linux 作业控制、disown 和 nohup 是功能强大的命令,为用户提供了很多灵活性以及对 Linux 系统中正在运行的进程的控制。作业控制允许您管理当前 shell 会话中正在运行的进程,而 disown 和 nohup 提供了一种运行不受挂起并脱离 shell 作业控制的进程的方法。
通过掌握这些命令,您可以显着提高在 Linux 命令行中工作时的生产力和效率。