如果我将其作为背景,为什么在最后一份工作上不进行 disown 操作?

Joe*_*Joe 5 linux bash command-line job-control

假设我已经使用 ctrl-z 对一个进程进行了后台处理,例如 VIM。然后我使用以下命令启动一个 xterm xterm &> /dev/null &。如果我只是输入 disown 那么我将丢失我的 vim 进程。相反,我必须键入 xterm 进程的 PID 才能否认它。

有什么办法可以解决这个问题,或者是否有发生这种情况的原因?

Has*_*tur 5

如何修复(简短版本)

你有几种方法可以做到:

所以它需要多写几个字符,但至少你可以选择哪些:-)

原因

原因就在这里:当您执行一个使用 将其发送到后台的作业时&,本质上它不会更改当前作业,而只会更改前一个作业。当前的工作仍然是以前的工作。

一些话和一个例子

您可以使用命令检查上面所说的内容jobs,比较其在后台启动作业前后的输出。

  • 之前:让我们假设您有几个后台进程只是从终端运行(例如使用dolphin &和启动kate &)。
    现在您开始vim并使用 Ctrl-Z.
    的输出jobs将是:

    [1]   Running                 dolphin . &
    [2]-  Running                 kate  &
    [3]+  Stopped                 vim
    
    Run Code Online (Sandbox Code Playgroud)

    vim是当前作业,标记为+kate是前一个任务,标记为-

    实际上,在 bash 参考手册中,第 7.1 [ 1 ]章中解释说
    “在与作业有关的输出(例如,jobs 命令的输出)中,当前作业始终标记为 '+',而前一个作业标记为'-'。”

  • 之后:最后你写你的命令xterm &> /dev/null &(没有disown)。

    询问jobs,这次它会回答:

    [1]   Running                 dolphin .
    [2]   Running                 kate 
    [3]+  Stopped                 vim
    [4]-  Running                 xterm &> /dev/null &
    
    Run Code Online (Sandbox Code Playgroud)

    请注意,vim仍然用 a +xterma标记-
    最后一个带有标记的后台作业-xterm并且不再是kate &

  • 换句话说,系统就像

    • 首先它运行xterm:新命令 ( xterm) 成为当前命令和vim前一个命令。
    • 然后xterm在后台发送,控件返回到列表中的前一个(vim及其状态),该控件再次成为当前控件,并再次用 标记+xterm而是新的以前的作业,并标有-.
    • 最后你会发现只更新了之前的工作(-) 而不是当前的 (+)。

由于您可以调用disown后跟工作编号或 PID,因此您有两种变体

  • %-:可以使用 来引用上一个作业%-,如果您认为作业中也标有 ,可能更容易记住-

  • $!后台运行的最后一个作业的PID在特殊参数[ 2 ]中$!

该命令disown将接受两者。

参考