프로그램이 계속 실행되도록 하는 서비스를 확보하는 방법은 무엇입니까?

프로그램이 계속 실행되도록 하는 서비스를 확보하는 방법은 무엇입니까?

thin_keep_alive_service에 서비스 요청을 했습니다 /etc/init.d. 나는 그것에 chmod +x권리를 주었다. 스크립트는 다음과 같습니다.

#!/bin/bash

### BEGIN INIT INFO
# Provides:          thin_keep_alive_service
# Required-Start:    $local_fs $network
# Required-Stop:     $local_fs
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description  Keeps Thin servers running
# Description:       This service checks every 30 seconds if at least 
#                    two light weight thin web servers are alive and 
#                    restarts them all from the bundle if not.
###END INIT INFO

while true
do
    # Store an array of the pids of thin
    thin_pid_arr=($(pgrep -f thin))

    # When there are less than two Thin servers left we reboot them all
    if [ ${#thin_pid_arr[@]} -lt 2 ]; then
        cd /root_to_app && bundle exec thin -C /etc/thin/app.yml restart
    fi

    #Wait 30 seconds before checking again
    sleep 30
done

내가 그것을 실행할 때 그것은 작동합니다 service thin_keep_alive_service start. 그러나 시작한 후에는 내 서버 중 두 개가 잠시 후에 종료되고 새 서버가 다시 시작되지 않았기 때문에 백그라운드에서 계속 실행되지 않습니다.

백그라운드에서 실행되고 있는지 어떻게 확인하나요?

답변1

두가지:

  1. 초기화 스크립트는 최소한 시작 및 중지 명령을 지원해야 하며, 초기화 스크립트에 무한 루프가 있으면 스크립트가 호출될 때 부팅 프로세스가 중단되는 경우가 많습니다.

  2. 무엇을 해야할지 모르겠지만 bundle exec thin restart스크립트가 괜찮기 때문에 문제가 있을 가능성이 높습니다. 즉, 이 부분이 귀하가 생각하는 대로 수행되지 않습니다. set -x예상대로 명령이 실행되는지 확인하기 위해 스크립트를 넣을 수 있습니다 .

즉, 서비스를 자동으로 다시 시작하려면 이와 같은 프로세스 관리자를 사용하는 것이 거의 확실히 더 깔끔합니다.달리다.

시. while sleep 30대신 fork()를 사용하여 제거 할 수 있습니다 while true; do ... sleep 30; done. :)

답변2

부팅 후 모든 서버를 시작하는 실행 수준 스크립트(/etc/init.d/thin 아래에 있음)로 Thin을 설치할 수 있습니다.

sudo thin install

그리고 시작할 각 애플리케이션에 대한 프로필을 설정합니다.

thin config -C /etc/thin/myapp.yml -c /var/...

모든 옵션을 얻으려면 Thin -h를 실행하십시오.

읽다얇은 문서!

답변3

언급한 대로 초기화 스크립트를 차단하는 루프가 있어서는 안 됩니다.

내가 할 일은 서비스로 간주되는 또 다른 스크립트를 만드는 것입니다. 해당 스크립트에는 루프가 있고 포그라운드에서 서비스가 시작되므로 루프가 정말 간단해집니다.

#!/bin/sh
while true
do
    start-service ...
    sleep 30
done

초기화 파일에서 서비스를 시작하는 씬 메커니즘이나 기타 메커니즘을 사용하여 해당 스크립트를 참조하므로 서비스가 계속 실행되도록 보장하는 레이어를 추가했습니다.

이제 사용자가 서버를 중지하려고 할 때 알 수 있는 방법이 필요할 수도 있습니다. 루프에는 다음과 같은 것이 없습니다.

#!/bin/sh
while true
do
    start-service ...

    # service properly terminated?
    if ! test -f /var/run/service-id
    then
        exit 0
    fi

    sleep 30
done

/var/run/service-id 파일이 삭제된 경우~ 전에"서비스 시작" 소프트웨어가 반환되면 문제가 없습니다. 이는 서비스가 충돌하더라도 파일이 자동으로 삭제되어서는 안 된다는 의미이기도 합니다.

어쩌면 서비스의 반환 값을 사용할 수도 있습니다. 이 경우 대신 다음을 수행할 수 있습니다(서비스 자체가 차단되는 경우에만 작동한다는 점을 기억하세요).

#!/bin/sh
while true
do
    if start-service ...
    then
        # service cleanly terminated
        exit 0
    fi

    sleep 30
done

이런 종류의 작업은 앱을 자동으로 다시 시작하지만 앱이 충돌하지 않지만 계속 종료되는 경우에는 아무 작업도 수행하지 않습니다.나쁜잠시 후(즉, 느릴 수도 있음) 중지하려면 더 많은 경험적 방법이 필요합니다.

답변4

이를 수행하는 다른 방법이 있습니다. 가장 일반적인 Linux 배포판에서는 프로세스가 실행 중인지 확인하고 그렇지 않은 경우 작업을 수행하는 데 사용할 수 있습니다 upstart. 제가 현재 사용하고 있는 또 다른 좋은 옵션은 입니다 systemd.

하지만 타사 소프트웨어를 사용하려면 monit 및 godrb를 살펴보세요.

관련 정보