bg <jobid>
继续在后台运行。我想知道如何暂停在后台运行的进程吗?
我该如何带来
编辑:
该过程输出到stderr,所以当该过程输出到终端时如何发出命令
fg <jobid>
?#1 楼
如Tim所说,键入fg
将最后一个进程带回前台。如果后台有多个进程在运行,请执行以下操作: >
fg %3
使vim 23
进程回到前台。要暂停在后台运行的进程,请使用:
$ jobs
[1] Stopped vim
[2]- Stopped bash
[3]+ Stopped vim 23
SIGSTOP信号以与Ctrl + Z相同的方式停止(暂停)进程。
示例:
kill -STOP %3
。 资源:如何将信号发送到Linux和Unix中的进程
以及如何管理后台和前台作业。
评论
信号19对我来说是SIGCONT;我仍然使用kill -STOP和kill -CONT来优先记住数字,但是您可以选中kill -l来提醒自己数字值
–没用
2012年8月8日在13:04
该进程输出到stderr,那么在该进程输出到终端时如何发出命令job和fg
– Tim
2012年8月8日13:19
@Tim只需像平常一样键入命令即可。只要作业是有背景的,它就不会读取您键入的内容-您的外壳程序就是。您输入的内容可能看起来很不完整,但是Shell会理解的很好。
–user9031
2012年8月8日14:30
@AlexWebr:谢谢,它有效! (1)后台作业是否不接受任何输入和输出,包括“ Ctrl + Z”等,对吗? (2)是否可以直接暂停后台运行的作业?如果是,怎么办?如果不是,是否必须先将其更改为在前台运行才能将其挂起?
– Tim
2012年8月8日15:02
是否可以直接挂起在后台运行的作业?是:kill -STOP%job_id,如所解释
–没用
2012年8月8日在16:38
#2 楼
对于具有作业控制功能的任何外壳来说,这都是正确的,除非处理真正的古老外壳,否则在大多数情况下,您可以认为这是理所当然的。它是POSIX标准,因此即使dash
也支持作业控制(以交互方式或与-m
一起运行时)。暂挂当前已前台的程序bg
将后台最近挂起的程序(将bg %2
与作业号一起使用,可以通过jobs
进行检查)fg
将会最近前台的程序暂停的程序在
zsh
中,您可以编写一个键绑定,以通过另一个Ctrl + z从提示符隐式运行fg
: class =“ lang-sh prettyprint-override”> _zsh_cli_fg() { fg; }
zle -N _zsh_cli_fg
bindkey '^Z' _zsh_cli_fg
还有一种聪明的方法可以在挂起时隐式运行
bg
,但这似乎是不明智的;至少对我而言,我使用Ctrl + z的大多数原因是因为Ctrl + c未能爆发;我想用例如kill %1
而不是bg
,我当然不想默认杀死它! (此逻辑还扩展了我不再使用此键绑定的原因:如果我要按Ctrl + z来停止进程,那么我最后要做的就是恢复!)无-interactive
如果您在其他Shell实例(或其他用户,有时包括
sudo
命令)中,则可能无法使用作业编号。知道另一个进程的ID(PID)后,您仍然可以对另一个进程进行操作。您可以使用
pgrep …
或ps aux |grep …
(或从同一外壳jobs -l
或$!
)获取PID,然后运行:如果您不知道进程ID,也不担心按名称挂起该进程的其他实例,则可以将信号传递给以下其中一个:
kill -STOP $PID # suspend
kill -CONT $PID # continue (resume)
向以Ctrl + z(而不是
killall -STOP program_name
pkill -STOP program_name
pkill -f -STOP program_name_or_args
'd)停止的程序发出的CONT
信号将恢复其进度(在前台),就像对bg
进行信号处理一样。 对这个问题的编辑询问标准错误:
除非有问题的作业具有被后台处理的组件(或者整个作业都被后台处理(也许通过
fg
)),否则在挂起时实际上不应看到输出。 如果仍在输出数据(无论是标准输出还是标准错误),它肯定会使您的终端显得杂乱无章,但是所有这些输出将被忽略,因为它不是输入的一部分。这可能会使您更难知道您没有输入任何错别字,但是(盲目地)键入
fg <jobid>
Enter就足够了(除非您有多个工作并且所涉及的工作不是最新的,在这种情况下,您确实需要作业描述符)。如果确实需要找到作业描述符,请使用另一个终端通过上述非交互式方法将其发送给
kill -CONT
信号。这样可以释放您的显示(也许打了几次Enter键或运行fg
或Ctrl + L),这样您就可以运行STOP
查找作业描述符,然后运行clear
,其中jobs
是该数字。评论
暂停和恢复进程的唯一问题是,如果您与其他程序(例如RabbitMQ)建立了任何连接,则恢复时该连接将丢失。
–Nav
17年2月6日在23:31
@Nav –那是因为您没有无脑地运行它。在bash和zsh中,我相信您只需要放弃后台进程即可。我更喜欢使用nohup或屏幕或tmux等终端多路复用器运行此类任务。您无法启动nohup进程(就像您无法从单独的连接中恢复后台进程一样),但是可以连接到多路复用器。
–亚当·卡兹(Adam Katz)
17年2月7日在0:37
这是一个后台过程。我关闭了终端,然后从另一个终端登录到服务器。
–Nav
17年2月7日在6:09
是的,除非考虑到启动它的过程,否则您无法从另一个shell恢复该过程。我建议使用屏幕或tmux。
–亚当·卡兹(Adam Katz)
17年2月7日在18:45
我相信,如果您向使用Ctrl + Z停止的进程(作业/管道)发送CONT信号,即使您尚未处理它,它也会在后台继续。
– G-Man说“恢复莫妮卡”
17年5月10日在22:18
#3 楼
键入fg
将其带到前台。评论
谢谢!该进程输出到stderr,那么在该进程输出到终端时如何发出命令fg
– Tim
2012年8月8日13:16
#4 楼
使用
jobs
命令列出作业使用
fg
将目标作业置于前台;例如:fg %4
使
CTRL Z
暂停要在后台启动它,请使用bg;例如:
bg %4
#5 楼
结束进程可以用几种不同的方式完成。通常,从基于控制台的命令中,发送Ctrlc击键(默认中断字符)将退出命令。如果进程在前台模式下运行,此方法将起作用。该过程如下:$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
此处,
ps
命令将终止kill
进程。如果某个进程忽略了常规的first_one
命令,则可以使用kill
,后跟进程ID,如下所示:$kill -9 6738
Terminated
评论
虽然这是事实,但并未回答问题...
– Jasonwryan
2014年10月31日在8:46
评论
您仍然可以在出现错误的终端中键入命令。在STDERR上显示的文本不算作输入,仅算作您发送的键。在屏幕上看起来令人困惑,但是可以使用。@Caleb:即使进程输出到stdout,我仍然可以键入fg
@Tim:是的,可以。