写了一个服务重启的脚本,发现服务可以正常关闭,但是不能正常启动,参考文末博客解决此问题。
问题描述
写了一个服务重启脚本,手动执行发现可以正常的启停服务。
执行脚本1,脚本名sps_noah_service.sh。
#! /bin/bash
echo "----开始执行noah/sps/tomcat/activemq服务脚本----"
#"cd"后面接Linux系统中activemq的安装目录
# cd /home/techbloom/activeMQ
#以下定义三个方法分别直接进行tomcat的启动,关闭和重启
start(){
echo -e " 33[32m====启动activemq应用==== 33[0m"
cd /home/techbloom/activeMQ
sh ./bin/activemq start >/dev/null 2>&1
echo -e " 33[32m====启动noah_install脚本==== 33[0m"
cd /home/techbloom/Noah-App-install/bin
sh ./noah.sh start >/dev/null 2>&1
echo -e " 33[32m====启动tomcat脚本==== 33[0m"
cd /home/techbloom/tomcat8/bin
sh ./startup.sh >/dev/null 2>&1
}
stop(){
echo -e " 33[32m====关闭activemq应用==== 33[0m"
# sh ./bin/activemq stop >/dev/null 2>&1
pids=`ps -ef|grep "activemq.jar"|grep -v "grep"|awk '{print $2}'`
for pid in $pids
do
kill -9 $pid
done
echo -e " 33[32m====关闭noah服务==== 33[0m"
cd /home/techbloom/Noah-App-install
sh ./bin/noah.sh stop
echo -e " 33[32m====关闭tomcat服务==== 33[0m"
pids=`ps -ef|grep "Bootstrap"|grep -v "grep"|awk '{print $2}'`
for pid in $pids
do
kill -9 $pid
done
}
#以下定义一个可以根据参数调用上面三个方法的方法
control(){
action=$1
case $action in
start)
start
;;
stop)
stop
;;
*)
echo "正常的参数应该是 start|stop|restart"
echo "请重新正确执行脚本"
esac
}
control $1
执行脚本2,脚本名restart_rfidserver.sh,其调用了脚本1。
#!/bin/bash
cd /home/techbloom
echo "----开始关闭rfid服务-`date "+%Y-%m-%d %H:%M:%S"`" >> /home/techbloom/restart_rfidserver_log.txt
sh ./sps_noah_service.sh stop >> /home/techbloom/restart_rfidserver_log.txt
sleep 1m
cd /home/techbloom
sh ./sps_noah_service.sh start >> /home/techbloom/restart_rfidserver_log.txt
echo "----结束启动rfid服务-`date "+%Y-%m-%d %H:%M:%S"`" >> /home/techbloom/restart_rfidserver_log.txt
手动执行脚本2,发现可以正常的关闭和启动服务。
# 重启服务
[root@node01 /home/techbloom]# sh restart_rfidserver.sh
You have new mail in /var/spool/mail/root
# 服务均已启动
[root@node01 /home/techbloom]# jps
2727 Bootstrap
2712 activemq.jar
2762 Jps
2715 NoahServer_JVM
但是将脚本执行加入到crontab定时任务里,发现只能关闭服务,但是不能启动服务。
# crontab任务执行前
[root@node01 /home/techbloom]# jps
1856 NoahServer_JVM
1904 Jps
1868 Bootstrap
1853 activemq.jar
You have new mail in /var/spool/mail/root
# 定时任务
[root@node01 /home/techbloom]# crontab -l
# 早上6点重启服务
0 6 * * * sh /home/techbloom/restart_rfidserver.sh
# 执行完后服务关闭了,但是没启动
[root@node01 /home/techbloom]# jps
2274 Jps
问题排查
将tomcat启动日志打印到本地,提示没有环境变量。由于关闭服务是通过进程号来关闭,所以不受影响,但是启动服务是通过执行服务启动脚本实现,需要加载当前环境变量。
问题解决
参考文末博文,在脚本里加入环境变量。原因是手动执行脚本2是在当前shell环境下进行的,脚本能找到环境变量。而系统自动执行任务调度时,是不会加载任何环境变量的,因此需要在脚本中指定任务运行所需的环境变量。
#!/bin/bash
# 加载环境变量
source /etc/profile
cd /home/techbloom
echo "----开始关闭rfid服务-`date "+%Y-%m-%d %H:%M:%S"`" >> /home/techbloom/restart_rfidserver_log.txt
sh ./sps_noah_service.sh stop >> /home/techbloom/restart_rfidserver_log.txt
sleep 1m
cd /home/techbloom
sh ./sps_noah_service.sh start >> /home/techbloom/restart_rfidserver_log.txt
echo "----结束启动rfid服务-`date "+%Y-%m-%d %H:%M:%S"`" >> /home/techbloom/restart_rfidserver_log.txt
加入后,定时任务不仅可以关闭服务,也能启动服务了。
参考博客: