寫了一個服務重啟的腳本,發現服務可以正常關閉,但是不能正常啟動,參考文末博客解決此問題。
問題描述
寫了一個服務重啟腳本,手動執行發現可以正常的啟停服務。
執行腳本1,腳本名sps_noah_service.sh。
#! /bin/bash
echo "----開始執行noah/sps/tomcat/activemq服務腳本----"
#"cd"后面接Linux系統中activemq的安裝目錄
# cd /home/techbloom/activeMQ
#以下定義三個方法分別直接進行tomcat的啟動,關閉和重啟
start(){
echo -e "\033[32m====啟動activemq應用====\033[0m"
cd /home/techbloom/activeMQ
sh ./bin/activemq start >/dev/null 2>&1
echo -e "\033[32m====啟動noah_install腳本====\033[0m"
cd /home/techbloom/Noah-App-install/bin
sh ./noah.sh start >/dev/null 2>&1
echo -e "\033[32m====啟動tomcat腳本====\033[0m"
cd /home/techbloom/tomcat8/bin
sh ./startup.sh >/dev/null 2>&1
}
stop(){
echo -e "\033[32m====關閉activemq應用====\033[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 "\033[32m====關閉noah服務====\033[0m"
cd /home/techbloom/Noah-App-install
sh ./bin/noah.sh stop
echo -e "\033[32m====關閉tomcat服務====\033[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
加入后,定時任務不僅可以關閉服務,也能啟動服務了。
參考博客: