java-调用linux命令

33 篇文章 1 订阅
20 篇文章 1 订阅

java中给脚本授权

#先给脚本授权
ProcessBuilder builder = new ProcessBuilder("/usr/bin/chmod", "755","脚本的路径");
Process process = builder.start();
process.waitFor();
#然后执行脚本
Process ps = Runtime.getRuntime().exec(cmd);
ps.waitFor();

执行

  1. 分为调脚本和直接调用linux的命令。亲测,调脚本100%成功,调命令只有一部分成功,比如调用beeline时,在命令行可以正常执行的,在java中调会报ParseException line 1:0 character '' not supported here (state=42000,code=40000),这个问题暂时没解决,只能封装到脚本中,再用exec方法去调。

  2. java调用linux命令的原理就是开启一个子进程,并且是并行的,也就是说,如果代码中前后执行了2个命令,那么这2个是并行执行的,对于串行的需求,有2种方法:

    1. 借助于waitFor
      wairFor的源码是调用的exitValue, exitValue()返回0的时候是正常,其他都是一场情况。
      在这里插入图片描述
    val commandDistcp = s"hadoop --config/cib/distcpConf distcp -Dmapreduce.job.hdfs-servers.token-renewal.exclude=nameservice2 " + 
    s" -overwrite $sendPathStr " +
    s" hdfs://nameservice2:8020/user/hive/warehouse/$dbName.db/$tableName/"
    val runtime = Runtime.getRuntime
    val processDistcp =runtime.exec(commandDistcp)
    //表示processDistcp 执行完再继续执行
    processDistcp.waitFor()
    //在集群1的节点上远程调用集群2的命令,也可以使用ssh连接再执行
    if(processDistcpisAlive.equals(false)) {
    	val	command- s"/cib/spark/msck.sh $dbTableNanet
    	logl.error(command)
    	val process = Runtime.getRuntime.exec(command)
    }
    
    1. 将输出信息打印出来,再执行下一个命令。输出信息打完意味着命令执行完,一个linux命令正常有2个输出,此处将这2个输出都给重定向到了2个输出流中。所以即使前台执行,linux中也不会输出日志。
      注意:流必须关闭,不然exitValue还是显示未关闭
      注意:exitValue除非为0,否则都会报异常,会显示hasnt exists
val info= new BufferedReader(newInputstreamReader(process. getInputStream))
val error =new BufferedReader(newInputstreamReader(process.getErrorStream))
var line = ""
while ({
	line =info.readlineO;
	Option( info .neadLine()).isDefined
}){
	log1. error("info"+line )
}
var line1 = ""
while({
	line1=error.readline;
	Option( error.readline).isDefined
}){
	Logl.error("error"+1ine1) 
}
info.close()
error.close()
processwaitFor()
Logl.error("last -process.exitValue()p"+ process.exitValue())
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值