は同じ動作の別の例です:
strace timeout 1 bash
あなたはstraceのを中断した場合でも、bashは実行を継続します。
同じ時間にbashプロセス自体をstraceすると、次のようなループが発生します。
--- SIGTTIN {si_signo = SIGTTIN、si_codeに= SI_USER、si_pid = 7162、si_uidを設定= 1000} --- rt_sigaction(SIGTTIN、{はsa_handler = SIG_IGN、 sa_mask = []、sa_flags =はsa_restorer、はsa_restorer = 0x7f097723a7e0}、 {はsa_handler = SIG_DFL、sa_mask = []、sa_flags =はsa_restorer、 はsa_restorer = 0x7f097723a7e0}、8)= 0のioctl(255、TIOCGPGRP、[6412])
= 0 rt_sigaction(SIGTTIN、{はsa_handler = SIG_DFL、sa_mask = []、sa_flags =はsa_restorer、はsa_restorer = 0x7f097723a7e0}、 {はsa_handler = SIG_IGN、sa_mask = []、sa_flags =はsa_restorer、 はsa_restorer = 0x7f097723a7e0}、8)= 0キル(0、SIGTTIN) = 0
マクロ
http://www.gnu.org/software/libc/manual/html_node/Job-Control-Signals.html
によると今
、:それはバックグラウンドジョブとして実行されている間
プロセスのint SIGTTINは、ユーザの端末から読み取ることができません。バックグラウンドジョブのいずれかのプロセスが端末から読み取った にしようとすると、ジョブのすべてのプロセスに SIGTTINシグナルが送信されます。この信号のデフォルト動作は、 プロセスを停止することです。これがどのように ターミナルドライバと対話するかについては、「ターミナルへのアクセス」を参照してください。
timeout 2 timeout --foreground 1 bash
内部タイムアウトは、対話シェルから直接実行されていなくても、ttyで動作するため、動作します。
男のタイムアウト
--foreground
when not running timeout directly from a shell prompt,
allow COMMAND to read from the TTY and get TTY signals; in this mode, children of COMMAND will not be timed out
我々は、多くのタイムアウトは、我々が望むように、限り、1以外のすべての対話型シェルから走ってチェーンが--foreground
オプションであることができます。
timeout 3 timeout --foreground 2 timeout --foreground 1 bash
さらに、異なるケースでbashがさまざまな信号にどのように反応するかについては、man bash
のSIGNALS
セクションをチェックしてください。
本当に面白いです。私は他のシェル(魚、zsh)で試してみたところ、うまくいきました。 bashでは、外部タイムアウトを-kで呼び出すと動作します。つまり、 'timeout -k 3 2 timeout 1 bash'です。私は、外側のタイムアウトコマンドが危険にさらされるように、bashが何をしているのか分かりません。 – user1934428