咸鱼

咸鱼是以盐腌渍后,晒干的鱼

0%

Linux下nohup运行后台服务启动&停止脚本

手动启动停止后台服务

1
2
3
4
5
6
7
# 运行一个后台服务
$ nohup jar -jar test.jar >> myout.log &

# 当要停止此服务时,先查询pid,再kill
$ ps -ef|grep v680
root 522133 1 0 12:10 pts/0 00:00:20 java -jar test.jar
$ kill -9 522133

记录后台服务PID

shell脚本中,可以用 $! 获取到当前进程的PID。
开始脚本 通过 echo $! > my.pid 将PID写入到一个文件中;
停止脚本 从文件中读出PID,执行Kill命令杀掉进程。

启动

1
2
3
4
$ vim start.sh

#!/bin/bash
nohup jar -jar test.jar >> myout.log & echo $! > my.pid

停止

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$ vim stop.sh

#!/bin/bash

file="my.pid"
if [ ! -f $file ];then
echo "the $file is not a file"
exit 2
fi
{
read line1
} <$file
echo "kill the $file process $line1"
kill -9 $line1
rm $file
exit 2

脚本查询PID

除了将PID记录到文件,还可以将【手动启动停止后台服务】做成脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
$ vim stop_service.sh

#!/bin/bash

name=myservice-name

# 获取pid,参考https://blog.csdn.net/zhougubei/article/details/124498193
pid=`ps -ef|grep $name | grep java|awk '{print $2}'`

echo "pid: [$pid]"

# 判断pid是否为空,参考https://blog.csdn.net/weixin_43810067/article/details/124113759
#if [[ -z $pid ]];then
# echo "pid is empty."
# exit 2
#fi

# 判断pid变量中是否含有“missing”字符串 ,参考https://linux265.com/news/3780.html
#if [[ "$pid" =~ .*"missing".* ]];then
# echo "pid is missing."
# exit 2
#fi

# 判断pid是否是有效数字
if [ -n "$(echo $pid| sed -n "/^[0-9]\+$/p")" ];then
echo "kill the $name process $pid"
# -9 强制杀进程, -15 保留一点时间释放资源
kill -15 $pid
# 睡眠1秒再查询java进程
sleep 1
ps -ef|grep java
else
echo "$name not running."
fi
#TODO 此处可以加入启动服务,就可以变成一个重启服务的脚本啦!

无注释版本,方便拷贝使用:

1
2
3
4
5
6
7
8
9
10
11
12
13
#!/bin/bash

name=myservice-name
pid=`ps -ef|grep $name | grep java|awk '{print $2}'`
echo "pid: [$pid]"
if [ -n "$(echo $pid| sed -n "/^[0-9]\+$/p")" ];then
echo "kill the $name process $pid"
kill -15 $pid
sleep 1
ps -ef|grep java
else
echo "$name not running."
fi

注意:#!/bin/bash#!/bin/sh 支持的语法更多,#!/bin/sh不支持 if [[ ]];then 语法