2015-02-05 2 views
0

끝없이 내 로그 파일과 꼬리를 순환시키는 간단한 간단한 스크립트를 작성했습니다. 내가하지 Ctrl 키 + C이 프로그램 제가 Ctrl 키 + Z 필요 이후를 죽일 수스크립트에서 루프를 반복 할 수 없습니다.

내 문제.

어떻게 해결할 수 있습니까? 나는 perl로 해봤지만, 피하고자하는 msg "알람 시계"가있다. with perl i Ctrl + C 괜찮습니다.

perl -e "alarm 10; exec @ARGV" "tail -15f $line | filter" 

그리고 내 코드 :

#!/bin/bash 
    # 
    while : 
    do while read line 
      do 
        charcount=$(ls $line | awk '{ print length; }') 
        printf '%0.s=' $(seq 1 $charcount) 
        echo -e "\n$line" 
        printf '%0.s=' $(seq 1 $charcount) 
        printf '\n' 
        timeout 10s tail -15f $line | filter 
      done < <(ls /var/log/net/*.log) 
    done 

감사합니다!

+0

여기서 실제로 무엇을하려고합니까? 나는 두 가지 다른 언어로 시간 초과 및 경보를 작성함으로써 당신이 고통을 느끼고 있다고 생각합니다. 나는 순수 perl에서 reimplementing 제안했다. – Sobrique

답변

1

'알람 시계'알림은 alarm 함수에 의해 생성 된 SIGALRM 신호를 처리하는 기본 방법이기 때문에 참조하십시오.

Ctrl-C이 작동하지 않는 일반적인 이유는 블로킹 호출이 발생했기 때문이며 따라서 SIGINT 신호가 전송되어 처리되지 않습니다. 이 코드를 일으키는 명백한 아무것도 볼 수 없습니다.

내 마음에, 가장 명백한 방법은 - 펄과 bash를 혼합하는 것을 멈추는 것입니다. 그 방법은 광기 때문입니다.

File::Tail 모듈을 Perl로 사용하는 방법은 어떻습니까? 이것은 심지어 당신이 원하는하는지 수행하는 방법의 예를 가지고

#!/usr/bin/perl 

use strict; 
use warnings; 

use File::Tail; 

foreach (@ARGV) { 
    push(@files, File::Tail->new(name => "$_", debug => $debug)); 
} 
while (1) { 
    ($nfound, $timeleft, @pending) = 
     File::Tail::select(undef, undef, undef, $timeout, @files); 
    unless ($nfound) { 

     # timeout - do something else here, if you need to 
    } 
    else { 
     foreach (@pending) { 
      print $_->{"input"} . " (" 
       . localtime(time) . ") " 
       . $_->read; 
     } 
    } 
} 

이 아마 어쨌든 그것을 실행하는 동안 ctrl-c 당신을 수 있습니다,하지만 펄 당신이 %SIG 해시를 통해 신호를 더 잘 제어 할 수 있습니다 않습니다 - 예를 들어 SIGALRM에서 alarm까지와 SIGINT에서 Ctrl-C까지 킬 신호용 사용자 정의 처리기를 정의 할 수 있습니다.

+0

나는 perl에 익숙하지 않다. 정보를 제공해 주셔서 감사합니다. – Chura

관련 문제