如何在后台运行 Linux 命令并在终端中分离
在本指南中,我们将揭示Linux 系统进程处理中一个简单但重要的概念,即如何将进程与其控制终端完全分离。
当Linux 进程与终端关联时,可能会出现两个问题:
- 您的控制终端充满了大量输出数据和错误/诊断消息。
- 如果终端关闭,该进程及其子进程将终止。
要解决这两个问题,您需要将进程与控制终端完全分离。在实际解决问题之前,让我们简要介绍一下如何在 Linux 中在后台运行进程。
在后台运行 Linux 命令或进程
如果某个进程已在执行中,例如下面的tar 命令示例,只需按即可Ctrl+Z
停止它,然后输入命令bg
以继续在后台作为作业执行。
您可以通过输入来查看所有后台作业jobs
。但是,其stdin、stdout和stderr仍然连接到终端。
$ tar -czf home.tar.gz . $ bg $ jobs
您也可以使用 & 符号在后台运行 Linux 进程&
。
$ tar -czf home.tar.gz . & $ jobs
看下面的例子,虽然tar 命令是作为后台作业启动的,但仍然向终端发送了错误消息,这意味着该进程仍然连接到控制终端。
$ tar -czf home.tar.gz . & $ jobs tar: ./.config/etcher: Cannot open: Permission denied
注销后保持 Linux 进程运行
我们将使用disown命令,该命令在进程执行完毕并置于后台后使用,其工作是从 shell 的活动列表作业中删除一个 shell 作业,因此您将不再对该特定作业使用fg
,命令。bg
此外,当您关闭控制终端或注销时,该作业不会挂起或向任何子作业发送SIGHUP 。
让我们看一下下面使用diswon bash 内置函数的示例。
$ sudo rsync Templates/* /var/www/html/files/ & $ jobs $ disown -h %1 $ jobs
您还可以使用该nohup
命令,当用户退出 shell 时,它还可以使进程在后台继续运行。
$ nohup tar -czf iso.tar.gz Templates/* & $ jobs
从终端分离 Linux 进程
因此,要将进程与控制终端完全分离,请使用下面的命令格式,这对于Firefox 等图形用户界面 ( GUI ) 应用程序更有效:
$ firefox </dev/null &>/dev/null &
在 Linux 中,/dev/null是一个特殊的设备文件,它会注销(删除)所有写入它的数据,在上面的命令中,输入从中读取,输出则发送到/dev/null。
最后,假设一个进程连接到控制终端,作为用户,您将在终端上看到进程数据的几行输出以及错误消息。同样,当您关闭控制终端时,您的进程和子进程将被终止。
重要的是,如果对此主题有任何疑问或意见,请使用下面的评论表与我们联系。