Linux- 后台运行符&、nohup、disown

&

&在Unix-like的操作系统(如Linux和macOS)的shell中,特别是在Bash这样的shell中,经常用作后台运行符号。让我们深入了解一下其功能和用法。

&作为后台运行符号:

  1. 基本用法:
    当我们在一个命令或者一组命令的后面加上&,它们会在后台执行。这意味着这些命令不会阻止我们获得命令行提示符,可以继续执行其他命令。

    例如:

    sleep 10 &
    

    这会在后台启动sleep命令,持续10秒。在此期间,我们会立即获得命令行提示符,可以进行其他任务。

  2. 作业控制:
    当在后台启动任务时,它将被视为一个“作业”。可以使用作业控制命令来管理这些后台任务。

    • jobs: 列出当前shell中的所有后台作业。
    • fg %jobnumber: 将后台作业带到前台运行。
    • bg %jobnumber: 如果一个作业在后台被暂停,此命令可以继续在后台运行它。

    例如,如果运行sleep 30 &并且之后运行jobs,会看到有一个作业在后台运行。

  3. 输出:
    即使命令在后台运行,它的输出(stdout和stderr)默认仍然会发送到当前终端。这可能会中断当前工作。为了避免这种情况,通常会将输出重定向到文件或/dev/null。重定向到文件可以帮助我们保留输出以供以后查看,而重定向到 /dev/null 实际上是丢弃输出。

  4. 结束:
    当关闭终端时,默认情况下所有后台作业都会被终止。为了防止这种情况,可以使用nohup命令或者disown命令。

    例如:

    nohup long_running_command &
    

    或者,如果已经在后台启动了一个作业:

    long_running_command &
    disown %1
    

    其中%1是作业号,通常是启动的第一个作业。可以使用jobs命令查看作业号。

总之,&符号为命令行用户提供了一个方便的方式来在后台执行任务,从而使用户可以并行地进行多个任务。


此处,我们展开说一下输出:

(1) 重定向到文件:

如果想保留输出以供以后查看,可以将 stdoutstderr 重定向到文件。

long_running_command > output.log 2>error.log &

在这里,正常的输出(stdout)被重定向到 output.log,而错误输出(stderr)被重定向到 error.log

(2) stdoutstderr 重定向到同一文件:

long_running_command > output.log 2>&1 &

这会将正常的输出和错误都保存在 output.log 中。

(3) 重定向到 /dev/null:

如果不关心输出并希望完全丢弃它,可以使用 /dev/null。这是一个特殊的设备,通常被称为“黑洞”,因为写入它的任何东西都会被永久丢弃。

long_running_command > /dev/null 2>&1 &

这里,正常的输出和错误都被发送到 /dev/null,从而被完全丢弃。

使用这些重定向技术,可以确保后台任务的输出不会干扰我们的终端会话,同时还可以选择保留或丢弃输出。


nohup命令

nohup是Unix和Linux系统中的一个命令,用于在退出帐户或关闭终端后继续运行命令。其名称“nohup”来源于“no hang up”,表示即使挂起也不中断执行。

以下是对nohup命令的详细介绍:

  1. 基本用途:

    当在终端中运行一个命令时,如果退出终端或关闭它,命令通常会被终止。使用nohup,可以保持这个命令在后台运行,即使终端已关闭。

    例如,要在后台运行一个长时间运行的脚本并确保即使关闭终端也不会停止,可以这样做:

    nohup ./long-running-script.sh &
    
  2. 输出重定向:

    默认情况下,nohup命令将命令的输出(stdout和stderr)重定向到名为nohup.out的文件中。如果希望将输出重定向到其他位置,可以这样做:

    nohup ./script.sh > myoutput.log 2>&1 &
    
  3. 与后台运行结合:

    通常,nohup&结合使用,这样命令就可以在后台启动并立即返回命令提示符。如果不使用&,命令将在前台开始,但即使关闭终端也会继续运行。

  4. 如何终止nohup命令:

    要终止使用nohup运行的进程,首先需要找到其进程ID(PID),可以使用ps命令和grep工具来查找。一旦得到PID,可以使用kill命令来终止它。

    例如:

    ps aux | grep long-running-script.sh
    

    上述命令会显示与long-running-script.sh相关的进程。找到PID后,使用:

    kill -9 <PID>
    

    来终止进程。

  5. 目的与使用场景:

    nohup命令特别适用于远程登录到服务器并启动长时间运行的任务的场景。使用nohup可以确保任务继续运行,即使网络连接断开或用户注销。

