最近在使用启动一个Java进程,然后提供服务:其中程序的启动入口为
log.info("开始启动OI-SOA进程..."); ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext( new String[] { "springapplicationContext-spring.xml" }); context.start(); log.info("启动OI-SOA进程成功..."); while(true){ System.in.read(); }
使用spring启动服务,然后在while(true)中循环调用System.in.read()阻塞主线程,其中shell脚本的为
startOI.sh:
#!/bin/sh . ~/.bash_profile CLASSPATH=../.:./../lib/* echo ------------------------------------------------------------------- echo ------------------------------------------------------------------- echo ===================start oi service...============================ PROVIDER=com.xxx.oi.main.OiSoaMain MEM_ARGS="-XX:PermSize=256M -XX:MaxPermSize=512M -Xms5120M -Xmx5120M" JAVA_OPTIONS="-Dfile.encoding=GBK" ${JAVA_HOME}/bin/java ${MEM_ARGS} -classpath ${CLASSPATH} ${JAVA_OPTIONS} ${PROVIDER}
start.sh:
#!/bin/sh . ~/.bash_profile #startOI.sh 50888 >/dev/null & ./startOI.sh 50887 >/dev/null &
其中start.sh 可以根据都端口配置启动多个进程
此程序在IBM的AIX上运行正常,最近程序扩容,将服务部署到了RedHat Linux上,启动程序,一个CPU就会被完全的占用,无法释放,导致CPU过高,经过分析,发现是System.in.read();这段代码占用了CPU,增加日志发现是这段代码并没有阻塞,而是一直返回-1,根据Java的API,返回-1表示流已经读取结束(-1
if the end of the stream is reached),但是我并没有往控制台写入数据,程序应该一直阻塞才对。经过测试直接运行${JAVA_HOME}/bin/java ${MEM_ARGS} -classpath ${CLASSPATH} ${JAVA_OPTIONS} ${PROVIDER} 也不会有占用CPU的情况,但是加上 & 让程序作为一个守护进程执行就会有问题,所以怀疑是shell某个地方有问题。
进过各种度娘谷哥,stackoverflow,发现在启动脚本中给程序增加一个指定的终端就能够解决,即:
#!/bin/sh
. ~/.bash_profile
#startOI.sh 20888 >/dev/null &
./startOI.sh 20887 >/dev/null 2>&1 < /dev/tty &
其中/dev/tty就是当前的终端,系统作为守护进程启动,并且指定从当前终端读取数据,如果没有数据就阻塞,如果不加上默认终端,Linux认为没有终端,流已经结束,就直接返回-1了。
PS:阻塞当前线程的的其他方法:
Thread.sleep();
可以将主线程休眠,那么进程就会一直存在不退出。
while(true){ try { Thread.sleep(Long.MAX_VALUE); } catch (InterruptedException e) { // TODO Auto-generated catch block log.error("oi进程意外结束",e); } }
相关推荐
《Linux System Programming 中英版 PDF 第二版》是针对Linux系统编程领域的一本经典著作,旨在帮助读者深入理解和掌握在Linux环境下进行系统级编程的技术和方法。这本书的第二版不仅涵盖了第一版的基础内容,还更新...
2. **<unistd.h>头文件**:许多常用的Linux系统函数都定义在这个头文件中,如`open()`, `close()`, `read()`, `write()`等,它们用于文件操作;`fork()`, `execve()`, `wait()`等则涉及进程管理。 3. **<sys/types....
第1 章Linux操作系统概述................... .......................................................................... 2 1.1 Linux发展历史........................................................ 2 ...
根据提供的文件信息,“Linux Unix System Programming.pdf”这本书主要聚焦于实践编程方面,通过大量的程序示例来阐述系统调用的相关知识。以下是对该书可能涉及的一些关键知识点进行深入解析: ### 一、Linux/...
- **1.1.1 二进制调用**:在 Linux 系统编程中,二进制调用(binary system call)是指应用程序通过系统调用来请求操作系统服务的过程。这些调用通常是底层的,用于直接与硬件交互或执行特定的操作系统功能。 - **...
在Linux编程基础中,这些题目涵盖了多个关键概念。以下是根据题目内容整理的知识点: 1. `/etc`目录:这个目录主要用于存放系统管理的配置文件(D选项),例如网络设置、用户账户信息等,而不是安装应用程序、存放...
在Linux操作系统中,系统调用(System Call)是用户程序与操作系统内核交互的主要途径。它们提供了标准的接口,使得开发者能够执行底层操作,如文件I/O、进程管理、内存管理等。`LINUX System Call Quick Reference....
1. **直接路径读(Direct Path Read)**:Oracle使用libaio进行快速的数据读取,跳过了SGA(System Global Area)的缓冲区,减少了I/O等待时间。 2. **直接路径写(Direct Path Write)**:在写入操作中,libaio...
《Linux System Programming: Talking Directly to the Kernel and C Library》是一本深入探讨Linux系统编程的著作,旨在帮助读者理解如何直接与操作系统内核和C库进行交互。这本书涵盖了广泛的Linux编程主题,对于...
《Linux System Programming》是一本深度探讨Linux系统编程的权威书籍,它涵盖了Linux环境中进行系统级编程所需的关键概念和技术。本书旨在帮助开发者理解如何利用Linux内核提供的接口来编写高效的、低级别的程序,...
在嵌入式系统领域,Xilinx的Zynq系列处理器是一种广泛应用的SoC(System on Chip)芯片,其中ZYNQ 7010和ZYNQ 7020是两个常见的型号。这些器件集成了ARM Cortex-A9双核或四核处理器以及可编程逻辑(FPGA)部分,使得...
在Linux系统中,系统调用通过系统调用接口(System Call Interface)执行,这个接口封装了系统调用号和参数,向内核请求执行相应的服务。系统调用在内核中的实现通常涉及检查参数有效性、调度相应的内核函数执行、...
在"OperationSystem.rar"这个压缩包中,我们聚焦于操作系统开发,特别是Unix和Linux这两种广泛使用的开源操作系统。 Unix操作系统由AT&T贝尔实验室的工程师们于1969年开发,它的设计哲学强调简洁性和模块化。Unix...
### Linux Open Sound System (OSS) 4.x Programmer's Guide #### 介绍 《Linux Open Sound System (OSS) 4.x Programmer's Guide》是一份详细的文档,旨在为开发人员提供关于如何使用OSS(Open Sound System)...