为了更好监听pentaho server服务编写自动启动脚本,其目的是:
1. 运行stop-pentaho.sh脚本停止pentaho server后有的进程号还没完全关闭,本脚本在启动server前会把之前的server进程kill掉
2. 当server因未知因素挂掉时,本自动脚本会自动重启server
下面这段脚本是判断是否还有未停止的pentaho server进程,如果有则kill掉,并启动pentaho server
#!/bin/sh
pid=`ps -ef | grep pentaho-server| grep -v grep| awk '{print $2}'`
for id in $pid
do
kill -9 $id
pid=`ps -ef | grep pentaho-server| grep -v grep| awk '{print $2}'`
echo $id
sleep 1
done
echo "Pentaho server have been stoped!"
sh /data/pentaho/Pentaho/server/pentaho-server/clear_cache.sh
echo -e "************************\n\n\n\n\n"
echo "Pentaho server has been started now!"
echo -e "************************\n\n\n\n\n"
sleep 5
sh /data/pentaho/Pentaho/server/pentaho-server/start-pentaho.sh
echo "Pentaho server have been started at" $(date "+%Y-%m-%d %H:%M:%S")"!">>/data/pentaho/pentaho-server/temp2.txt
tailf /data/pentaho/Pentaho/server/pentaho-server/tomcat/logs/catalina.out
优化后的脚本判断pentahoserver是否在运行,如果没有则启动,如果有则什么也不做
#!/bin/sh
process=`ps -ef | grep pentaho-server| grep -v grep| wc -l`;
if [ $process -eq 0 ];then
echo Pentaho not running
pid=`ps -ef | grep pentaho-server| grep -v grep| awk '{print $2}'`
echo $pid
for id in $pid
do
kill -9 $id
pid=`ps -ef | grep pentaho-server| grep -v grep| awk '{print $2}'`
echo $id
sleep 1
done
echo "Pentaho server have been stoped!"
sleep 5
sh /data/pentaho/pentaho-server/start-pentaho.sh
else
echo Pentaho is running!
fi
遇到的问题:
1. crontab 脚本中 ps -ef 命名多打印了PID
如果server没有启动时ps -ef | grep pentaho-server| grep -v grep| awk '{print $2}' 执行结果是空,但是crontab定时执行的结果是打印两个PID,然后脚本执行失败。
原因是:ps -ef | grep pentaho-server | grep -v grep | awk '{print $2}'这行代码中的pentaho-server和目录重名了,所以会查询到两个PID
2. crontab 执行的 lsof 命令失效
标的shell中的lsof之前没有写绝对路径导致一直没有输出,导致后续程序无法执行。
解决方案1: 对lsof命令使用绝对命名,即 /usr/sbin/lsof -i:8080
解决方案2:
看一下PATH变量的内容就明白了,(显示结果是/usr/bin:/bin)并没有包含/sbin,那么当你去执行ifconfig lsof 命令的时候,它找不到这条命令的,具体解决办法呢?就是在脚本里面声明一下环境变量,在脚本里面重新定义一下PATH:
PATH=$PATH:/usr/sbin
最终版自启动脚本:
#!/bin/bash
PATH=$PATH:/usr/sbin
DIR_REL=`dirname $0`
cd $DIR_REL
DIR=`pwd`
#echo '1111'>>$DIR/temp2.txt
#process=`ps -ef | grep pentaho-server/tomcat| grep -v grep| wc -l`
process=`lsof -i:8080 |wc -l`
if [ $process -eq 0 ];then
pid=`ps -ef | grep pentaho-server/tomcat| grep -v grep| awk '{print $2}'`
echo $pid >>/data/pentaho/pentaho-server/temp2.txt
for id in $pid
do
kill -9 $id
pid=`ps -ef | grep pentaho-server| grep -v grep| awk '{print $2}'`
echo $id
sleep 1
done
# clear cache,and copy catalina.out to server_logs catalogue
if [ ! -d $DIR/server_logs ];then
mkdir -p $DIR/server_logs
fi
if [ -f "$DIR/tomcat/logs/catalina.out" ];then
echo "Have copy log file catalina.out to $DIR/server_logs"
cp $DIR/tomcat/logs/catalina.out $DIR/server_logs/catalina`date +%Y%m%d%H%M%S`.out
fi
sleep 2
rm -rf $DIR/tomcat/temp/*
rm -rf $DIR/tomcat/logs/*
rm -rf $DIR/tomcat/work/*
#rm -rf $DIR/pentaho-solutions/system/karaf/caches/default/*
rm -rf $DIR/pentaho-solutions/system/jackrabbit/repository/*
sh $DIR/start-pentaho.sh
echo "Pentaho server have been started at" $(date "+%Y-%m-%d %H:%M:%S")"!">> $DIR/auto_monitor_server.log
fi
最终的脚本测试无误后,通过linux中的crontab 命令进行调度,参考博客系列之前的文章: