搜尋

首頁  >  問答  >  主體

php - 請教一個linux行程輸出重新導向問題?

目前在bash終端依序執行以下三條指令:
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

將python放入sh腳本中執行也不行

附:
1 test.php

<?php
    $i = 1;
    while (True) {
        sleep(1);
        print $i++ . "\r\n";
        if ($i > 10) {
            break;
        }
    }
?>

2 test.py

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

import time

i = 1
while True:
    i += 1
    print i
    time.sleep(1)
    if i > 10:
        break
print "----------end-----------"

3 test.sh

#!/usr/bin/env bash
# cd /Users/cg/MyFiles/test && /usr/bin/python cgcg.py &
i=1
while [[ 1 ]]; do
    sleep 1
    i=`expr $i + 1`
    echo $i
done
过去多啦不再A梦过去多啦不再A梦2822 天前417

全部回覆(1)我來回復

  • phpcn_u1582

    phpcn_u15822017-05-16 13:10:29

    我倒是好奇,為什麼 PHP 不會在這種情況下進行區塊緩衝?

    Python 你想立即看到對於終端之外的設備的標準輸出的話,要么你自己 flush 一下(print(..., flush=True) 或者 Python 2 里用 sys.stdout.flush),要么使用 python -u 来运行脚本,要么你去把 sys.stdout 替換掉。

    通常,對標準輸出(以及其它除標準錯誤之外的文件)的輸出,預設是帶緩衝的,你可以看一下這個教學。對於終端是行緩衝,對於其它設備是塊緩衝。標準誤差一般是無緩衝的。

    如果要寫日誌,或者做基於行的持續性輸出的話,記得設定相應的緩衝模式(open 函数的 buffer 参数),或者在合适的地方调用 .flush() 方法。

    回覆
    0
  • 取消回覆