我的问题是:
我有使用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而不是重写它。我想改写它。
答案 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,没有使用磁盘空间。