我有一个最初在前台运行的进程。我先按Ctrl+ 暂停Z,然后按继续在后台运行bg <jobid>
。
我想知道如何暂停在后台运行的进程?
如何使后台进程成为前台?
编辑:
该进程输出到stderr,那么fg <jobid>
当该进程输出到终端时我应该如何发出命令?
fg <jobid>
使其成为前台?
我有一个最初在前台运行的进程。我先按Ctrl+ 暂停Z,然后按继续在后台运行bg <jobid>
。
我想知道如何暂停在后台运行的进程?
如何使后台进程成为前台?
编辑:
该进程输出到stderr,那么fg <jobid>
当该进程输出到终端时我应该如何发出命令?
fg <jobid>
使其成为前台?
Answers:
正如Tim所说,键入fg
以使最后一个过程回到前台。
如果您在后台运行多个进程,请执行以下操作:
$ jobs
[1] Stopped vim
[2]- Stopped bash
[3]+ Stopped vim 23
fg %3
使vim 23
流程回到前台。
要暂停在后台运行的进程,请使用:
kill -STOP %job_id
SIGSTOP信号以与Ctrl+ 相同的方式停止(暂停)进程Z。
例如:kill -STOP %3
。
资料来源:如何将信号发送到Linux和Unix中的进程 以及如何管理后台和前台作业。
SIGCONT
给我的;无论如何,我kill -STOP
还是kill -CONT
会优先使用数字来记住数字,但是您可以检查一下kill -l
以使自己想起数字值
job
,fg <jobid>
当该过程输出到终端时,我应该如何发出命令?
kill -STOP %job_id
如所解释的
对于具有作业控制功能的任何外壳来说,这都是正确的,除非处理真正的古老外壳,否则在大多数情况下,您可以认为这是理所当然的。 它属于POSIX标准,因此甚至dash
支持作业控制(以交互方式运行或与一起运行时-m
)。
bg
将后台最近暂停的程序bg %2
与作业号一起使用,可以通过进行检查jobs
)fg
将显示最近暂停的程序在中zsh
,您可以编写一个键绑定,以fg
通过另一个Ctrl+ 从提示隐式运行z:
_zsh_cli_fg() { fg; }
zle -N _zsh_cli_fg
bindkey '^Z' _zsh_cli_fg
bg
在挂起时隐含地运行还可能有一个聪明的方法,但这似乎是不明智的。至少对我而言,我Ctrl+ 的大部分z用法是因为Ctrl+ c未能爆发;我想使用eg kill %1
而不是来跟随它bg
,我当然也不想默认为killing!(此逻辑还扩展了我不再使用此键绑定的原因:如果我要踩Ctrl+ z停止一个进程,那么我最后要做的就是恢复!)
如果您在其他Shell实例(或其他用户,有时包括sudo
命令)中,则可能无法使用作业编号。
一旦知道另一个进程的进程ID(PID),您仍然可以对其执行操作。你可以用获得的PID pgrep …
,或ps 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
CONT
用Ctrl+ z(而不是bg
'd)停止的程序的信号将恢复其进度(在前台),就像处理该信号一样fg
。
对这个问题的编辑询问标准错误:
该进程输出到stderr,那么
fg <jobid>
当该进程输出到终端时我应该如何发出命令?
除非所讨论的作业的背景组件(或整个作业(可能通过kill -CONT
),都已背景),否则在挂起时您实际上不应看到输出。
如果它仍在输出数据(无论是标准输出还是标准错误),那肯定会使您的终端显得杂乱无章,但是所有这些输出都将被忽略,因为它不是输入的一部分。这可能会使您更难知道您没有输入任何错别字,但是(盲目地)键入fg
Enter就足够了(除非您有多个作业并且所涉及的作业不是最新的,在这种情况下,您确实需要作业描述符) )。
如果确实需要查找作业描述符,请使用另一个终端STOP
通过上述非交互式方法向其发送信号。这样可以释放您的显示(可能打Enter了几次,或者运行clear
或Ctrl+ L),因此您可以运行jobs
以查找作业描述符,然后fg %N
在N
该数字的位置运行。
CONT
通过Ctrl + Z停止的进程(作业/管道)发送信号,即使您没有将其在后台继续执行bg
。
结束进程可以用几种不同的方式完成。通常,从基于控制台的命令中发送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