我有一个最初在前台运行的进程。我通过Ctrl + Z挂起,然后通过bg <jobid>继续在后台运行。

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

我该如何带来

编辑:

该过程输出到stderr,所以当该过程输出到终端时如何发出命令fg <jobid>

评论

您仍然可以在出现错误的终端中键入命令。在STDERR上显示的文本不算作输入,仅算作您发送的键。在屏幕上看起来令人困惑,但是可以使用。

@Caleb:即使进程输出到stdout,我仍然可以键入fg 使其成为前台?

@Tim:是的,可以。

#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