“是的,而且……”是即兴喜剧中的一个精彩的经验法则。在 UNIX 世界中则不然。
当我运行这个公认的愚蠢yes&
命令时,我无法中断它。终端崩溃或陷入循环。
我希望该yes
进程立即暂停,因为如果尝试写入标准输出,后台的任何进程都应该暂停,但情况似乎并非如此,我想知道为什么。
答案1
仅当设置了输出模式时,写入终端的后台进程才会被挂起TOSTOP
,默认情况下并非如此。尝试
stty tostop
yes &
你会看到它yes
被暂停了。
后台进程读默认情况下,来自终端的操作会被暂停,因为没有明智的方法让它们获得正确的输入。
关闭后TOSTOP
,终端不会崩溃或卡住,它仍然对输入做出响应;因此,您可以yes
通过杀死它(kill %
如果它是唯一的后台作业)或将其带到前台(fg
)并停止它(CtrlC)来停止后台。您必须盲目输入命令,但它们会起作用。
答案2
斯蒂芬的回答非常好,但我想补充一点,您可以通过将进程置于前台然后中断它来重新获得对 bash 会话的控制:
$ yes &
y
y
y
y
...
尽管您看不到它,但请输入:
fg
Enter进而Ctrl-C
fg
是将后台作业移回前台的作业控制命令,当然,还会向当前作业Ctrl-C发送信号。SIGINT
如果您有多个后台作业,fg
则可以在后面跟一个jobspec
参数来规定您想要将哪个作业移到前台。详细信息在bash
手册页中。