centos下,比较通用一点的几个shell脚本记录一下
1. 后台运行:
back_run.sh
运行方式
sh back_run.sh game_server
会生成一个 xxx.pid文件
exe=$1
nohup ./${exe} 0 0 >> log/${exe}.clog 2>&1 &
echo $! > "${exe}.pid" # 生成文件,让监控脚本可触发重启判断,暂不处理多开
2. 查看运行情况, 查看对应进程的pid
info.sh
#!/bin/bash
cur_pwd=`pwd`
function usage()
{
echo "usage: $0 [server_name>]"
echo "find pid of server_name which is launched at certain path"
echo "if [server_name] is no given , find manaserver dbserver gameserver gamegate"
echo
}
server_name_list=$1
if [[ "$server_name_list" == "" ]]
then
server_name_list="cross_server http_server global_server list_server"
fi
for server_name in $server_name_list
do
#pid=`ps -A | grep ${server_name} | cut -d \ -f 1`
#pid=`ps -A | grep ${server_name} | cut -b1-6`
real_pids=""
pids=`ps -C $server_name -o pid=`
for pid in $pids
do
cwd=`ls -l /proc/${pid}/cwd | cut -d- -f2 | awk '{print $2}'`
if [ "$cwd" == "$cur_pwd" ] && [ "$pid" != "" ]; then # 运行目录要和当前目录一致
real_pids="$real_pids $pid"
fi
done
if [[ "$real_pids" == "" ]]
then
echo "----服务器 $server_name 启动失败-----"
# echo "暂不关闭服务器"
# exit 1
# sh close.sh
# echo "服务器启动失败, 已关闭服务器"
# exit 1
fi
echo "${server_name}${real_pids}"
echo
done
3.关闭 几个进程
close.sh
#!/bin/bash
#依次关闭
cur_pwd=`pwd`
function usage()
{
echo "usage: $0 [server_name>]"
echo "find pid of server_name which is launched at certain path"
echo "if [server_name] is no given , find cross_server http_server global_server list_server"
echo
}
server_name_list=$1
if [[ "$server_name_list" == "" ]]
then
server_name_list="cross_server global_server list_server http_server"
fi
for server_name in $server_name_list
do
real_pids=""
pids=`ps -C $server_name -o pid=`
for pid in $pids
do
cwd=`ls -l /proc/${pid}/cwd | cut -d- -f2 | awk '{print $2}'`
if [ "$cwd" == "$cur_pwd" ] && [ "$pid" != "" ]; then
real_pids="$real_pids $pid"
fi
done
if [[ "$real_pids" != "" ]]
then
echo "start kill ${server_name}${real_pids}"
kill ${real_pids}
echo
fi
rm -f "${server_name}.pid" #删除,避免监控脚本又起来了。 暂不处理多开的情况
done
echo ""
4. 监控脚本, 可用crontab定时执行, 发现进程丢失, 调用back_run.sh 启动
check.sh
#!/bin/bash
#依次检查
cur_pwd=`pwd`
function usage()
{
echo "usage: $0 [server_name>]"
echo "find pid of server_name which is launched at certain path"
echo "if [server_name] is no given , find cross_server http_server global_server list_server"
echo
}
server_name_list=$1
if [[ "$server_name_list" == "" ]]
then
server_name_list="cross_server global_server list_server http_server"
fi
for server_name in $server_name_list
do
real_pids=""
pids=`ps -C $server_name -o pid=`
for pid in $pids
do
cwd=`ls -l /proc/${pid}/cwd | cut -d- -f2 | awk '{print $2}'`
if [ "$cwd" == "$cur_pwd" ] && [ "$pid" != "" ]; then
real_pids="$real_pids $pid"
fi
done
if [[ "$real_pids" == "" ]]
then
echo "${server_name} 不存在"
if [ -f ${server_name}.pid ];then
echo "${server_name}${real_pids} 被关闭, 立即重启"
sh back_run.sh ${server_name}
fi
fi
done