2011-06-12 1 views
0

질문이 있습니다. 몇 시간에 한 번씩 문제가 발생하는 명령 줄에서 프로세스를 실행하고 있습니다. 내가 문제를 조사하고있는 동안, 나는 STOUT을 특정 문자열/정규 표현식에 대해 모니터하고 죽이고, 그것이 깨 졌음을 나타내는 것을 출력한다면 프로세스를 다시 시작하고 싶다.STDOUT이 내가 원하는 것으로 변경되면 명령 줄 프로세스를 종료하고 다시 시작 하시겠습니까?

나는 내 자신의 파이썬/루비 스크립트를 롤링하여 바닐라 방식으로 할 수 있지만, 좀 더 깨끗하게 만들 수있는 멋진 도구가 있는지 궁금한가요? 이것은 Windows에 있지만 대답은 유닉스 명령 줄 프로세스가 관련된 경우 cygwin 있습니다.

답변

1

프로그램 | grep CRASH_STRING | xargs -l 1 sh -c 'killall 프로그램 & & 프로그램'

글쎄, 한번 할 것입니다. 그 작업을 반복하는 방법을 잘 모르겠습니다. 좀 더 생각해 보았고 stdout을 명명 된 파이프로 리다이렉션함으로써 아마 할 수 있습니다. 그러나 쉘 스크립트는 스크립트 언어로 워치 독을 작성하는 것보다 더 다루기 힘들어 질 것입니다.

그러나 파이프와 생각이 같은 것입니다 :

mkfifo /tmp/fifo 
program > /tmp/fifo& 
while : 
do 
grep "CRASH_STRING" /tmp/fifo | xargs -l 1 sh -c 'killall program && program > /tmp/fifo&' 
done 
+1

좋은 생각,하지만 당신은 그 접근 방식 버퍼링 문제로 실행 가능성이있어, 'grep'은 이름이 붙은 파이프 또는 다른 파이프로 보내지는데, 전체 버퍼 나 EOF가 생길 때까지 출력을 생성하지 않습니다. 두 번째 것은 전혀 작동하지 않습니다. 심지어 프로그램이 충돌 할 때까지 프로그램을 시작하지 않을 것입니다. 심지어 버퍼링을 제쳐 두어도 ... –

+0

버퍼링에 대해 확신합니까? 파이프에 stdout이 쓰여지는 경우 각 줄 바꿈과 함께 플러시되어야합니다. 두 번째 부러진 것이 맞습니다. 처음 시작할 때조차도 안됩니다 ... 지금 고쳐 봤습니다. 결론적으로, 쉘은이 문제에 대한 끔찍한 도구이며, 파이썬이나 루비를 사용하십시오. – vipw

+0

예, stdout은 기본적으로 _not_ 라인 버퍼입니다 (std :: err은 기본적으로 버퍼링되지 않습니다). stdout은 일반적으로 요청에 따라 플러시되거나 stdin에 대한 첫 번째 폴링에서 플러시됩니다. 많은 언어의 프리미티브는 자동으로 라인 끝 부분에 명시적인 플러시를 포함합니다. – sehe

관련 문제