Bash
如何擁有確保程序繼續執行的服務?
我做了一個叫
thin_keep_alive_service
in的服務/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 以獲取所有選項。
閱讀瘦文件!
兩件事情:
- initscripts 應該至少支持一個 start 和一個 stop 命令,並且它們應該退出;在 initscript 中有一個無限循環通常會導致引導過程在呼叫您的腳本時掛起。
- 我不知道
bundle exec thin restart
應該做什麼,但是因為否則你的腳本很好,問題很可能就在那裡,即這個位沒有做你認為它做的事情。您可以放入set -x
您的腳本以確保它在應該執行該命令時確實執行該命令。也就是說,如果您想要自動重新啟動服務,那麼使用像runit這樣的程序管理器幾乎肯定要乾淨得多。
附言。您可以使用
while sleep 30
而不是while true; do ... sleep 30; done
. :)