検索

ホームページ  >  に質問  >  本文

php - Linux プロセスの出力リダイレクトの問題について質問しますか?

現在、bash ターミナルで次の 3 つのコマンドを実行します。
1:
php test.php >> test.log

2:
python test.py >> test.log

3:
sh test.sh >> test.log

別のウィンドウで次のコマンドを実行します。
tail -f test.log

1 つの php と 3 つの bash をリアルタイムで test.log に書き込むことができます。

しかし、なぜ Python は Python プログラムの終了後にのみ test.log に書き込むのでしょうか?
そして次のようになります。

echo "cd $test_dir && /usr/bin/python test.py &" >> test_py.sh && sh test_py.sh

sh スクリプトに Python を入れても機能しません

添付ファイル:
1 test.php

<?php
    $i = 1;
    while (真) {
        スリープ(1);
        $i++ を出力します。 "\r\n";
        if ($i > 10) {
            壊す;
        }
    }
?>

2 test.py

#!/usr/bin/python
#coding=utf-8

インポート時間

i=1
True の場合:
    私 += 1
    私を印刷します
    時間.睡眠(1)
    私が 10 より大きい場合:
        壊す
print "----------終了----------"

3 test.sh

#!/usr/bin/env bash
# cd /Users/cg/MyFiles/test && /usr/bin/python cgcg.py &
i=1
[[ 1 ]] を実行します。
    睡眠1
    i=`expr $i + 1`
    エコー $i
終わり
过去多啦不再A梦过去多啦不再A梦2827日前422

全員に返信(1)返信します

  • phpcn_u1582

    phpcn_u15822017-05-16 13:10:29

    気になるのですが、この場合、PHP はなぜブロック バッファリングを実行しないのでしょうか?

    Python ターミナル以外のデバイスの標準出力をすぐに確認したい場合は、自分でフラッシュするか (print(..., flush=True) 或者 Python 2 里用 sys.stdout.flush),要么使用 python -u 来运行脚本,要么你去把 sys.stdout置き換えます。

    )

    通常、標準出力 (および標準エラーを除くその他のファイル) への出力はデフォルトでバッファリングされます。このチュートリアルを参照してください。これは、端末の場合はライン バッファリング、その他のデバイスの場合はブロック バッファリングです。標準エラーは通常、バッファリングされません。

    ログを書き込んだり、行ベースの連続出力を実行したい場合は、対応するバッファリング モード (open 函数的 buffer 参数),或者在合适的地方调用 .flush() メソッド。

    ) を設定することを忘れないでください。

    返事
    0
  • キャンセル返事