环境
操作系统:win7
虚拟机:centos7
需求
最近搭建了elasticsearch+kibana
,其中由于elasticsearch
官方自带后台启动,并且会产生pid
文件,所以我自己就写了脚本使其变成系统命令。可以参考:
但是,kibana
官方却没有自带后台启动的参数。假设使用&
的方式,虽然可以做到后台启动,但是却不能产生pid
文件。为什么一定要产生pid
文件呢?
因为这是Linux
的一种规范,你会发现,凡是你安装的比较正规的软件,都会产生pid
文件,它是用来记录进程的id
。也因此,也可以通过判断是否产生pid
来确定程序是否启动。不过,也正因为它只是一种规范,所以不是一定要遵守的,比如kibana
它启动时,就不会产生pid
文件。
手动写脚本,使其产生pid文件
启动kibana
官方命令是
bin/kibana
经过我多次测试后,自己手写的脚本:
#! /bin/bash
echo "current PID: $$" #这句删除也可以
#cp /dev/null kibana.log
bin/kibana > kibana.log 2>&1 &
echo "$!"
echo "$!" > pid #将上一个后台进程写入到pid文件中
分析:
bin/kibana > kibana.log 2>&1 &
这句话的作用就是 启动kibana
,并且后台启动,将标准输出和标准错误信息重定向kibana.log
文件中。
进一步分析就是:
bin/kibana > kibana.log # 将标准输出写入kibana.log中
2>&1 # 将标准错误信息重定向到标准输出中
& # 后台启动,但是假设关闭终端CRT,启动的程序也会停止
#可以使用nohup,即使关闭终端,程序也不会停止
nohup bin/kibana > kibana.log 2>&1 &
shell 内置参数 $!
上面脚本中$$
和$!
是内置。
$$
表示的是当前进程id
$!
表示的是上一个后台进程
所以echo "$!"
这句一定要放到启动kibana
命令的后面。echo "$!" > pid
就是将上一个后台进程ID
也就是kibana
的进程id
重定向到pid
中。
重定向时,会先去判断文件pid
是否存在。假设不存在,会自动创建,并且每次都是重新写入,而不是追加。
执行脚本:
./kibana.sh
就会产生pid
文件。
并且启动时,产生的日志都会重定向到kibana.log
中。(kibana.log
也是自己创建的)
如果不想每次都进入kibana
目录来启动kibana
,可以把自己写的脚本放到usr/bin
中,使其变成系统命令。
①把脚本放到usr/bin的目录中
②调整好脚本
调整后的脚本:
#!/bin/bash
# 先进入相关目录
cd /usr/programe_files/kibana-5.2.2/
if [ $1 == "start" ];then
nohup bin/kibana > kibana.log 2>&1 &
echo "$!" > pid
elif [ $1 == "stop" ];then
kill `cat pid`
else
echo "Please make sure the position variable is start or stop."
fi
再把脚本名去掉.sh
,就可以使用:
启动命令:kibana start
停止命令:kibana stop