2013-06-06 1 views
0

내 문제는 :php exec를 사용하여 최신 화면 만 출력하는 방법은 무엇입니까?

나는 exec 명령으로 생성 된 큰 출력 파일이 있습니다. 매초마다 텍스트 파일에 추가되기 때문에 약 800-1500MB의 텍스트 출력이 있습니다. 마지막 부분을 텍스트 파일에만 어떻게 쓸 수 있습니까?

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... 

$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)); 

내 출력 파일에이를보고 싶다 :

내가 지금하고 있어요 어떻게 따라서 최신 화면 만보고 싶습니다. 내 bash 명령은 출력 txt를 다시 쓰지 않고 추가합니다. 나는 그것을 다시 쓰고 싶다.

+0

나는 이것을 발견했다 : http://tldp.org/LDP/abs/html/io-redirection.html이 bash 일에 관한 글이지만, 왜 내 bash 스크립트가 그 txt를 덧붙이는지 이해하지 못한다. 그것을 지우고 새로운 것을 생성하십시오. –

+0

'$ cmd'에 어떤 명령이 있고'마지막 부분 데이터 '로 무엇을 의미합니까 :'$ cmd'의 마지막 행,'$ cmd' 또는' $!'? – Samveen

+0

'$ cmd = 'btdownloadheadless --saveas /var/www/virtual/tigyisolutions.hu/boxy/htdocs/downloaded_torrent/'.$kovNev.'/'. $ _REQUEST [ "torrent"];'... 이것은입니다. 내 cmd $ _REQUEST [ "torrent"]는 토런트 파일의 URL입니다. –

답변

0

문제는 매우 간단합니다. 다운로드 프로그램은 대개 화면에 상태 표시 줄을 제공합니다. 상태 표시 줄의 그려지는 방법은 이전 상태 표시 줄에서 화면을 지우고 새 상태 표시 줄을 그 위에 표시하는 것입니다. 그러나 출력을 파일로 리디렉션하면 화면 블랭킹과 새 출력이 출력 파일에 계속 기록되므로 크기가 매우 커집니다. 그걸 염두에두고

는, 당신은이 옵션으로 남겨 :

  • 사용 tail는 출력을 파일로 전송하기 전에 9 개 라인 출력을 제한 할 수 있습니다. 오류 출력을 별도의 파일로 리디렉션하고 필요에 따라 다시 읽어야합니다. 그러나 less의 pid는 $!이므로 pid가 손실됩니다.

    exec(sprintf("%s 2>error_file | tail -n 9 > %s & echo $! >> %s", $cmd, $outputfile, $pidfile)); 
    
  • 용도에서는 mkfifo는 파이프를 생성 파이프 출력을 기록하고 출력 파일에 기록하도록 파이프의 타 단부에 꼬리를 사용한다. 이 mktemp -d는 임시 디렉토리를 생성하고 (tdir에 저장) 이름의 반환

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

그것을 설명하려면 전체 스크립틀릿에 명령을 복잡하게한다. $tdir/fifo은 fifo 용으로 선택된 이름이며 mktemp의 특성을 고려하면 고유하게 보장됩니다. 커맨드 출력은 fifo로 보내지고, pid는 pidfile에 저장됩니다. 그러나 outputfile에 쓰기 위해 $tdir/fifo에서 읽으려면 tail -n 9 $tdir/fifo을 사용하고 fifo가 끝날 때까지 $tdir/fifo의 마지막 9 행을 계속 읽은 다음 $outputfile으로 리디렉션되는 표준 출력에 쓰십시오. 이제 $tdir/fifo은 fifo이므로 디스크 공간이 사용되지 않습니다.

+0

많이 묘사했습니다. 두 번째 예제는 내 서버에서 작동하지 않지만 첫 번째 예제는 거의 작동합니다. 그것은 pidfile을 만들고 출력 파일을 만들지 만, 내 출력 파일은 비어 있습니다. –

+0

@tigyijanos 나는'mktemp'와'mkfifo'를 사용할 수 있고'/'를 경로 구분자로 사용하는 시스템을 작업 중이라는 가정하에 작업했습니다. 그렇지 않은 경우 알려 주시기 바랍니다. – Samveen

+0

시스템에서 mktemp 및 mkfifo를 어떻게 확인할 수 있습니까? 나는 리눅스, 데비안을 사용한다. –

관련 문제