shell脚本调用.out程序,终端中打开服务。
关键命令:
gnome-terminal -x bash -c "./FEPServer.out;exec bash;"
FEPServer.out为要打开的.out程序,也可以是要打开的sh文件。
整体代码如下:
#!/bin/bash
#author:zilong
#file: caiji_start.sh
#comment: caiji start script.
#histroy:
# 2021-03-30 10:00AM created by Zi Long at Philisense
#初始化参数
#服务名
SERVICE_NAME=(
FEP
RTDB
AlarmServer
AlarmGraf
)
#服务启动包所在的目录,根据实际地址设置
SERVICE_PATH=(
/PhiliCube/Application/PhiliFEP
/PhiliCube/Application/PhiliRTDB
/PhiliCube/Application/PhiliAlarm
/PhiliCube/Application/PhiliAlarm
)
#服务启动包
SERVICE_PACKAGE=(
FEPServer.out
RTDBServer.out
AlarmServer.out
AlarmGraf.out
)
# 脚本提示信息
tips(){
echo "-------------------------------------"
echo ""
echo "Version:1.0"
echo "Author:zilong"
echo "Comment:"
echo " 命令举例:sh caiji_start.sh - status"
echo " 当前支持如下服务的启动:FEP、RTDB、AlarmServer、AlarmGraf"
echo " 启动参数:"
echo " -status -查看平台所有服务运行状态"
echo " -start -启动平台所有服务"
echo " -stop -停止平台所有服务"
echo " -restart -重启平台所有服务"
echo " -fep -重启采集服务"
echo " -rtdb -重启实时数据服务"
echo " -alarm -重启报警服务"
echo " -graf -重启报警消息服务"
echo ""
echo "-------------------------------------"
}
#查看状态
status(){
echo ""
echo "---------查看状态 开始执行 ...-----------"
for((i=0;i<${#SERVICE_NAME[@]};i++))
do
num=$((i+1))
service_name=${SERVICE_NAME[i]}
#查找pid之ps方法
#service_pid=$(ps -ef | grep "$service_name" | grep -v grep | grep -v bash | awk '{print $2}')
#查找pid之pgrep方法
service_pid=$(pgrep -f -n "$service_name")
if [ -z "$service_pid" ]; then
echo "--- 服务$num: 【$service_name】未运行!!!"
else
echo "--- 服务$num: 【$service_name】【$service_pid】运行中..."
fi
done
echo "---------查看状态 执行完毕 !!!-----------"
echo ""
}
#一键启动
start()
{
echo ""
echo "---------启动程序 开始执行 ...-----------"
for((i=0;i<${#SERVICE_NAME[@]};i++))
do
num=$((i+1))
service_name=${SERVICE_NAME[i]}
service_path=${SERVICE_PATH[i]}
service_package=${SERVICE_PACKAGE[i]}
echo "---服务$num:【$service_name】开始启动 ..."
echo "--- 服务目录地址为: $service_path"
echo "--- 服务安装程序为: $service_package"
cd "$service_path" || return
# path=`pwd`
# echo "--- 当前目录地址为:$path"
#查找pid之ps方法
#service_pid=$(ps -ef | grep "$service_name" | grep -v "grep" | grep -v "bash" | awk '{print $2}')
#查找pid之pgrep方法
service_pid=$(pgrep "$service_name")
if [ -n "$service_pid" ];then
echo "--- $service_name进程存在,无需启动。当前进程为:$service_pid"
else
##启动服务
echo "--- $service_name进程不存在,启动服务 ..."
gnome-terminal -x bash -c "./$service_package;exec bash;"
##睡1秒,等程序反应,否则可能拿不到pid
sleep 1
service_pid_new=$(pgrep "$service_name")
until [ -n "$service_pid_new" ]
do
service_pid_new=$(pgrep "$service_name")
done
echo "--- $service_name 启动完毕!!!当前进程为:$service_pid_new"
fi
sleep 1
done
echo "---------启动程序 执行完毕 !!!-----------"
echo ""
}
#一键停止
stop(){
echo ""
echo "---------停止程序 开始执行 ...-----------"
for((i=0;i<${#SERVICE_NAME[@]};i++))
do
num=$((i+1))
service_name=${SERVICE_NAME[i]}
#查找启动服务的终端 ps
#service_pid=$(ps -ef | grep "$service_name" | grep "bash" | grep -v "grep" | awk '{print $2}')
#查找启动服务的终端 grep
service_pid=$(pgrep -f -n "$service_name")
if [ -z "$service_pid" ]; then
echo "--- 服务$num: 【$service_name】进程不存在或已停止运行!!!"
else
echo "--- 服务$num: 【$service_name】【$service_pid】运行中..."
#关终端进程
terminal_pid=$(ps -ef | grep "$service_name" | grep "bash" | grep -v "grep" | awk '{print $2}')
if [ -n "$terminal_pid" ]; then
echo "--- 服务$num: 【$service_name】【$terminal_pid】存在窗口"
kill -9 "$terminal_pid"
echo "--- 服务$num: 【$service_name】窗口停止成功。"
fi
#关服务进程
kill -9 "$service_pid"
echo "--- 服务$num: 【$service_name】【$service_pid】服务停止成功。"
fi
sleep 1
done
echo "---------停止程序 执行完毕 !!!-----------"
echo ""
}
##一键重启
restart(){
echo ""
echo "---------重启 开始执行 ...-----------"
stop
sleep 1
start
sleep 1
status
echo "---------重启 执行完毕 !!!-----------"
echo ""
}
#重启某服务处理函数
reservice(){
echo "--- 获取参数 ..."
service_name=$1
service_path=$2
service_package=$3
echo "--- 服务名称为: 【$service_name】"
echo "--- 服务目录地址为:$service_path"
echo "--- 服务安装程序为:$service_package"
#到启动程序目录
cd "$service_path" || return
# path=`pwd`
# echo "--- 当前目录地址为:$path"
#检查服务是否存在进程,有则杀掉
pid=$(pgrep -f -o "$service_name")
if [ -n "$pid" ]; then
echo "--- 服务进程存在,pid=[$pid]关闭当前进程 ..."
kill -9 "$pid"
echo "--- 清理进程后,启动 ..."
else
echo "--- 服务进程不存在 ..."
fi
#重启
gnome-terminal -x bash -c "./$service_package;exec bash;"
sleep 1
service_pid_new=$(pgrep -f -n "$service_name")
until [ -n "$service_pid_new" ]
do
service_pid_new=$(pgrep -f -n "$service_name")
done
echo "--- 服务已启动,当前进程为:$service_pid_new"
}
#采集服务 FEP
fep(){
echo ""
echo "---------采集服务 程序开始执行 ... -----------"
service_name=${SERVICE_NAME[0]}
service_path=${SERVICE_PATH[0]}
service_package=${SERVICE_PACKAGE[0]}
reservice "$service_name" "$service_path" "$service_package"
echo "---------采集服务 程序执行完毕 !!!-----------"
echo ""
}
#实时数据服务 RTDB
rtdb(){
echo ""
echo "---------实时数据服务 程序开始执行 ... -----------"
service_name=${SERVICE_NAME[1]}
service_path=${SERVICE_PATH[1]}
service_package=${SERVICE_PACKAGE[1]}
reservice "$service_name" "$service_path" "$service_package"
echo "---------实时数据服务 程序执行完毕 !!!-----------"
echo ""
}
#报警服务 AlarmServer
alarm(){
echo ""
echo "---------报警服务 程序开始执行 ... -----------"
service_name=${SERVICE_NAME[2]}
service_path=${SERVICE_PATH[2]}
service_package=${SERVICE_PACKAGE[2]}
reservice "$service_name" "$service_path" "$service_package"
echo "---------报警服务 程序执行完毕 !!!-----------"
echo ""
}
#报警消息服务 AlarmGraf
graf(){
echo ""
echo "---------报警服务 程序开始执行 ... -----------"
service_name=${SERVICE_NAME[3]}
service_path=${SERVICE_PATH[3]}
service_package=${SERVICE_PACKAGE[3]}
reservice "$service_name" "$service_path" "$service_package"
echo "---------报警服务 程序执行完毕 !!!-----------"
echo ""
}
##终端输入参数调用
case "$1" in
"-status")
status
;;
"-start")
start
;;
"-stop")
stop
;;
"-restart")
restart
;;
"-fep")
fep
;;
"-rtdb")
rtdb
;;
"-alarm")
alarm
;;
"-graf")
graf
;;
*)
tips
;;
esac
exit 0