搜索

首页  >  问答  >  正文

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梦2777 天前394

全部回复(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
  • 取消回复