2012-04-02 75 views
34

以下是redis的新貴腳本。如何創建一個pid,因此我使用monit進行監控?Ubuntu,暴發戶,並創建一個監控pid

#!upstart 
description "Redis Server" 

env USER=redis 

start on startup 
stop on shutdown 

respawn 

exec sudo -u $USER sh -c "/usr/local/bin/redis-server /etc/redis/redis.conf 2>&1 >> /var/log/redis/redis.log" 
+1

爲什麼要在你已經指定'respawn'的時候使用monit? – auny 2013-07-29 17:42:30

+5

@auny除了新手/重生之外,使用monit的原因是respawn只知道進程是否存活,但不知道應用程序是否處於壞狀態。另一方面,Monit可以以不同的方式與應用程序交互,例如點擊http狀態端點,以處理進程可能正在運行的場景,但應用程序處於壞或狀態不良,這將指示進程需要重新啓動。 – Egg 2013-11-12 23:14:37

+0

Redis現在擁有自己的pid功能(redis.conf中的pidfile) - http://download.redis.io/redis-stable/redis.conf – Willem 2016-03-23 10:33:40

回答

68

如果您的計算機上有可用的start-stop-daemon,我強烈建議使用它來啓動您的進程。 start-stop-daemon會以非特權用戶的身份啓動進程,而不會從sudo或su(recommended in the upstart cookbook)分叉,並且它還內置了對pid文件管理的支持。例如:

/etc/init/app_name.conf

#!upstart 
description "Redis Server" 

env USER=redis 

start on startup 
stop on shutdown 

respawn 

exec start-stop-daemon --start --make-pidfile --pidfile /var/run/app_name.pid --chuid $USER --exec /usr/local/bin/redis-server /etc/redis/redis.conf >> /var/log/redis/redis.log 2>&1 

另外,您可以手動使用post-start script節創建它並post-stop script節刪除它管理的pid文件。例如:

/etc/init/app_name.conf

#!upstart 
description "Redis Server" 

env USER=redis 

start on startup 
stop on shutdown 

respawn 

exec sudo -u $USER sh -c "/usr/local/bin/redis-server /etc/redis/redis.conf 2>&1 >> /var/log/redis/redis.log" 

post-start script 
    PID=`status app_name | egrep -oi '([0-9]+)$' | head -n1` 
    echo $PID > /var/run/app_name.pid 
end script 

post-stop script 
    rm -f /var/run/app_name.pid 
end script 
+1

我錯過了什麼,或者將「start-stop-daemon」版本無法正常工作? Upstart不會追蹤'start-stop-daemon'的PID,並且假定當'start-stop-daemon'返回時作業已經終止了。這是我在測試中看到的行爲,據我所知,這是設計。 – cqcallaw 2013-08-17 15:59:01

+0

start-stop-daemon就像一個透明的中間人,在啓動和start-stop-daemon的--exec參數中指定的進程之間工作。所有的新貴命令和PID監控應該像在直接連接到--exec中的進程一樣。您能否提供更多關於似乎產生不同結果的測試的信息? – Egg 2013-08-27 02:27:22

+0

你是否還要將$ USER變成pid文件? – 2013-10-28 15:40:50

21

雞蛋的啓停守護一號例子是路要走。

如果您選擇2nd,我會建議$$獲取PID。

#!upstart 
description "Redis Server" 

env USER=redis 

start on startup 
stop on shutdown 

respawn 

script 
    echo $$ > /var/run/app_name.pid 
    exec sudo -u $USER sh -c "/usr/local/bin/redis-server /etc/redis/redis.conf 2>&1 >> /var/log/redis/redis.log" 
end script 

post-stop script 
    rm -f /var/run/app_name.pid 
end script 
+0

這是唯一能解決我的logstash問題的解決方案。還要注意,腳本最初失敗,因爲setuid需要sudo apt-get install super。必須是捆綁的upstart腳本中的一個適當的錯誤依賴關係。 – darKoram 2015-02-24 16:00:34