linux程序不断重复运行,使用linuxcrontab启动程序实现不断运行程序

有时我们程序需要不断处理一件事情

如果实时性要求很高,如几秒内,那用程序启动线程循环处理是个不错的选择。

但如果实时性要求不是很高,分钟级或以下,那可以选择换个方式,使用linux crontab

好处:只要linux不挂,程序就可以正常运行,linux服务器重启后服务也不受影响。比上种方式更稳定,编程更简单。

linuxcrontab设置

在命令端输入crontab -e,加入定时调用

*/5 * * * * /opt/consumegradesql/run_add.sh

linux脚本run_add.sh:

注意:crontab,在设定环境变量java_home时必须自己在脚本里设定,如果是直接./执行脚本会查找系统的环境变量。

#!/bin/bash

export JAVA_HOME=/opt/jdk1.6.0_21

export PATH=$JAVA_HOME/bin:$PATH

export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

baseDirForScriptSelf=$(cd "$(dirname "$0")"; pwd)

LIB_CP=:""$baseDirForScriptSelf""/WEB-INF/classes

flist=$baseDirForScriptSelf""/WEB-INF/lib/*.jar;

for i in $flist;

do

LIB_CP=$LIB_CP":"$i;

done

export LIB_CP

CP=${CLASSPATH}${LIB_CP}

java -cp ${CP} -Xms1024m -Xmx1024m com.jd.consume.link.AddConsumeJob

程序主函数:

/**

*负责job启动

*/

public static void main(String[] args) {

SpringUtil springUtil = new SpringUtil("spring/spring-config.xml");

AddConsumeJob addConsumeJob = springUtil.getBean("addConsumeJob");

addConsumeJob.setAlwaysrun(false);

addConsumeJob.start();

LogUtil.error(addConsumeJob.getLogName(), "main End");

System.exit(1);//防止还有其它线程

}

相关代码,要加入防止重复启动代码(通过端口号)

/**

* 启动后不退出

*/

public void start() {

if (!alwaysrun) {//如果是执行完就退出的job

try {

SocketUtil.bindPort(port);

} catch (IOException e) {

LogUtil.error(getLogName(), getLogName() + "Bind port:" + port + " error!", e);

}

LogUtil.error(getLogName(), getLogName() + "Bind port:" + port);

countDownLatch = new CountDownLatch(threadSize);

}

//初始化相应线程

for (int thNo = 1; thNo <= threadSize; thNo++) {

jobRunables.add(getJobRunable(thNo));

}

//启动相应服务线程

ExecutorService executorService = Executors.newFixedThreadPool(threadSize);

for (JobRunable jobRunable : jobRunables) {

executorService.execute(jobRunable);

}

executorService.shutdown();

if (!alwaysrun) {//如果是执行完就退出的job

try {

countDownLatch.await();

} catch (InterruptedException e1) {

LogUtil.error(getLogName(), getLogName() + "threadLatch.await()", e1);

}

SocketUtil.closeSocket();

LogUtil.error(getLogName(), getLogName() + "mainEnd");

}

}

public class SocketUtil {

protected final static Logger log = LoggerFactory.getLogger(SocketUtil.class);

private static ServerSocket serverSocket;

public static void bindPort(int port) throws IOException {

SocketUtil.serverSocket = new ServerSocket(port);

}

public static void closeSocket() {

try {

SocketUtil.serverSocket.close();

} catch (IOException e) {

log.error("close socket error", e);

}

}

}

附:linux端口号

1--1023 系统保留,只能由root用户使用

1024---4999 由客户端程序自由分配

5000---65535 由服务器端程序自由分配

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值