supervise是daemontools的一个工具,可以用来监控管理Unix下的应用程序运行情况,在应用程序出现异常时,supervise可以重新启动指定程序。
安装
- 以root身份安装:
apt install daemontools
root@VM-0-15-ubuntu:~# apt install daemontools
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following packages were automatically installed and are no longer required:
amd64-microcode intel-microcode iucode-tool libmysqlclient20 libssl-dev zlib1g-dev
Use 'apt autoremove' to remove them.
Suggested packages:
daemontools-run | runit
The following NEW packages will be installed:
daemontools
0 upgraded, 1 newly installed, 0 to remove and 231 not upgraded.
Need to get 57.7 kB of archives.
After this operation, 308 kB of additional disk space will be used.
Get:1 http://mirrors.tencentyun.com/ubuntu bionic/universe amd64 daemontools amd64 1:0.76-6.1 [57.7 kB]
Fetched 57.7 kB in 0s (1,509 kB/s)
Selecting previously unselected package daemontools.
(Reading database ... 101900 files and directories currently installed.)
Preparing to unpack .../daemontools_1%3a0.76-6.1_amd64.deb ...
Unpacking daemontools (1:0.76-6.1) ...
Setting up daemontools (1:0.76-6.1) ...
Processing triggers for man-db (2.8.3-2ubuntu0.1) ...
- 检查安装
root@VM-0-15-ubuntu:~# supervise
supervise: usage: supervise dir
root@VM-0-15-ubuntu:~#
root@VM-0-15-ubuntu:~/supervise_test# which supervise
/usr/bin/supervise
root@VM-0-15-ubuntu:~/supervise_test#
使用示例
- 在/home/ubuntu/目录下创建文件夹supervise_test:
cd /home/ubuntu/
mkdir supervise_test
cd supervise_test/
- 在文件夹supervise_test下创建要执行的脚本sup_test.sh:
root@VM-0-15-ubuntu:~/supervise_test# vim sup_test.sh
#!/bin/bash
while true
do
echo "This is a supervise test!"
sleep 2
done
esc、:wq保存。添加可执行权限:
chmod +x sup_test.sh
- 在文件夹supervise_test下创建run文件:
root@VM-0-15-ubuntu:~/supervise_test# vim run
#!/bin/bash
/home/ubuntu/supervise_test/sup_test.sh >>/home/ubuntu/supervise_test/test.log
esc、:wq保存。添加可执行权限:
chmod +x sup_test.sh
run启动要执行的脚本sup_test.sh,并把输出重定向到test.log中。
- 使用supervise启动sup_test.sh:
supervise /home/ubuntu/supervise_test/ &
注意:supervise后面的参数为run文件所在的文件夹的路径。
查看sup_test.sh是否启动:
root@VM-0-15-ubuntu:~/supervise_test# ps -ef | grep sup_test.sh | grep -v grep
root 403 402 0 15:15 pts/0 00:00:00 /bin/bash /home/ubuntu/supervise_test/sup_test.sh
sup_test.sh的PID为403,父进程ID为402。
查看sup_test.sh的日志:
root@VM-0-15-ubuntu:~/supervise_test# tail -f test.log
This is a supervise test!
This is a supervise test!
This is a supervise test!
This is a supervise test!
This is a supervise test!
This is a supervise test!
This is a supervise test!
This is a supervise test!
上面说到父进程ID为402,查看ID为402的进程:
root@VM-0-15-ubuntu:~/supervise_test# ps -ef | grep 402 | grep -v grep
root 402 401 0 15:15 pts/0 00:00:00 /bin/bash ./run
root 403 402 0 15:15 pts/0 00:00:00 /bin/bash /home/ubuntu/supervise_test/sup_test.sh
进程402是 /bin/bash ./run,它的父进程ID为401,查看ID为401的进程:
root@VM-0-15-ubuntu:~/supervise_test# ps -ef | grep 401 | grep -v grep
root 401 29070 0 15:15 pts/0 00:00:00 supervise /home/ubuntu/supervise_test/
进程401就是刚刚执行的supervise指令。
由此可见,supervise /home/ubuntu/supervise_test/执行了/home/ubuntu/supervise_test下的run文件,run文件继而执行了sup_test.sh。
另外,执行supervise指令后,在/home/ubuntu/supervise_test/文件夹下,
自动生成了一个名为supervise的文件夹:
root@VM-0-15-ubuntu:~/supervise_test# ls -lh
total 56K
-rwxr-xr-x 1 root root 95 Jul 5 15:13 run
drwx------ 2 root root 4.0K Jul 5 15:19 supervise
-rwxr-xr-x 1 root root 80 Jul 5 15:12 sup_test.sh
-rw-r--r-- 1 root root 39K Jul 5 16:06 test.log
root@VM-0-15-ubuntu:~/supervise_test#
root@VM-0-15-ubuntu:~/supervise_test# ll ./supervise
total 12
drwx------ 2 root root 4096 Jul 5 15:19 ./
drwxr-xr-x 3 root root 4096 Jul 5 15:35 ../
prw------- 1 root root 0 Jul 5 15:15 control|
-rw------- 1 root root 0 Jul 5 15:15 lock
prw------- 1 root root 0 Jul 5 15:15 ok|
-rw-r--r-- 1 root root 18 Jul 5 15:19 status
root@VM-0-15-ubuntu:~/supervise_test#
测试
测试supervise能否起到守护进程的作用。
- 停止sup_test.sh:
root@VM-0-15-ubuntu:~/supervise_test# kill -9 403
root@VM-0-15-ubuntu:~/supervise_test# ./run: line 3: 403 Killed /home/ubuntu/supervise_test/sup_test.sh >> /home/ubuntu/supervise_test/test.log
root@VM-0-15-ubuntu:~/supervise_test# ps -ef | grep sup_test.sh | grep -v grep
root 1395 1394 0 15:19 pts/0 00:00:00 /bin/bash /home/ubuntu/supervise_test/sup_test.sh
- 查看sup_test.sh是否被重新执行:
root@VM-0-15-ubuntu:~/supervise_test# ps -ef | grep sup_test.sh | grep -v grep
root 1395 1394 0 15:19 pts/0 00:00:00 /bin/bash /home/ubuntu/supervise_test/sup_test.sh
可以看到,sup_test.sh被重新执行了,进程ID为1395,父进程ID为1394。查看父进程:
root@VM-0-15-ubuntu:~/supervise_test# ps -ef | grep 1394 | grep -v grep
root 1394 401 0 15:19 pts/0 00:00:00 /bin/bash ./run
root 1395 1394 0 15:19 pts/0 00:00:00 /bin/bash /home/ubuntu/supervise_test/sup_test.sh
父进程依旧是 ./run,不过,父进程ID不再是402,但是父进程的父进程ID仍然为401。
由此可见,sup_test.sh的进程实例被停止之后,/bin/bash ./run被重新执行,进而创建一个新的sup_test.sh的进程实例,以此达到守护sup_test.sh的目的。
【完】