Bash

如何擁有確保程序繼續執行的服務?

  • September 8, 2014

我做了一個叫thin_keep_alive_servicein的服務/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. 但它不會在啟動後在後台連續執行,因為我的兩台伺服器在一段時間後就死了,並且沒有重新啟動新的伺服器。

如何確保它在後台執行?

您可以將 Thin 作為執行級別腳本(在 /etc/init.d/thin 下)安裝,該腳本將在引導後啟動所有伺服器。

sudo thin install

並為您要啟動的每個應用程序設置一個配置文件:

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

執行 thin -h 以獲取所有選項。

閱讀瘦文件

兩件事情:

  1. initscripts 應該至少支持一個 start 和一個 stop 命令,並且它們應該退出;在 initscript 中有一個無限循環通常會導致引導過程在呼叫您的腳本時掛起。
  2. 我不知道bundle exec thin restart應該做什麼,但是因為否則你的腳本很好,問題很可能就在那裡,即這個位沒有做你認為它做的事情。您可以放入set -x您的腳本以確保它在應該執行該命令時確實執行該命令。

也就是說,如果您想要自動重新啟動服務,那麼使用像runit這樣的程序管理器幾乎肯定要乾淨得多。

附言。您可以使用while sleep 30而不是while true; do ... sleep 30; done. :)

引用自:https://unix.stackexchange.com/questions/154273