문제

이것은 이상하고 범인이 누구인지 확실하지 않습니다.

freebsd (6.2)에서 스크립팅을하고 있습니까? 다음과 같은 *** bash *** ism을 광범위하게 사용합니다.

do_something <(mysql --skip-column-names -B -e 'select ... from ... where ...;')

... "do_something은 파이프 라인에서 읽지 않는 다소 crufty 유틸리티 (Perl)입니다. 일반 파일을 사용하면 잘 작동합니다. 세게 때리다 같은 것을 사용하는 스크립트 exec 4< <(...) 이런 종류의 쿼리로 (양식의 루프에 따름 while read x y z <&4; do ... 아무런 문제가없는 것 같습니다.

그러나 Perl (5.8.x)은 주기적으로 (영원히) 차단되는 것 같습니다. 나는 변경을 시도했다 chomp(my $data = <MYDATA>); 사용한 루틴으로 SysRead 그리고 비교를 위해 Python에서 몇 가지 테스트 사례를 썼습니다. 이것들은 관용어 코드보다 훨씬 덜 차단하는 것처럼 보이지만 때로는 여전히 그렇게합니다. (파이썬 코드 사용 f.read() 또는 os.read(f.fileno()...) 이 문제에서 똑같이 행동하는 것 같습니다).

사용을 사용하여 문제를 재현하려고했습니다 ... <(cat ...) (내가 어디에 고양이일반 파일을 in) 그리고 그것은 그 마구간을 재현하지 않는 것 같습니다.

나는 일부를 보았다 Ktrace/kdump 데이터 ... 그러나 나는 Linux에 훨씬 더 친숙합니다 스트라스 또는 Solaris 지붕틀 ... 그래서 나는 아직 거기에서 무슨 일이 일어나고 있는지 알지 못했습니다.

파이썬을 사용하여 동일한 문제를 재현했기 때문에 대부분 Perl을 배제 할 수 있다고 생각합니다. 세게 때리다 여기서 잘못된 일을 할 수 있습니다 (단지 이름이 지정된 파이프를 만들고 있습니다. /var/tmp/sh-np-xxx 프로세스를 배선하여).

무엇을 할 수있었습니다 MySQL 쉘/유틸리티가 그렇게 할 수 있습니까? 나는 다른 어떤 것에서 그것을 본 것 같지 않다고 생각합니다 (예 : 고양이 또는 DD). Linux 에서이 시나리오를 테스트하지는 않았지만 사용했습니다. <(...) (프로세스 대체) 리눅스에서 몇 년 동안이를 본 적이 없다.

freebsd 문제입니까?

물론 임시 파일을 사용하여 문제를 해결할 수 있습니다. 그러나 나는 그것이 왜이 일을하는지 이해하고 있습니다 (그리고 임시 파일이 수반하는 경주와 청소 혼란을 피하십시오).

제안이 있습니까?

도움이 되었습니까?

해결책

MySQL의 출력과 파일에서 직접 작동하는 것의 큰 차이점은 타이밍입니다. Perl 프로세스가 중단되면 가장 큰 문제는 "왜 진행되지 않는가?"입니다. "l"옵션을 PS에 사용하여 PERL 프로세스의 대기 채널을 볼 수 있습니다. 그렇게하면 읽기에서 차단되었는지 또는 다른 일이 진행되고 있는지 확인할 수 있습니다. 파이프 입력에서 실제로 차단되면 Perl의 Mwchan 항목이 "Piperd"가 될 것으로 기대합니다.

MySQL 프로세스에서도 동일한 정보가 흥미로울 것입니다.

파이썬 테스트 코드는 어떻게 생겼습니까?

Bashism을 피하면서 이것을 쓰는 또 다른 방법은 이것입니다. 그것은 당신이 bash를 배제 할 수있게 해줄 것입니다 :

mysql --skip-column-names -B -e 'select ... from ... where ...;' | do_something /dev/stdin

기타 흥미로운 질문 :

  • MySQL에 대한 -unbuffered 옵션이 무엇이든 변경합니까?

  • DD를 통해 MySQL 출력을 배관하면 무엇이든 변경됩니까? (예 : "perlscript <(mysql ... | dd)

요약 : 더 많은 정보가 필요합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top