为什么`超时2超时1 bash`卡住了

zzh*_*996 5 linux bash shell signals timeout

我正在研究timeoutLinux shell中的命令.

当我尝试时timeout 1 bash,bash会运行并在1秒后被杀死.

当我尝试时timeout 2 timeout 1 yes,程序yes将运行1秒钟并被第二个程序杀死timeout.

但是当我尝试时timeout 2 timeout 1 bash,它被卡住了.即使按Ctrl + C,也不会显示bash shell并且它会继续运行.

我知道timeout在一个命令中写两个是没用的.

我只是想知道为什么会这样.

dge*_*iev 2

这是相同行为的另一个示例:

\n\n

strace timeout 1 bash\n即使中断 strace,bash 也会继续运行。

\n\n

如果我们同时跟踪 bash 进程本身,我们会注意到以下循环。

\n\n
\n

--- SIGTTIN {si_signo=SIGTTIN, si_code=SI_USER, si_pid=7162, si_uid=1000} --- rt_sigaction(SIGTTIN, {sa_handler=SIG_IGN,\n sa_mask=[], sa_flags=SA_RESTORER, sa_retorer=0x7f097723a7e0},\ n {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER,\n sa_restorer=0x7f097723a7e0}, 8) = 0 ioctl(255, TIOCGPGRP, [6412])
n = 0 rt_sigaction(SIGTTIN, {sa_handler=SIG_DFL, sa_mask =[], sa_flags=SA_RESTORER, sa_restorer=0x7f097723a7e0},\n {sa_handler=SIG_IGN, sa_mask=[], sa_flags=SA_RESTORER,\n sa_restorer=0x7f097723a7e0}, 8) = 0 杀掉(0, SIGTTIN)\n = 0

\n
\n\n

现在,根据http://www.gnu.org/software/libc/manual/html_node/Job-Control-Signals.html

\n\n
\n

宏:int SIGTTIN

\n\n

当进程作为后台作业运行时,无法从 user\xe2\x80\x99s 终端读取数据。当后台作业中的任何进程尝试从终端读取数据时,作业中的所有进程都会收到 SIGTTIN 信号。此信号的默认操作是停止进程。\n 有关如何与终端驱动程序交互的详细信息,请参阅访问终端。

\n
\n\n

timeout 2 timeout --foreground 1 bash有效,因为内部超时将允许它与 tty 一起工作,尽管它不是直接从交互式 shell 运行。

\n\n

人超时

\n\n
   --foreground\n\n          when not running timeout directly from a shell prompt,\n\n          allow COMMAND to read from the TTY and get TTY signals; in this mode, children of COMMAND will not be timed out\n
Run Code Online (Sandbox Code Playgroud)\n\n

我们可以根据需要链接任意数量的超时,只要除了从交互式 shell 运行的超时之外的所有超时都带有以下选项--foreground

\n\n

timeout 3 timeout --foreground 2 timeout --foreground 1 bash

\n\n

另请查看 参考资料SIGNALS部分,man bash了解有关 bash 在不同情况下如何对各种信号做出反应的更多信息。

\n