2011-09-11 4 views
5

저는 리눅스가 내장 된 시스템을 가지고 있으며 지속적으로 실행하는 것이 중요합니다. 기본적으로 센서와 통신하고 데이터를 데이터베이스 및 웹 클라이언트에 중계하는 프로세스입니다.리눅스가 충돌시 자동으로 응용 프로그램을 다시 시작합니다. - 데몬

충돌이 발생하면 어떻게 자동으로 응용 프로그램을 다시 시작해야합니까?

또한 폴링을 수행하는 스레드가 여러 개 있습니다 (예 : 소켓 &). 스레드가 끊어 지거나 갑자기 종료되지 않도록하려면 어떻게합니까? 사용하기 쉬운 워치 독이 사용하기 쉬운가요?

답변

6

그것의 요점은 다음과 같습니다

  1. 당신은 프로그램이 계속 실행하고 걸려 있지 않은 경우 감지해야합니다.
  2. 프로그램이 실행 중이 아니거나 중단 된 경우 프로그램을 다시 시작해야합니다.

은 여러 가지 방법으로는 # 1을 할 수 있습니다,하지만 마음에 와서 두 사람은 다음과 같습니다

  1. 상태 요청을 처리하기 위해, 유닉스 도메인 소켓에 듣기. 그러면 외부 응용 프로그램이 응용 프로그램이 여전히 괜찮은지 여부를 묻습니다. 일부 제한 시간 내에 아무런 응답이 없으면 쿼리되는 응용 프로그램이 교착 상태에 있거나 죽었다고 가정 할 수 있습니다.

  2. 미리 선택된 경로로 파일을 주기적으로 만지십시오. 외부 응용 프로그램은 파일에 대한 시간 소인을 볼 수 있으며 부적절한 경우 appliation이 dead 또는 deadlock으로 간주 할 수 있습니다.

# 2와 관련하여 이전 PID를 강제 종료하고 fork + exec를 사용하여 새 프로세스를 시작하는 것이 일반적입니다. 한 번 실행되는 응용 프로그램에 "지속적으로"실행되는 응용 프로그램을 작성한 다음 "cron"또는 다른 응용 프로그램을 사용하여 해당 단일 실행 응용 프로그램을 계속 다시 실행하는 것도 고려할 수 있습니다.

불행히도 워치 독 타이머와 교착 상태가 발생하는 것은 드문 경우입니다. 나는 그것을 할 수있는 일반적인 방법을 모른다. 그리고 내가 보아온 몇 가지는 꽤 못생긴 것이지 100 % 버그가 없다. 그러나 tsan은 정적 분석을 통해 잠재적 인 교착 상태 시나리오 및 기타 스레딩 문제를 감지하는 데 도움이 될 수 있습니다.

+0

어떤을 시작하기 위해 다른에 /etc/init.d/에이 스크립트를 넣을 수 있습니다 응용 프로그램 실행이 스크립트? – user623879

+1

많은 임베디드 플랫폼에서 워치 독이 죽지 않도록 보장하여 워치 독 데몬이 하드웨어 워치 독을 일으킬 수 있습니다. – Hasturkun

+0

"한 번만 실행되도록 응용 프로그램을 조정 한 다음 해당 단일 스레드를 다시 실행합니다. 반복적으로 응용 프로그램을 실행하십시오. " 이것이 가능하다면 탐지 과정이 상당히 단순해질 것입니다. –

6

forkwaitpid으로 처리가 완료되면 원활하게 다시 시작할 수 있습니다 (in this answer). OS가 메모리 페이지를 공유하기 때문에 상당한 리소스가 들지 않습니다.

이렇게하면 걸린 프로세스를 감지하는 문제 만 남습니다. Michael Aaron Safyan이 지적한 해결책을 사용할 수 있지만 더 쉬운 해결책은 신호가 프로세스를 종료하도록 (그에 따라 sigaction 사용) alarm syscall을 반복적으로 사용하는 것입니다. 프로그램이 실행 중일 때까지 계속 alarm으로 전화를 걸면 프로그램이 계속 실행됩니다. 일단 신호를 보내지 않으면 신호가 발 생합니다.
그런 식으로, 여분의 프로그램이 필요없고 휴대용 POSIX 만 사용됩니다.

1

당신은 프로세스가 수시로 시작 - 중지 - 데몬으로 실행되고 있는지 확인하기 위해 CRON 작업를 만들 수 있습니다.

0

사용

#!/bin/bash 

while ! /path/to/program #This will wait for the program to exit successfully. 
do 
echo “restarting”     # Else it will restart. 
done 

당신은 또한 하하 데몬을보고 그들을 다시 시작 상자 데몬에서 데몬으로

관련 문제