linux后台启动进程并记录进程ID
发布日期:2021-05-07 04:26:11 浏览次数:22 分类:精选文章

本文共 1439 字,大约阅读时间需要 4 分钟。

环境

操作系统:win7

虚拟机:centos7

需求

最近搭建了elasticsearch+kibana,其中由于elasticsearch官方自带后台启动,并且会产生pid文件,所以我自己就写了脚本使其变成系统命令。可以参考:

但是,kibana官方却没有自带后台启动的参数。假设使用&的方式,虽然可以做到后台启动,但是却不能产生pid文件。为什么一定要产生pid文件呢?

因为这是Linux的一种规范,你会发现,凡是你安装的比较正规的软件,都会产生pid文件,它是用来记录进程的id。也因此,也可以通过判断是否产生pid来确定程序是否启动。不过,也正因为它只是一种规范,所以不是一定要遵守的,比如kibana它启动时,就不会产生pid文件。

手动写脚本,使其产生pid文件

启动kibana官方命令是

bin/kibana

经过我多次测试后,自己手写的脚本:

#! /bin/bashecho "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" ];thennohup bin/kibana  > kibana.log 2>&1 &echo "$!" > pidelif [ $1 == "stop" ];thenkill `cat pid`elseecho "Please make sure the position variable is start or stop."fi

再把脚本名去掉.sh,就可以使用:

启动命令:kibana start
停止命令:kibana stop

上一篇:枚举的单例模式的使用方法
下一篇:centos7中配置elasticsearch集群和离线安装x-pack

发表评论

最新留言

很好
[***.229.124.182]2025年03月26日 02时43分08秒