总之,nohup是一个非常有用的命令,允许在Unix-like操作系统中的任务在没有终端干预的情况下持续运行。这在系统管理、长时间数据处理任务和其他需要持续运行的场景中特别有用。

disown命令

disown 是 bash 和一些其他 shell中的内建命令,用于从 shell 的作业表中移除作业,从而使它们与当前 shell 会话解除关联。这意味着,当关闭或退出 shell 时,这些作业(或进程)不会接收到 HUP(hang up)信号,因此它们不会被终止。

下面详细介绍 disown 命令:

  1. 基本用法:

    当在 shell 中启动一个后台任务,然后决定使其在退出 shell 时保持运行状态,可以使用 disown

    例如,假设启动了一个后台进程:

    long-running-command &
    

    之后,可以简单地运行 disown,该命令将移除最近发送到后台的任务。

  2. 指定作业号:

    如果有多个后台任务,并且只想 disown 其中的一个或几个,可以使用作业号(可以使用 jobs 命令查看)。

    例如:

    [1]  + running    sleep 300
    [2]    running    long-running-command
    

    要移除第二个任务,可以使用:

    disown %2
    
  3. 移除所有作业:

    disown 命令也可以与 -a 选项一起使用,从作业表中移除所有作业。

    disown -a
    
  4. 移除当前 shell 启动的所有作业:

    使用 -r 选项可以移除由当前 shell 启动的所有作业:

    disown -r
    
  5. nohup 的比较:

    disownnohup 都可以使进程在退出 shell 时继续运行。但它们的工作方式有所不同:

    • nohup 是在启动进程时使用的,以确保进程从一开始就与 shell 解除关联。
    • disown 是在进程已经启动后使用的,以后续地从 shell 的作业表中移除进程。

总的来说,disown 是一个在需要长时间运行的后台任务,但又不想这些任务在退出或关闭 shell 时被终止的情况下非常有用的工具。它允许我们管理和保持这些后台任务的持续运行,即使我们的 shell 会话已经结束。

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 在Linux中,可以通过在命令末尾加上“&”号来让命令在后台运行。例如: ``` command & ``` 此时,该命令将在后台运行,而不会占用当前终端窗口。如果需要查看命令的输出,可以通过命令行输出重定向来将输出保存到文件中。例如: ``` command > output.txt & ``` 这将把命令的输出保存到名为“output.txt”的文件中,并让命令在后台运行。 ### 回答2: 在Linux中,可以通过以下方式将命令在后台运行: 1. 在命令后添加“&”号:通过在命令末尾添加“&”号,可以将命令放入后台运行,例如:`command &`。 2. 使用nohup命令:通过在命令前加上nohup命令,可以将命令放入后台运行,并且不受终端关闭的影响,例如:`nohup command`。 3. 使用disown命令:在使用"&"号将命令放入后台运行后,可以使用disown命令将该命令与当前终端会话脱离,使其在终端关闭后仍然运行,例如:`disown -h`。 4. 使用screen命令:screen是一个终端多路复用工具,可以在其中创建多个终端会话。使用screen命令可以先创建一个screen会话,然后在其中运行需要后台运行的命令,即使终端关闭后,该会话及其中的命令仍然在后台运行,例如:`screen -S session_name`。 以上方法都可以将命令放入后台运行,并且不受终端关闭的影响。可以根据具体需求选择适合的方法。 ### 回答3: 在Linux中,可以通过在命令后面添加&号来将命令放入后台运行。 例如,如果要在后台运行一个长时间执行的脚本,可以输入: ``` $ ./script.sh & ``` 这样,脚本将在后台运行,而你可以继续在终端输入其他命令。 另外,如果你已经在终端中执行了一个命令,但是忘记在命令后面加上&号,可以按下Ctrl+Z将当前命令暂停,然后输入bg命令将其放入后台继续执行。例如: ``` $ ./script.sh //执行命令 Ctrl+Z //暂停命令 $ bg //将命令放入后台继续执行 ``` 此外,你还可以使用nohup命令使命令在后台运行,并将输出重定向到一个日志文件中。例如: ``` $ nohup ./script.sh > output.log & ``` 这样,脚本将在后台运行,并将输出保存到名为output.log的文件中。 需要注意的是,虽然在后台运行命令可以让你继续使用终端,但是在关机或注销时,后台进程将被终止。如果想要保持命令在后台持续运行,可以考虑使用其他工具,如tmux或screen。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

青衫客36

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值