我有一个最初在前台运行的进程。我按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
停止的程序的信号将恢复其进度(在前台),就像您对它的操作一样。Ctrlzbg
fg
回复:标准错误
对此问题的编辑询问标准错误:
fg <jobid>
进程输出到stderr,那么当进程输出到终端时我该如何发出命令呢?
除非相关作业具有后台组件(或者整个作业可能通过后台kill -CONT
),否则您实际上不应该在挂起时看到输出。
如果它仍在输出数据(无论是标准输出还是标准错误),它肯定会让您的终端在视觉上变得混乱,但所有输出都将被忽略,因为它不是您输入的一部分。这可能会让你更难知道你没有输入任何拼写错误,但(盲目地)输入fg
Enter应该足够了(除非你有多个工作,并且相关工作不是最新的,在这种情况下,你确实需要工作描述符)。
如果您确实需要查找作业描述符,请使用另一个终端STOP
通过上述非交互式方法向其发送信号。这应该会释放您的显示(可能点击Enter几次或运行clear
或Ctrl+ 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