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
두가지:
초기화 스크립트는 최소한 시작 및 중지 명령을 지원해야 하며, 초기화 스크립트에 무한 루프가 있으면 스크립트가 호출될 때 부팅 프로세스가 중단되는 경우가 많습니다.
무엇을 해야할지 모르겠지만
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를 살펴보세요.