linux主要使用supervise來管理常駐進程予弧⊙罢蹋基于supervise的兩個比較重要的工具是Daemontools和Supervisor羽戒。
實際上塘偎,supervise也算Daemontools的一個工具拿霉。Daemontools是svscanboot,svscan涵防,supervise沪铭,svc,svok椰憋,svstat等一系列工具的合集赔退。
為什么使用Daemontools
參考這里
- 增加刪除service
只需要在/service中刪除或增加link即可 - 快速啟動
在/service中增加服務, 即可自動在五秒內(nèi)完成啟動 - 可靠重啟
service down掉之后窗骑,自動重啟 - 簡單可靠的控制
配置好 /service 之后漆枚, 使用svc命令,可以控制service daemon浪读。 比如:
- svc -h /service/yourdaemon:
sends HUP - svc -t /service/yourdaemon:
sends TERM, and automatically restarts the daemon after it dies
*svc -d /service/yourdaemon:
sends TERM, and leaves the service down - svc -u /service/yourdaemon:
brings the service back up - svc -o /service/yourdaemon:
runs the service once
- 干凈的進程狀態(tài)
重啟的service進程,跟第一次啟動的一樣干凈互订,純潔無暇 - 可移植
通過配置 /service,程序能在各個linux系統(tǒng)(Linux, BSD, Solaris, etc)上氮墨,按相同的方式運行
安裝 和 使用
NOTE: 必須使用 root 運行所有的東西
- Step 1 安裝:
mkdir -p /package
chmod 1755 /package
cd /package
wget http://cr.yp.to/daemontools/daemontools-0.76.tar.gz
tar -xpf daemontools-0.76.tar.gz
rm -f daemontools-0.76.tar.gz
cd admin/daemontools-0.76
package/install
如果 package/install
失敗吐葵,則編輯 ./src/conf-cc
文件,增加-include errno.h/
:
ed ./src/conf-cc
1s/$/ -include errno.h/
wq
或者
vim ./src/conf-cc
增加gcc配置 -include errno.h
然后重試package/install
安裝
- Step 2 啟動:
啟動 Daemontools
apt-get install csh "(for Ubuntu/Debian users)"
csh -cf '/command/svscanboot &'
設置 Daemontools 自啟動(on system boot)
sed -i "1 a\csh -cf '/command/svscanboot &'" /etc/rc.local
chmod +x /etc/rc.local
- Step 3 創(chuàng)建service:
創(chuàng)建 Services 目錄猛铅,并鏈接到/service
凤藏。 下例,創(chuàng)建服務 在/services
mkdir /services
mkdir /services/somerandomservice
echo -e '#!/bin/sh\nexec somerandomcommand' > /services/somerandomservice/run
chmod 755 /services/somerandomservice/run
ln -s /services/somerandomservice/ /service/
創(chuàng)建鏈接到 /service 目錄栗菜, daemontools就會啟動service蹄梢, 這個時候可以檢查service的uptime
svstat /service/somerandomservice
可以知道service的狀態(tài)、pid和運行時間
(note: 如果service的運行時間小于1秒腌歉,則可能是run腳本出錯齐苛,需要調(diào)試)
- Step 4 指定用戶:
使用特定用戶運行service, 與上面的運行類似凹蜂,不過要使用setuidgid
指定用戶
mkdir /services/somerandomuserservice
ed /services/somerandomuserservice/run
a
#!/bin/sh
exec setuidgid somerandomuser somerandomcommand
.
w!
chmod 755 %
q
ln -s /services/somerandomuserservice/ /service/
(note: 以上使用ed
編輯玛痊,也可以使用其他編輯汰瘫,實現(xiàn)一樣的目的)
除了通過指定uidgid混弥,也可以通過全登錄的方式:
mkdir /services/somerandomuserservice
ed /services/somerandomuserservice/run
a
#!/bin/sh
exec su - somerandomuser -c 'exec somerandomcommand'
.
w!
chmod 755 %
q
ln -s /services/somerandomuserservice/ /service/
- Step 5 logger:
配置multilog, 來對service打logger
adduser logger
mkdir /services/somerandomservice/log
mkdir /services/somerandomservice/log/main
chown logger /services/somerandomservice/log/main
ed /services/somerandomservice/log/run
a
#!/bin/sh
exec setuidgid logger multilog t ./main
.
w!
chmod 755 %
q
- Step 6 Debug:
檢查 run 腳本
cd /service/somerandomservice
svc -d .
./run
檢查,修復bug之后蝗拿,使用svc -u /service/somerandomservice
啟動服務
- Step 6 檢查日志:
cd /service/somerandomservice
tail -n5 log/main/current
- Step 7 重啟service:
svc -t /service/somerandomservice
- Step 8 刪除service:
rm /service/somerandomservice
svc -dx /services/somerandomservice