如何用php exec只输出最新的屏幕?

时间:2013-06-06 14:49:25

标签: php bash exec

我的问题是:

我有使用exec命令生成的大型输出文件。我有大约800-1500 MB的文本输出,因为它每秒都附加到我的文本文件。我怎么才能将最后一段数据写入我的文本文件?

这就是我现在正在做的事情:

$cmd = 'btdownloadheadless --saveas /var/www/virtual/tigyisolutions.hu/boxy/htdocs/downloaded_torrent/'.$kovNev.'/ '.$_REQUEST["torrent"];
exec(sprintf("%s > %s 2>&1 & echo $! >> %s", $cmd, $outputfile, $pidfile));

我想在输出文件中看到这个:

saving:         Test torrent (1115.9 MB)
percent done:   19.8
time left:      22 min 04 sec
download to:    /var/www/virtual/tigyisolutions.hu/boxy/htdocs/downloaded_torrent/uid1_fil_1370552248/
download rate:  1344.1 kB/s
upload rate:    115.7 kB/s
share rating:   0.121  (26.8 MB up / 221.3 MB down)
seed status:    81 seen now, plus 3.994 distributed copies
peer status:    18 seen now, 45.3% done at 2175.4 kB/s

而不是这个:

saving:         Test torrent (1115.9 MB)
percent done:   19.8
time left:      22 min 04 sec
download to:    /var/www/virtual/tigyisolutions.hu/boxy/htdocs/downloaded_torrent/uid1_fil_1370552248/
download rate:  1344.1 kB/s
upload rate:    115.7 kB/s
share rating:   0.121  (26.8 MB up / 221.3 MB down)
seed status:    81 seen now, plus 3.994 distributed copies
peer status:    18 seen now, 45.3% done at 2175.4 kB/s
saving:         Test torrent (1115.9 MB)
percent done:   19.8
time left:      22 min 04 sec
download to:    /var/www/virtual/tigyisolutions.hu/boxy/htdocs/downloaded_torrent/uid1_fil_1370552248/
download rate:  1344.1 kB/s
upload rate:    115.7 kB/s
share rating:   0.121  (26.8 MB up / 221.3 MB down)
seed status:    81 seen now, plus 3.994 distributed copies
peer status:    18 seen now, 45.3% done at 2175.4 kB/s
saving:         Test torrent (1115.9 MB)
percent done:   19.8
time left:      22 min 04 sec
download to:    /var/www/virtual/tigyisolutions.hu/boxy/htdocs/downloaded_torrent/uid1_fil_1370552248/
download rate:  1344.1 kB/s
upload rate:    115.7 kB/s
share rating:   0.121  (26.8 MB up / 221.3 MB down)
seed status:    81 seen now, plus 3.994 distributed copies
peer status:    18 seen now, 45.3% done at 2175.4 kB/s ...etc...

所以我想只看到最新的屏幕。我的bash命令附加输出txt而不是重写它。我想改写它。

1 个答案:

答案 0 :(得分:0)

你的问题非常简单。下载程序通常会在屏幕上显示状态栏。绘制状态栏的方式是清除旧状态栏的屏幕,并在其上显示新状态栏。但是,如果输出被重定向到文件,屏幕消隐和新输出将继续写入输出文件,使其大小非常大。

考虑到这一点,你有两个选择:

  • 在将输出发送到文件之前,使用tail将输出限制为9行。您的错误输出将需要重定向到单独的文件并根据需要回读。但是,由于$!less的pid,因此pid会丢失。

    exec(sprintf("%s 2>error_file | tail -n 9 > %s & echo $! >> %s", $cmd, $outputfile, $pidfile));
    
  • 使用mkfifo创建管道,将输出写入管道并在管道的另一端使用tail来写入输出文件。这会将命令复杂化为完整的scriptlet

    exec(sprintf("tdir=`mktemp -d`; mkfifo $tdir/fifo; %s >$tdir/fifo 2>&1 & echo $! >> %s & tail -n 9 $tdir/fifo > %s &", $cmd, $pidfile, $outputfile));
    

为了解释它,mktemp -d创建一个临时目录并返回它的名字(存储在tdir中)。 $tdir/fifo是为fifo选择的名称,并且在mktemp的属性下保证是唯一的。命令输出发送到fifo,pid存储在pidfile中。但是,要写入outputfile,我们使用tail -n 9 $tdir/fifo$tdir/fifo读取并继续阅读$tdir/fifo中的最后9行,直到写入fifo的过程为止完成,然后将它们写入标准输出,重定向到$outputfile。现在$tdir/fifo是一个fifo,没有使用磁盘空间。