Software engineering notes

Linux upstart

介紹

upstart 用來管理你的服務, 在機器啟動後自動幫你啟動你的服務, 並且可以選擇在服務死掉後自動重新啟動它

ubuntu 16.04 不支援 upstart 改用 systemd

First Example

這是個簡單的範例只有執行 echo, 執行完也不會有任何背景的 process 在執行

建立 /etc/init/testjob.conf:

description "First example"
author "test"

start on runlevel [2345]

exec echo `date` >> /tmp/testjob.log

測試 conf 語法是否正確

$ init-checkconf /etc/init/testjob.conf
File /etc/init/testjob.conf: syntax ok

開始啟動

$ sudo service testjob start
testjob stop/waiting

顯示結果 /tmp/testjob.log:

Tue Aug 8 11:32:54 UTC 2017

Second Example

這個範例可以保持你想要的 process 在背景執行

首先我們要先有一個不會停止的程式供測試, /tmp/test.sh:

#!/bin/sh
while true
do
    echo `date` >> /tmp/testjob.log
    /bin/sleep 1s
done

給予執行權限

chmod +x /tmp/test.sh

建立 /etc/init/testjob.conf:

description "Second example"
author "test"

start on runlevel [2345]

exec /tmp/test.sh

開始啟動

$ sudo service testjob start
testjob stop/waiting

背景可以看到它一直在執行

PID   %CPU %MEM   RSS COMMAND
20755  0.0  0.0   648 test.sh

每秒可以看到執行結果 /tmp/testjob.log:

Tue Aug 8 12:43:02 UTC 2017

手動停止, 就會把背景執行的程式關掉了

sudo service testjob stop

但是如果它被 kill 掉, 就不會再背景執行

sudo kill -9 20755

讓程式死了也能重新執行

/etc/init/testjob.conf 最後面加上

respawn

即使被 kill 了, 它還是會被重新執行

指令

重新讀取 upstart 設定

initctl reload-configuration

amz-linux 剛新增 config 完要先執行此指令

手動開啟

sudo service testjob start
or
sudo start testjob
or
sudo initctl start testjob

手動關閉

sudo service testjob stop
or
sudo stop testjob
or
sudo initctl stop testjob

查看在 init 清單各程序運作的狀況

sudo initctl list

其他設定

User

它預設執行的 user 是 root, 你可以改成你想要的

setuid ec2-user

Respawn

30 秒內, 被 kill 3 次, 就會不再執行了

respawn limit 3 30

將 nginx 加到 upstart 清單裡

nginx 安裝完本身一開機就會執行, 先把它取消掉

sudo update-rc.d nginx disable

新增 /etc/init/nginx.conf:

# nginx

description "nginx http daemon"
author "George Shammas <georgyo@gmail.com>"

start on (filesystem and net-device-up IFACE!=lo)
stop on runlevel [!2345]

env DAEMON=/usr/sbin/nginx
env PID=/var/run/nginx.pid

expect fork
respawn
respawn limit 10 5
#oom never

pre-start script
        $DAEMON -t
        if [ $? -ne 0 ]
                then exit $?
        fi
end script

exec $DAEMON

[註] Fix nginx start up script was run before the network interface was up

start on (filesystem and net-device-up IFACE!=lo)

其他

ref :