红联Linux门户
Linux帮助

linux后台启动进程并记录进程ID

发布时间:2017-04-27 09:53:25来源:linux网站作者:思念悲伤
环境
操作系统: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
 
本文永久更新地址:http://www.linuxdiyf.com/linux/30330.html