daemontools & supervise


daemontools & supervise

daemontools

	概念:daemontools是用来监控进程的工具。

	安装daemontools:
		# 下载包
		wget http://cr.yp.to/daemontools/daemontools-0.76.tar.gz
		# 解压
		tar -zxvf daemontools-0.76.tar.gz

		# 编译。	注意:安装过程中需要创建/service和/command目录,故需要root权限。
		cd admin/daemontools-0.76
		sudo package/install

		# 此时会报错 "/usr/bin/ld: errno: TLS definition in /lib64/libc.so.6 section .tbss mismatches non-TLS reference in envdir.o"
		# 解决:在 src/conf-cc 第一行的最后加上" -include /usr/include/errno.h" 后,重新执行 package/install 即可。

	启动daemontools:
		/command/svscanboot &
		# 说明:
			通过"ls /command/"可以看到daemontools下的命令,svscanboot启动之后会启动svscan,svscan启动后会启动supervise。
			svscan每隔5s会去检查/service目录,如果有新的服务,则启动新的supervise;如果有supervise意外退出会重启supervise(注:若supervise是正常退出的,则不会重启)。
		

	验证:
		ps aux | grep svscan

		# 若查询到如下进程,则表示启动成功。
		/bin/sh /command/svscanboot
		svscan /service


	daemontools中的supervise命令:

		概念:supervise命令用来监控指定的进程,当监控的进程挂掉后,supervise会自动重启该进程。

		格式:supervise xxxx/xxxService	# xxxx/xxxService是一个目录,supervise会监控这个目录,该目录下必须包含名称为run的文件。

		使用:
			第一步:创建服务目录,准备run文件

				举例:创建服务目录:/home/work/jxn-test/agent ,将要监控的进程的启动命令需要放到run文件中:

					vim /home/work/jxn-test/agent/run
					#!/bin/sh
					sh realCmd.sh
					# 注意:
					#	1>服务的启动命令,不能是nohup启动的,因为nohup执行的太快了,最后导致nohup正常结束后,supervise认为nohup进程挂掉了,故会不断地去运行run。
					#	2>必须在run脚本的开头写上 #!/bin/sh ,否则报错:supervise: fatal: unable to start /home/work/jxn/my-service/run: exec format error

					# 给run文件添加执行权限
					chmod 755 run

					# 建立链接,方便管理和查看。
					ln -sf /home/work/jxn-test/agent /service/


			第二步:启动监控

					启动监控:svc -u /home/work/jxn-test/agent  (或:svc -u /service/agent)
					关闭监控:svc -d /home/work/jxn-test/agent
					关闭监控并且停止服务:svc -dk /home/work/jxn-test/agent

					说明:svc命令是用来控制那些被supervise监控的服务的。svc是间接控制服务的,它实际上是通过控制supervise来控制服务。

					格式:svc 参数 xxxx/xxxService

					参数:
						-u 	 	up,启动对该服务的监控。
									注:也可以直接使用supervise命令来启动监控:nohup supervise /home/work/jxn-test/agent > svsrun.log 2>&1 &
						-d 	 	down,停止对该服务的监控,即停止supervise对该服务的监控。
									注:服务不会因此而关闭,若我们要关闭服务,则使用-k参数或手动kill掉服务。
						-o 		once,如果该服务没有运行,则启动该服务,之后若该服务挂掉了,supervise也不会再去启动该服务了。
						-k 		kill,给服务发送一个KILL信号。
						-x 		exit,停止对该服务的监控,并且停止该服务的supervise进程,该服务对应的supervise进程停止后,我们就无法使用svc命令了。	
									注意:我们一般不会使用该参数!如果服务对应的supervise进程被停掉(svc -x 服务目录)或被kill掉,则我们可以使用"nohup supervise 服务目录 & "来重新启动该服务对应的supervise进程。

					查看服务的状态:svstat xxxx/xxxService
					
					常见问题:
						问题:若不小心将服务目录下的supervise目录删除后,会导致无法使用svc命令:
							svc -u /home/work/jxn-test/agent
							提示:svc: warning: unable to control /home/work/jxn-test/agent: file does not exist

							svstat /home/work/jxn-test/agent
							提示:/home/work/jxn-test/agent: unable to open supervise/ok: file does not exist

						解决:
							先kill掉该服务之前的supervise进程:ps aux | grep "supervise /home/work/jxn-test/agent" | grep -v grep | awk '{print $2}' | xargs kill -9
							然后直接使用nohup supervise /home/work/jxn-test/agent > svsrun.log 2>&1 & 启动,然后会自动生成supervise目录,我们就可以使用svc命令了。


	

							

 

你可能感兴趣的:(Linux)