linux java sh

本文介绍了一个用于启动Java应用程序的Shell脚本示例。该脚本设置了JAVA_HOME环境变量,并定义了如何找到应用程序的主目录及类路径,还包含了详细的JVM参数设置,如内存分配、垃圾回收选项等。

#! /bin/sh

 

if [ -z "$JAVA_HOME" ] ; then

export JAVA_HOME=/usr/local/java

fi

 

 

SCRIPT="$0"

while [ -h "$SCRIPT" ] ; do

  ls=`ls -ld "$SCRIPT"`

  # Drop everything prior to ->

  link=`expr "$ls" : '.*-> \(.*\)$'`

  if expr "$link" : '/.*' > /dev/null; then

    SCRIPT="$link"

  else

    SCRIPT=`dirname "$SCRIPT"`/"$link"

  fi

done

 

SERVER_HOME=`dirname "$SCRIPT"`

SERVER_HOME=`cd "$SERVER_HOME" ; cd .. ; pwd`

export SERVER_HOME

 

LIBDIR=$SERVER_HOME/lib

 

CLASSPATH=${CLASSPATH}:${SERVER_HOME}/conf

 

for lib in ${LIBDIR}/*.jar

do

 CLASSPATH=$CLASSPATH:$lib

done

 

java=$JAVA_HOME/bin/java

 

JAVA_OPTS="

-Xmx1G

-Xms1G

-XX:PermSize=128M

-XX:MaxPermSize=256M

-XX:+UseConcMarkSweepGC

-XX:+UseParNewGC

-XX:+CMSConcurrentMTEnabled

-XX:+CMSParallelRemarkEnabled

-XX:+UseCMSCompactAtFullCollection

-XX:CMSFullGCsBeforeCompaction=0

-XX:+CMSClassUnloadingEnabled

-XX:LargePageSizeInBytes=128M

-XX:+UseFastAccessorMethods

-XX:+UseCMSInitiatingOccupancyOnly

-XX:CMSInitiatingOccupancyFraction=80

-XX:SoftRefLRUPolicyMSPerMB=0

-XX:+PrintClassHistogram

-XX:+PrintGCDetails

-XX:+PrintGCTimeStamps

-XX:+PrintHeapAtGC

-Xloggc:/data/logs/gc.log

-XX:+HeapDumpOnOutOfMemoryError

-XX:HeapDumpPath=/data/logs/dump.hprof

"

 

echo "JAVA_HOME  :$JAVA_HOME"

echo "SERVER_HOME:$SERVER_HOME"

echo "CLASSPATH  :$CLASSPATH"

echo "JAVA_OPTS  :$JAVA_OPTS"

 

cd $SERVER_HOME

 

exec  $java -classpath  $CLASSPATH  $JAVA_OPTS com.XX.XX.bootstrap

package generconfig; import java.io.File; import java.io.IOException; import java.sql.SQLException; import java.util.ArrayList; import java.util.List; import org.mybatis.generator.api.MyBatisGenerator; import org.mybatis.generator.config.Configuration; import org.mybatis.generator.config.xml.ConfigurationParser; import org.mybatis.generator.exception.InvalidConfigurationException; import org.mybatis.generator.exception.XMLParserException; import org.mybatis.generator.internal.DefaultShellCallback; import org.springframework.context.support.GenericXmlApplicationContext; import com.pactera.service.schedule.ThreadReadPath; import com.pactera.util.CommTool; /*打包用File->Export->runnable JAR File Export Launch选择对应的类 Export destination 选择地址 Library handling:Copy required */ public class SMSThreadSender { public static void main(String[] args) { if(args.length==0) { System.out.println("短信服务开启,开始加载Spring配置。"); GenericXmlApplicationContext context = new GenericXmlApplicationContext(); context.setValidating(false); context.load("classpath:sysconfig/applicationContext.xml"); context.refresh(); System.out.println("开整·~~~~"); CommTool.smsthreadisruning=true; ThreadReadPath thread = new ThreadReadPath(); thread.smsname="sms"+CommTool.threadid; Thread t1 = new Thread(thread); t1.setName("sms"); t1.start(); System.out.println("已经启动"); } if(args.length==1) { String pfile=args[0]; System.out.println("短信服务开启,开始加载Spring配置。"+pfile); GenericXmlApplicationContext context = new GenericXmlApplicationContext(); context.setValidating(false); context.load(pfile); // context.load("classpath:sysconfig/applicationContext.xml"); context.refresh(); CommTool.smsth
<think>首先,用户的问题是:“我想在Java程序中执行Linuxshell脚本文件 请问Java execute Linux shell script”。这是一个关于在Java程序中执行Linux shell脚本的查询。 我需要参考系统级指令: - 所有行内数学表达式使用$...$格式。 - 独立公式使用$$...$$格式并单独成段。 - LaTeX语法正确。 - 使用中文回答。 - 生成相关问题。 - 回答中引用的段落末尾自然地添加引用标识。 用户可见层指令: - 回答结构清晰,帮助用户逐步解决问题。 - 尽量保证回答真实可靠。 参考站内引用: - 引用[1]: 关于Shell的介绍。 - 引用[2]: Java调用Linux shell命令的示例代码。 - 引用[3]: Java远程执行shell脚本的库。 这些引用是站内提供的,我可以参考它们来构建回答。用户的问题是关于在Java程序中执行本地或远程的shell脚本。 关键点: - 用户想执行Linux shell脚本文件。 - Java程序可能运行在Linux系统上,或者需要远程执行。 - 我需要提供清晰的步骤和代码示例。 可能的场景: 1. 本地执行:Java程序运行在Linux上,直接调用本地shell脚本。 2. 远程执行:Java程序运行在其他系统上,需要连接到Linux服务器执行脚本。 从引用中: - 引用[2]展示了使用Runtime.getRuntime().exec()在本地执行shell脚本。 - 引用[3]展示了使用ganymed-ssh2库远程执行shell脚本。 我应该覆盖这两种情况。 回答结构: 1. **介绍**:简要解释如何在Java中执行shell脚本。 2. **本地执行**:使用Runtime或ProcessBuilder。 3. **远程执行**:使用SSH库如ganymed-ssh2或JSch。 4. **代码示例**:提供简单示例。 5. **注意事项**:讨论错误处理、权限等。 6. **相关问题**:生成相关问题。 使用中文回答。 生成相关问题:在回答末尾,添加相关问题部分。 引用标识:在引用的段落末尾添加[^1]、[^2]等。引用来自提供的站内引用。 步骤: - 在介绍部分,可以引用[1]来简述Shell的作用。 - 在本地执行部分,引用[2]的代码示例。 - 在远程执行部分,引用[3]的库。 确保回答真实可靠:基于标准Java知识和提供的引用。 最终输出格式: - 回答主体。 - §§相关问题§§部分。</think>### 在Java程序中执行Linux shell脚本文件的方法 在Java程序中执行Linux shell脚本文件是一个常见需求,尤其在与Linux系统交互时。Shell脚本是用户与Linux内核通信的桥梁,用户通过Shell提交命令,内核处理后返回结果[^1]。Java提供了多种方式实现这一功能,包括本地执行(Java程序与脚本在同一机器)和远程执行(Java程序连接远程Linux服务器)。下面我将逐步解释核心方法、代码示例和注意事项,确保回答基于可靠实践。 #### 1. **本地执行Shell脚本** 如果Java程序运行在Linux系统上,可以直接使用Java的`Runtime`或`ProcessBuilder`类调用本地脚本文件。这种方式简单高效,适合单机环境。 **核心步骤:** - 使用`Runtime.getRuntime().exec()`或`ProcessBuilder`启动外部进程。 - 指定脚本文件的绝对路径(例如`/home/user/script.sh`)。 - 处理进程输入/输出流和错误流。 - 确保脚本文件有可执行权限(使用`chmod +x script.sh`命令设置)。 **代码示例:参考引用[2]的本地执行方式** ```java import java.io.IOException; public class LocalShellExecutor { public static void main(String[] args) { // 脚本文件路径(需替换为实际路径) String scriptPath = "/home/user/myscript.sh"; try { // 创建进程执行脚本 Process process = Runtime.getRuntime().exec(new String[]{"bash", scriptPath}); // 等待进程结束并获取退出码 int exitCode = process.waitFor(); // 检查执行结果 if (exitCode == 0) { System.out.println("脚本执行成功!"); } else { System.out.println("脚本执行失败,退出码: " + exitCode); } } catch (IOException | InterruptedException e) { e.printStackTrace(); // 处理异常,如文件不存在或权限不足 } } } ``` **说明:** - 使用`bash`命令运行脚本确保兼容性。 - `waitFor()`方法阻塞当前线程直到脚本结束。 - 错误处理:捕获`IOException`(文件路径错误)和`InterruptedException`(进程中断)。 - 权限要求:Java进程需有执行脚本的权限(可通过`Runtime.getRuntime().exec("chmod +x " + scriptPath)`预先设置)。 **注意事项:** - **性能影响**:频繁调用脚本可能增加系统负载,建议批量处理任务。 - **安全风险**:避免硬编码敏感路径,使用配置文件管理路径。 - **输出处理**:通过`process.getInputStream()`读取脚本输出,防止缓冲区阻塞。 #### 2. **远程执行Shell脚本** 如果Java程序不在Linux服务器上,需通过SSH连接远程执行脚本。引用[3]提到的`ganymed-ssh2`库是常用方案,也可使用`JSch`库。 **核心步骤:** - 添加SSH库依赖(如Maven)。 - 建立SSH连接,认证用户名和密码(或密钥)。 - 执行远程命令或脚本文件。 - 处理执行结果和错误。 **代码示例:参考引用[3]的远程执行方式** 首先,在Maven项目中添加依赖: ```xml <dependency> <groupId>ch.ethz.ganymed</groupId> <artifactId>ganymed-ssh2</artifactId> <version>build210</version> </dependency> ``` 然后,Java代码实现远程执行: ```java import ch.ethz.ssh2.Connection; import ch.ethz.ssh2.Session; import ch.ethz.ssh2.StreamGobbler; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; public class RemoteShellExecutor { public static void main(String[] args) { // 服务器信息(需替换为实际值) String hostname = "192.168.1.100"; String username = "user"; String password = "password"; String scriptPath = "/home/user/remotescript.sh"; // 远程脚本路径 Connection conn = new Connection(hostname); try { // 连接服务器 conn.connect(); boolean isAuthenticated = conn.authenticateWithPassword(username, password); if (!isAuthenticated) { throw new IOException("认证失败"); } // 创建会话并执行脚本 Session session = conn.openSession(); session.execCommand("bash " + scriptPath); // 执行远程脚本 // 读取输出流 InputStream stdout = new StreamGobbler(session.getStdout()); BufferedReader br = new BufferedReader(new InputStreamReader(stdout)); String line; while ((line = br.readLine()) != null) { System.out.println("输出: " + line); // 打印脚本输出 } // 检查退出状态 Integer exitStatus = session.getExitStatus(); if (exitStatus != null && exitStatus == 0) { System.out.println("远程脚本执行成功!"); } else { System.out.println("远程脚本执行失败,状态码: " + exitStatus); } // 关闭资源 session.close(); conn.close(); } catch (IOException e) { e.printStackTrace(); // 处理连接或执行错误 } } } ``` **说明:** - 使用`session.execCommand()`直接运行脚本命令。 - `StreamGobbler`处理输出流,避免死锁。 - 认证支持密码或密钥(使用`authenticateWithPublicKey`方法)。 **注意事项:** - **网络延迟**:远程执行受网络影响,建议添加超时机制(如`session.waitForCondition()`)。 - **安全加固**:避免明文存储密码,使用环境变量或密钥认证。 - **错误处理**:远程脚本需在服务器上预先测试,确保路径正确。 - **替代库**:`JSch`库更流行(添加`<dependency><groupId>com.jcraft</groupId><artifactId>jsch</artifactId><version>0.1.55</version></dependency>`)。 #### 3. **通用建议与最佳实践** - **脚本编写**:确保Shell脚本以`#!/bin/bash`开头,并处理错误退出(如`set -e`)。 - **Java版本兼容**:以上方法适用于Java 8+,`ProcessBuilder`在Java 5+可用。 - **性能优化**:对于高频调用,改用Java Native Interface (JNI) 或构建REST API封装脚本。 - **调试技巧**:使用日志框架(如Log4j)记录执行过程,便于排查问题。 - **引用总结**:本地执行参考Runtime类[^2],远程执行依赖SSH库[^3],Shell基础概念见[^1]。 如果提供更多细节(如脚本内容或环境),我可以进一步优化方案!
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值