centos怎样编写tomcat宕机自动重新启动
一、设置tomcat定时启动
1,首先将tomcat注册为服务,先打开tomcat的bin目录下servicebat文件,修改下面的值,这是sevvice的注册名称和显示名称,一般可使用默认值。
set SERVICE_NAME=Tomcat7
set PR_DISPLAYNAME=Apache Tomcat
然后修改jvm大小,搜索到--JvmMs 128 --JvmMx 256 进行修改,因为做成服务启动,启动的时候就不会用到 catalinabat,也就不会读取里面的jvm设置了。(可选,可以不设置)
然后运行cmd命令窗口,cd 到tomcat的bin目录下,运行下面的命令
servicebat install 运行成功过后,会提示服务已经安装成功。
2,制作重启脚本restartbat,文件内容如下
net stop Tomcat7 net start Tomcat7
3,利用控制面板里面的“任务计划”设置第2步的脚本运行时间计划
4,如果想删除服务,也很简单,先把服务停掉,然后在cmd窗口运行下面的命令即可,后面那个Tomcat7是服务名。
sc delete Tomcat7
需要注意的是,需要先把服务停掉,才能一次删除成功,或者删除之后再停止服务,就会发现服务已经删除成功了。
二、监听tomcat
只要运行startbat即可,相关配置在configproperties文件中,默认即可, 如果服务名不对应就修改关闭和启动命令的服务名即可:net start Tomcat7括号中服务名,然后运行startbat
下面是具体的监听代码:
首先是监听类TomcatMonitor java:
[java] view plain copy
import javaioBufferedReader;
import javaioIOException;
import javaioInputStream;
import javaioInputStreamReader;
import javanetMalformedURLException;
import javanetURL;
import javanetURLConnection;
import javautilProperties;
/
@describe:TomcatMonitorjava
@date 2016-7-4
@author liuweilong
/
public class TomcatMonitor implements Runnable{
String start=""; //系统命令 启动
String stop=""; //系统命令 关闭
String testHttp=""; //测试连接地址
int testIntervalTime=1;//测试连接间隔时间,单位为秒
int waitIntervalTime=2; //等待测试间隔时间,单位为秒
int testTotalCount=5; //测试连接总次数
Thread thread=null;
public TomcatMonitor(){
InputStream in = TomcatMonitorclassgetResourceAsStream("configproperties");
Properties p = new Properties();
try {
pload(in);
stop=pgetProperty("stop");
start=pgetProperty("start");
testHttp=pgetProperty("testHttp");
testIntervalTime=IntegerparseInt(pgetProperty("testIntervalTime"));
waitIntervalTime=IntegerparseInt(pgetProperty("waitIntervalTime"));
testTotalCount=IntegerparseInt(pgetProperty("testTotalCount"));
} catch (Exception e) {
eprintStackTrace();
}
Systemoutprintln("初始化成功!");
thread=new Thread(this);
threadstart();
}
public void run() {
Systemoutprintln("正在监控中");
int testCount=0;
while(true){
testCount=0;
testCount++;
boolean isrun=test();
Systemoutprintln("正在启动测试连接,尝试连接次数为:"+testCount+",结果为:"+(isrun==false"失败":"成功!"));
while(!isrun){
if(testCount>=testTotalCount)break;
try {
threadsleep(testIntervalTime1000);
} catch (InterruptedException e) {
eprintStackTrace();
}
testCount++;
Systemoutprintln("正在启动测试连接,尝试连接次数为:"+testCount+",结果为:"+(isrun==false"失败":"成功!"));
isrun=test();
}
if(!isrun){
try{
//关闭tomcat服务
Process proc = RuntimegetRuntime()exec(stop);
threadsleep(5000);
//启动tomcat服务
Systemoutprintln("测试连接失败,正在重启tomcat");
Process p=RuntimegetRuntime()exec(start);
Systemoutprintln("重启tomcat成功");
}catch(Exception e){
eprintStackTrace();
Systemoutprintln("重启tomcat异常,请查看先关错误信息。。。。。");
}
}
try {
threadsleep(waitIntervalTime1000);
} catch (InterruptedException e) {
eprintStackTrace();
}
isrun=test();
}
}
public boolean test(){
URL url=null;
try {
url = new URL(testHttp);
} catch (MalformedURLException e) {
eprintStackTrace();
}
try {
URLConnection urlConn=urlopenConnection();
urlConnsetReadTimeout(15000);
BufferedReader reader = new BufferedReader(new InputStreamReader( urlConngetInputStream())); //实例化输入流,并获取网页代码
String s;
while ((s = readerreadLine()) != null) {
return true;
}
} catch (Exception e) {
return false;
}
return false;
}
public static void main(String[] args) throws Exception{
TomcatMonitor tm=new TomcatMonitor();
}
}
然后是对应的配置文件configproperties:
[plain] view plain copy
#系统命令 启动
start=net start Tomcat7
#关闭
stop = net stop Tomcat7
#测试连接总次数
testTotalCount=3
#连接失败时,再次检测时间间隔,单位为秒
testIntervalTime=3
#连接超时时间,即多少秒tomcat没响应视为宕机,单位为秒
connectionTimeout=15
#tomcat启动时间,防止在tomcat尚未启动完成的时候,程序又去检验tomcat状态,造成尚未启动完成又重新启动,单位为秒
tomcatStartTime=600
#测试连接地址
testHttp=http://127001:8080
#正常情况下,每次检测间隔时间,单位为秒
waitIntervalTime=30
最后是启动的startbat:
[plain] view plain copy
java -cp TomcatMonitor
Windows系统想要快速设置开机自动启动某个程序,可以使用以下几种方法设置:
第一种:设置启动项
1找到启动文件夹,我的是C:\Users\ThinkPad\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup,或者打开运行,输入shell:startup,回车,也可以快速打开启动文件夹。
2拷贝需要开机启动的程序的快捷方式到此文件夹即可。
3打开任务管理器-启动查看启动项。
这样就设置好了,下次计算机启动时,程序也会自动启动的。
第二种:使用计划任务自启动
1新建文本文件DebugStarttxt,打开写入以下内容:
tasklist|find /i "authSenderexe" && echo started || start "" "D:\Debug\authSenderexe"。
这条语句不能换行, authSenderexe 是程序名, "D:\Debug\authSenderexe"是此程序所在路径,tasklist|find /i "authSenderexe"是判断进程是否存在,程序是否已经开启,如未开启才会启动程序,然后改后缀名 txt 为 bat,双击即可启动程序。(可以在每条语句前使用 :: 来注释一条语句),这种方法还可以批量启动不同程序,只需要在此文件中重启一行,按相同格式写第二个要启动的程序对应的语句即可。
2进入任务计划程序窗口,创建任务。
接着选择触发器选项卡,选择新建,在第一栏开始任务处选择登录时(启动时开始任务需要管理员权限)或启动时(启动时开始任务需要管理员权限),点击确定。由于我们的 bat脚本有做判断,所以不用担心程序会启动多次。
在操作选项卡选择新建,并选择启动程序选项,以及在程序和脚本处选择刚才编写的bat程序,点击确定,然后再点击确定(创建任务界面的确定)。
关闭页面,即可做到开机自动启动程序。
第三种:通过组策略设置脚本随服务器启动
1开始->运行->gpeditmsc->计算机配置->Windows设置->脚本(启动/关机)。其中Win10有很多版本,其中家庭版默认是不提供组策略功能,如果需要给win10的家庭版添加组策略的功能,可以参考https://blogcsdnnet/lwpkjio/article/details/85236808。
2添加启动脚本,点击确定。
这样就可以了。
第四种:添加服务自动运行
1开始---运行---cmd---回车,在弹出的窗体中输入如下命令:
sc create Debug binPath= D:\Debug\authSenderexe start= auto,其中Debug为将要创建的服务名。要删除创建的服务也很简单,使用以下命令即可:sc delete ServiceName
2打开控制面板---管理工具---服务(或者 开始---运行---servicesmsc---确认)打开服务管理器,看看你创建的服务已经在里面了,至此,服务运行已创建完成。
不清楚你的实际文件/情况,仅以问题中的样例/说明为据;以下代码复制粘贴到记事本,另存为xxbat,编码选ANSI
@echo off
rem bat间歇性重新运行
set #=Any question&set @=WX&set $=Q&set/az=0x53b7e0b4
title %#% +%$%%$%/%@% %z%
cd /d "%~dp0"
set sleep=1800
:loop
>"tmpbat" echo;title #mark#
>>"tmpbat" echo;php "%~dp0Aphp"
start "" "tmpbat"
timeout /t %sleep% /nobreak
for /f "tokens=2 delims=," %%a in ('tasklist /fi "imagename eq cmdexe" /v /fo csv^|find "#mark#"') do taskkill /f /pid %%a /t
goto loop
现在的Linux操作系统基本上都用systemd管理服务了,这玩意本身就自带服务挂了自动重启功能。只需要配置一个on-failure属性即可。
如果你想把你的程序变成服务,建议抽点时间学学systemd,不会占用你太多时间。
vi /lib/systemd/system/gamedbd service
#写入以下内容 根据你的情况自己修改
[Unit]
Description=OpenSSH server daemon
Documentation=man:sshd(8) man:sshd_config(5)
After=networktarget sshd-keygenservice
Wants=sshd-keygenservice
[Service]
EnvironmentFile=/etc/sysconfig/sshd
ExecStart=/usr/sbin/sshd -D $OPTIONS
ExecReload=/bin/kill -HUP $MAINPID
Type=simple
KillMode=process
Restart=on-failure
RestartSec=42s
[Install]
WantedBy=multi-usertarget
说明:
ExecReload字段:重启服务时执行的命令
ExecStop字段:停止服务时执行的命令
ExecStartPre字段:启动服务之前执行的命令
ExecStartPost字段:启动服务之后执行的命令
ExecStopPost字段:停止服务之后执行的命令
Restart字段可以设置的值如下。
no(默认值):退出后不会重启
on-success:只有正常退出时(退出状态码为0),才会重启
on-failure:非正常退出时(退出状态码非0),包括被信号终止和超时,才会重启
on-abnormal:只有被信号终止和超时,才会重启
on-abort:只有在收到没有捕捉到的信号终止时,才会重启
on-watchdog:超时退出,才会重启
always:不管是什么退出原因,总是重启
// 最后执行下面两句,就可以了
systemctl enable gamedbd service
systemctl start gamedbd service
这样,服务器如果被杀掉会自动重启了
LINUX服务器定时重启的具体命令如下:
crontab -e
0 1 /sbin/reboot ( 0 1 表示每天凌晨一点重启)
0 1 1/sbin/reboot (0 1 1表示每周一凌晨一点重启
30 2 /home/bin/oraclebackupsh (备份数据库和站点目录)
30 3 /home/bin/cmsbackupsh (备份数据库和站点目录)
[root@localhost ~]# /etc/initd/crond restart
[root@localhost ~]# chkconfig --levels 35 crond on (重启crond服务)
扩展资料:
在/etc目录下有一个crontab文件,这个就是系统任务调度的配置文件。用户所建立的crontab文件中,每一行都代表一项任务,每行的每个字段代表一项设置,它的格式共分为六个字段,前五段是时间设定段,第六段是要执行的命令段,格式如下:
minute hour day month week command
其中:
1minute: 表示分钟,可以是从0到59之间的任何整数。
2hour:表示小时,可以是从0到23之间的任何整数。
3day:表示日期,可以是从1到31之间的任何整数。
4month:表示月份,可以是从1到12之间的任何整数。
5week:表示星期几,可以是从0到7之间的任何整数,这里的0或7代表星期日。
6command:要执行的命令,可以是系统命令,也可以是自己编写的脚本文件。
--------------------------------start of script -------------------------------
#!/bin/bash
# 运行记录日志
runlog=/var/test/testlog
# 切换到脚本的工作目录
cd /var/test
# 首先以正常的方式(尝试)结束掉test服务的进程,静默结束
pgrep test |xargs kill -15 &>/dev/null
# 休息1秒,让出1秒时间充分地停止进程
sleep 1
# 检查一下test有没有被成功的结束,首先判断一下执行kill -15以后是否残留有test服务的进程
processnum=$(pgrep test |wc -l)
# 如果test进程数量大于0,则自动让脚本采用强制进程结束的方式快速终止test进程;
if [[ "$processnum" -gt "0" ]];then
pgrep test |xargs kill -9 &>/dev/null
# 发送wait指令,kill -9 一旦执行完毕脚本立刻执行接下来的操作
wait
fi
# 记录停止服务的时间,时间格式的呈现:11/30/13 06:25:37
echo "$(date +"%D %T") service test stoped" >>$runlog
# 执行你的启动命令 ,静默启动
/test /testlua &>/dev/null
# 休息1秒,让出1秒时间充分地让test进程启动完毕
sleep 1
# 统计启动命令执行后test进程的数量
processnum=$(pgrep test |wc -l)
# 如果进程的数量大于0,记录服务成功启动;
if [[ "$processnum" -gt "0" ]];then
echo "$(date +"%D %T") service test start sucess" >>$runlog
# 否则(进程数量等于0),记录服务启动失败;
else
echo "$(date +"%D %T") service test start fail" >>$runlog
fi
----------------------------end of script -----------------------------
将上述代码存入到testsh
在系统的crontab里面加入 00 00,12 /var/test/testsh &>/dev/null ,便捷的方法:echo '00 00,12 /var/test/testsh &>/dev/null' >>/var/spool/cron/ , 用能够有权限执行testsh的用户的账号名称替代(如果不是root用户,那么要确保你调用的用户的SHELL环境变量是/bin/bash或者是/bin/sh),比如使用root, echo '00 00,12 /var/test/testsh &>/dev/null' >>/var/spool/cron/root
1、通过SSH已root用户登录系统
2、执行crontab -e进入编辑模式
3、按i进入输入模式,添加如下命令,
每天2点01分重启
代码:01 2 reboot
” reboot”,前面五个号代表五个数字,顺序分别是:分、时、日、月、星期,
它们数字的取值范围和含义如下:
分钟 (0-59)
小时 (0-23)
日期 (1-31)
月份 (1-12)
星期 (0-6)//0代表星期天
0条评论