2009-12-05 5 views
0

몇개의 서버와 다른 데몬이 올바른 순서로 시작해야합니다.우분투에서 init.d 스크립트를 시퀀싱하는 방법

내가 골격 스크립트에서있는 init.d 스크립트를 만든 및 번호 명명 시스템을 사용하여 적절한 순서로 시작을 설치할 수 있지만 몇 가지 문제가 남아 :

하나의 서버 ('ServerA에')가 필요 데이터베이스 연결을 초기화 한 다음 소켓에서 수신 대기합니다. 다른 서버 ('serverB')는 해당 소켓에 연결해야하며 이전 프로세스가 아직 수신 대기 중이 지 않으면 연결이 실패합니다. serverA가 듣기 시작하기 전까지 serverA에 대한 init.d 스크립트가 종료되지 않도록하는 방법이 있습니까? serverB init는 serverA init가 종료 될 때까지 시작되지 않습니다.

지금 설치 프로그램은 성공할 때까지 serverB가 연결을 재 시도하도록하여 작동하지만이 접근법은 약해 보입니다. 나는 시퀀싱을 강제하는 방법에 대해보다 결정 론적으로 이해하고 싶다.

답변

3

네,이 질문에 대한 답변을 드리고자합니다. 그러나이 기술이 유용하다는 것을 알았고 비슷한 문제로 어려움을 겪고있는 다른 사람들과 공유하고 있습니다.

소켓이나 포트를 기다리는 데있어 socat가 매우 유용하다는 것을 알았습니다. 다음과 같은 init.d 스크립트가 있습니다.

case “$1″ in 
    start) 
    echo '--benign phrase' | socat - UNIX-CONNECT:/path/to/socket,retry=10,intervall=1 
;; 

소켓이 쓰기 가능 상태가 될 때까지 대기 한 다음 돌아옵니다. 데몬 화가 필요 없기 때문에 더 높은 번호의 init.d 스크립트가 끝날 때까지 실행을 차단합니다.

이러한 웨이터 스크립트를 사용하면 부팅 순서가 느려지므로 최적이 아니지만 스크립트에서 'sleep n'문을 뿌리는 매우 약한 접근 방식에서 크게 개선되었습니다.

2

나는 그것이 허약하다고 생각하지 않습니다. 적어도 시나리오가 허약하다는 것을 생각할 수 있습니다. 재시도 시간이 5 초이고 그다지 나쁘지 않습니다. 그 KISS 방식과 당신이 이해할 수없는 코너 사건이 없습니다.

분산 된 환경을 동기화하는 것은 마음에 희미한 것이 아니며, 예를 들어 지나치게 잔인합니다.

당신의 접근 방식에 확신을주기 위해 웹 팜을 통해 수십개의 손으로 작성한 복잡한 서버 프로세스가 분산되어 있다고 말할 수 있습니다. 데이터베이스 서버가 사라져도 언제나 슬픔을 느끼지 못했습니다. 네트워크 트렁크가 끊어졌습니다. 데이터베이스가 다시 돌아올 때까지 성능이 저하 된 모드로 계속 실행됩니다.

2

서버가 도메인 소켓에서 수신 대기하는 경우 소켓을 폴링하는 루프를 작성할 수 있습니다. 이 떠들썩한 파티에서이 작업을 수행하는 쉬운 방법이 될 수도 있지만 뭔가처럼 보일 수 있습니다 : 또 다른 해결책이이 수신 대기 소켓을 열 때까지 서버가 디먼 화하지 않은 것입니다

for i in 1 2 3 4 5; do 
    if [ -e '/var/run/myserver.sock' ]; then 
    break 
    fi 
done 

. 그렇게하면 프로세스가 daemonize 될 때까지 init 스크립트가 일시 중지되어 소켓을 사용할 수 있음을 보장합니다.

물론 이것은 다른 수단을 사용하는 대신에 데몬레이션 자체를 수행하는 응용 프로그램에 따라 다릅니다. ("는/usr/빈/myserver를 &"등.) 업데이트

:

또한 점에 유의, 당신이 지금하고있는 모든 시스템-V 스타일 초기화입니다. 우분투는 실제로 Upstart를 사용합니다. Upstart는 일련의 스크립트가 아닌 이벤트 기반 시스템입니다. System-V init 스크립트보다는 upstart 작업을 사용하고 서버에서 사용자 지정 Upstart 이벤트를 발생시켜 두 번째 서버를 시작할 수 있습니다.

Getting Started guide의 예가 맨 아래에 있습니다. API 방법이 있는지 모르겠지만 첫 번째 서버에서 적절한 시점에 "시스템 ("/ bin/initctl eme myevent "); 문제 일 수 있습니다. 더 많은 업 스타트 경험을 가진 사람이 더 자세히 설명 할 수 있습니다.

+0

나는 소켓 'file'이 항상 존재한다고 믿기 때문에 그 존재는 좋은 지표가 아니다. 지연된 대몬 화 접근법이 유망하다. 이제 쉘 '&'방법 (빠르고 쉬운)을 사용하지만 내부적으로 대몬 화를하는 것은 충분히 실용적입니다. – Rdbhost

+0

서버를 시작하기 전에 소켓을 제거 할 수 있으므로 소켓을 다시 만들어야합니다. (나는 또한 루프가 너무 잠을 자야 할 수도 있음을 잊어 버렸다.) –

+0

폴링 루프에서 잠을 자고 싶을 수도있다. – mc0e

관련 문제