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