사용자 프로그램에 알리기위한 리소스 친화적 인 방법


10

* nix 시스템에 Perl 스크립트가 있는데, 한 시점에서 50,000 줄 이상의 텍스트를 처리하고 있습니다. 시간이 좀 걸립니다. 이 텍스트를 모두 처리하는 동안 프로그램이 중단되지 않았다는 것을 사용자에게 알리는 리소스 친화적 인 방법을 찾으려고합니다.

현재 텍스트를 처리하는 동안 실시간으로 출력물을 인쇄하고 있습니다. 출력 버퍼를 플러시하고로 한 줄에 출력을 인쇄하고 \r있습니다. 아무것도 인쇄하지 않을 때보 다 거의 두 배나 오래 걸리기 때문에 불필요한 자원 사용으로 보입니다.

그래서 내 질문 : 장기 실행 작업을 수행하는 동안 프로그램이 실제로 실행되고 있음을 사용자에게 알리는 표준 또는 간단한 방법이 있습니까?


어떤 유닉스? FreeBSD 인 경우 Control-T를 보내서 여전히 사용 중인지 확인할 수 있습니다 (기본 상태 명령).
Hennes

답변:


6

[방금 스크립트가 perl 이라는 것을 알았지 만 같은 논리가 적용됩니다 print "\r". 등을 사용 STDERR하거나 버퍼링을 해제 하려고합니다 $| = 1. 아래를 참조하십시오.]

CLI "진행률 표시기"를 구현하는 한 가지 방법은 \r(캐리지 리턴) 문자를 사용하는 것입니다. 커서가 현재 줄의 시작 부분으로 이동합니다 :

#!/bin/bash

count=0
while ((1)); do
    echo -ne "\rCount: $count"
    sleep 1;
    count=$(($count+1));
done     

이해가되지 않으면 시도해보십시오.

이 기술을 사용하여 지금까지 처리 된 행 수 또는 수천 행을 표시 할 수 있습니다. 수십 또는 수백 줄은 너무 자주 (업데이트가 많을수록 = 런타임이 느려짐) 진행 상황이 계속 진행되고 있음을 보여주기에 충분하기 때문에 좋을 수 있습니다. 단위를 지정하거나 0을 추가 할 수 있습니다.

-n-e함께 사용 echo하는 것이 중요합니다.

\b(백 스페이스)를 비슷한 효과로 사용할 수도 있습니다 .


펄에서 :

#!/usr/bin/perl
use strict;
use warnings FATAL => qw(all);

$| = 1;  # Pipeline stdout (i.e., no buffering).

my $count = 1;
while ($count) {
    print "\rCount $count";
    sleep 1;
    $count++;
}               

3

.처리 할 때 줄 바꿈을 표시하지 않고 단일 용지를 인쇄하십시오 . 오래된 기술.

그래서 당신은 얻을 :

Processing...............

간단하고 효과적입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.