如何暂停后台进程并将其置于前台

如何暂停后台进程并将其置于前台

我有一个最初在前台运行的进程。我按Ctrl+暂停Z,然后按 恢复其在后台运行bg <jobid>

我想知道如何暂停后台运行的进程?

如何将后台进程带到前台?

编辑:

fg <jobid>进程输出到stderr,那么当进程输出到终端时我该如何发出命令呢?

答案1

正如蒂姆所说,键入fg以使最后一个进程返回前台。

如果您有多个进程在后台运行,请执行以下操作:

$ jobs
[1]   Stopped                 vim
[2]-  Stopped                 bash
[3]+  Stopped                 vim 23

fg %3使vim 23进程返回前台。

要暂停在后台运行的进程,请使用:

kill -STOP %job_id

CtrlSIGSTOP 信号以与+基本相同的方式停止(暂停)进程Z

例子:kill -STOP %3

来源:

答案2

对于任何具有作业控制功能的 shell 来说都是如此,除非处理真正古老的 shell,否则(在大多数情况下)您可以认为这是理所当然的。 它符合 POSIX 标准,因此甚至dash支持作业控制(当交互运行或与 一起运行时-m)。

交互的

  • Ctrl+z将暂停当前前台程序
  • bg将最近暂停的程序置于后台
    bg %2与作业编号一起使用,您可以通过 进行检查jobs
  • fg将最近暂停的程序置于前台

在 中zsh,您可以编写一个键绑定,通过另一个+fg从提示符隐式运行:Ctrlz

_zsh_cli_fg() { fg; }
zle -N _zsh_cli_fg
bindkey '^Z' _zsh_cli_fg

可能还有一种巧妙的方法可以bg在挂起时隐式运行,但这似乎不明智;至少对我来说,我使用Ctrl+的大部分z是因为Ctrl+c未能爆发;我想用 egkill %1而不是 来遵循bg,而且我当然不想默认杀死! (这个逻辑也延伸到了为什么我不再使用这个键绑定:如果我敲击Ctrl+z来停止一个进程,我最不希望它做的就是恢复!)

非交互式

如果您位于不同的 shell 实例(或不同的用户,有时包括sudo命令)中,您可能无法使用作业编号。

一旦知道另一个进程的进程 ID (PID),您仍然可以对其进行操作。您可以使用pgrep …, 或获取 PIDps aux |grep …(或从同一个 shell、jobs -l、 或$!)然后您可以运行:

kill -STOP $PID  # suspend
kill -CONT $PID  # continue (resume)

如果您不知道进程 ID 并且不担心按名称挂起进程的其他实例,则可以将信号传递给其中之一:

killall -STOP program_name
pkill -STOP program_name
pkill -f -STOP program_name_or_args

用+ (而不是'd)CONT停止的程序的信号将恢复其进度(在前台),就像您对它的操作一样。Ctrlzbgfg

回复:标准错误

对此问题的编辑询问标准错误:

fg <jobid>进程输出到stderr,那么当进程输出到终端时我该如何发出命令呢?

除非相关作业具有后台组件(或者整个作业可能通过后台kill -CONT),否则您实际上不应该在挂起时看到输出。

如果它仍在输出数据(无论是标准输出还是标准错误),它肯定会让您的终端在视觉上变得混乱,但所有输出都将被忽略,因为它不是您输入的一部分。这可能会让你更难知道你没有输入任何拼写错误,但(盲目地)输入fgEnter应该足够了(除非你有多个工作,并且相关工作不是最新的,在这种情况下,你确实需要工作描述符)。

如果您确实需要查找作业描述符,请使用另一个终端STOP通过上述非交互式方法向其发送信号。这应该会释放您的显示(可能点击Enter几次或运行clearCtrl+ L),以便您可以运行jobs以查找作业描述符,然后在该数字所在的fg %N位置运行。N

答案3

键入fg以将其带到前台。

答案4

可以通过多种不同的方式结束进程。通常,从基于控制台的命令中,发送Ctrlc击键(默认中断字符)将退出该命令。当进程在前台模式下运行时,此功能有效。

如果一个进程在后台模式下运行,那么首先您需要使用该ps命令获取其作业 ID,然后您可以使用kill命令来终止该进程,如下所示:

$ps -f
UID      PID  PPID C STIME    TTY   TIME CMD
amrood   6738 3662 0 10:23:03 pts/6 0:00 first_one
amrood   6739 3662 0 10:22:54 pts/6 0:00 second_one
amrood   3662 3657 0 08:10:53 pts/6 0:00 -ksh
amrood   6892 3662 4 10:51:50 pts/6 0:00 ps -f
$kill 6738
Terminated

此处该kill命令将终止该first_one进程。如果进程忽略常规kill命令,则可以使用kill -9后跟进程 ID,如下所示:

$kill -9 6738
Terminated

相关内容