今天看到一个脚本,可以完成脚本的启动/停止/重启/状态,和/etc/init.d中的服务一样。但是/etc/init.d里面的服务要设置开机启动,可以使用service来管理。如果不设置开机启动且方便管理,这个独立脚本就可以自由完成特定的动作。于是笔者将其简单改写后保存下来,用作操作脚本的一种方法,也可以利用crontab将其加入定时任务作为判断进程是否正常并重启。
脚本startup后面传递两个参数,需要操作的脚本名称$1和运行方式$2(start stop restart......)。
1、startup脚本
#!/bin/bash
APP_NAME=$1
DIR_NAME=$HOME/shell/$APP_NAME
#使用说明,用来提示输入参数
usage() {
echo "Usage: sh 执行脚本.sh app_name [start|stop|restart|status]"
exit 1
}
#检查程序是否在运行
is_exist(){
pid=`ps -ef | grep $DIR_NAME | grep -v grep | grep -v $0 | awk '{print $2}'`
echo $pid
#如果不存在返回1,存在返回0
if [ -z "${pid}" ]; then
return 1
else
return 0
fi
}
#启动方法
start(){
is_exist
if [ $? -eq "0" ]; then
echo "${APP_NAME} is already running. pid=${pid} ."
else
nohup sh $DIR_NAME > /dev/null 2>&1 &
fi
}
#停止方法
stop(){
is_exist
if [ $? -eq "0" ]; then
kill -9 $pid
else
echo "${APP_NAME} is not running"
fi
}
#输出运行状态
status(){
is_exist
if [ $? -eq "0" ]; then
echo "${APP_NAME} is running. Pid is ${pid}"
else
echo "${APP_NAME} is NOT running."
fi
}
#重启
restart(){
stop
sleep 5
start
}
#根据输入参数,选择执行对应方法,不输入则执行使用说明
case "$2" in
start)
start
;;
stop)
stop
;;
status)
status
;;
restart|reload)
restart
;;
exist)
is_exist
;;
*)
usage
;;
esac
脚本中pid=`ps -ef | grep $DIR_NAME | grep -v grep | grep -v $0 | awk '{print $2}'` 中grep -v $0直接将本程序start筛选掉。$0代表startup本身文件名。
2、放置于默认路径中
移动到默认路径/usr/local/bin中:mv startup /usr/local/bin ,这样就可以直接使用startup 而不加路径。
3、使用脚本
测试脚本testwhile.sh放置于/root/shell目录下:
#!/bin/bash
echo "my while_prog:"
while true
do
echo "test mysh!"
sleep 2
done
startup testwhile.sh start 完成开启脚本
startup testwhile.sh stop 完成关闭脚本
startup testwhile.sh status完成查看脚本状态
startup testwhile.sh restart/reload 完成重启脚本
此脚本的意义在提供一种独立于/etc/init.d 的方法,当然也可以和/etc/init.d中的服务一样,虽不设置开机启动,也可以将运行的脚本做成服务放置于其中,使用/etc/init.d/testwhile.sh start 来完成启动任务。
网友评论