2016-12-08 9 views
4

私はLinuxシェルでtimeoutコマンドを研究しています。`timeout 2 timeout 1 bash`がつまったのはなぜですか

私がtimeout 1 bashを試すと、bashが実行され、1秒後に強制終了されます。

私がtimeout 2 timeout 1 yesを試すと、yesプログラムは1秒間実行され、2番目のtimeoutで殺されます。

しかし、私がtimeout 2 timeout 1 bashを試してみると、止まってしまいます。 bashシェルは表示されず、Ctrl + Cを押しても実行され続けます。

timeoutを1つのコマンドに2つ書くのは便利ではないことは知っています。

これはなぜ起こるのだろうか。ここで

+0

本当に面白いです。私は他のシェル(魚、zsh)で試してみたところ、うまくいきました。 bashでは、外部タイムアウトを-kで呼び出すと動作します。つまり、 'timeout -k 3 2 timeout 1 bash'です。私は、外側のタイムアウトコマンドが危険にさらされるように、bashが何をしているのか分かりません。 – user1934428

答えて

1

は同じ動作の別の例です:

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 bashSIGNALSセクションをチェックしてください。

関連する問題