2

私の最初の問題は、タイムアウト時にプロセスとその子を強制終了することでした。そして、GNUtimeoutは非常に良い選択であることがわかりました。

ただし、このテストケースでは、事態は奇妙になります。

test1.sh次のようなものがあるとします。

#!/bin/sh
# test1.sh
output=`timeout 2 ./run.sh`
echo $output

そしてrun.shこのように:

#!/bin/sh
# run.sh
sleep 8s&

がそのばかげたプロセスを担当しtest1.shてから終了するため、直観的にはすぐに終了することを期待する必要があります。initsleeprun.sh

でも:

sh-4.2$ time ./test1.sh

real    0m8.022s
user    0m0.013s
sys     0m0.003s

そして、これを作成するとtest2.sh:

#!/bin/sh
# test2.sh
timeout 2 ./run.sh
sh-4.2$ time ./test2.sh

real    0m0.014s
user    0m0.003s
sys     0m0.007s

明らかに、コマンド置換中に何か問題が発生しましたが、なぜでしょうか?

4

1 に答える 1

3

シェルスクリプトでの方法かもしれません-

`timeout 2 ./run.sh` 

-- コマンド置換を使用しているため、コマンドの実行が終了していない限り、出力が存在しないため、置換を実行できません...これは、表示されている出力を説明している可能性があります。

これを試して、同様の結果を確認してください....

echo "hello `sleep 2 &`"

興味深い別のスクリプト -

$ cat y.sh
echo "hi"
sleep 2 &
echo "bye"
sleep 2 &

を使用して実行

echo "hello `sh y.sh`"

$time sh y.sh
hi
bye

real    0m0.006s
user    0m0.000s
sys     0m0.004s

$time echo "hello `sh y.sh`"
hello hi
bye

real    0m2.008s
user    0m0.004s
sys     0m0.000s

このページでは、バックグラウンド プロセスとファイル記述子の関係について詳しく説明します。基本的に:

バックグラウンド(より良い:フォーク)プロセスはファイル記述子を継承し、バッククォートでコマンドを実行すると、標準出力が閉じられるまで標準出力を収集することを意味します

于 2013-05-11T02:57:14.053 に答える