问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

如何在java中执行shell脚本

发布网友 发布时间:2022-04-19 22:43

我来回答

2个回答

懂视网 时间:2022-04-08 09:04

        本实例为用Java执行shell脚本启动或关闭远程Mysql数据库,需求原因:游戏服务器合服后,为了节省内存消耗,需要关闭合服后的服务器不必要的数据库(一台服务器主机存在多个MySql数据库),以提高服务器性能,但有时需要查询历史游戏玩家信息,又需要开启数据库,为了节省运维人员的人力和时间,游戏后台就提供非运维人员都可操作开关数据库的操作。

功能实现步骤:

第一:服务器后台提供参数,发送异步请求,请求方法如下

<script type="text/javascript">
	function shutdownDatabase(param,operate){
		var arr=param.replace(/s+/g," ").split(" ");
		if(arr.length!=3){
			alert("数据库脚本参数个数不正确,请编辑好再操作!");
			return false;
		}
		
		param = param + " " + operate;
		$.ajax({
			url:'XXXAction!databaseSwitch.action',
			type:"post",
			data:{"param":param},
			dataType:"json",
			async:true,
			success:function(data){
				$("#progressImgage").hide();//进度条隐藏
				$("#maskOfProgressImage").hide();//蒙版隐藏
				alert("执行结果:"+data.result);
			},
			error:function(data){
				$("#progressImgage").hide();
				$("#maskOfProgressImage").hide();
				alert("执行结果:"+data.result);
			},
			beforeSend:function(xhr){
				$("#progressImgage").show().css({
	  "position": "fixed",
	  "top": "50%",
	  "left": "50%",
	  "margin-top": function () { return -1 * $("#progressImgage").height() / 2; },
	  "margin-left": function () { return -1 * $("#progressImgage").width() / 2; }
	  });
				$("#maskOfProgressImage").show().css("opacity", "0.1");
			}
		}); 
	}
</script>
其中param为shell脚本参数,根据具体业务而不同。
请求等待提示代码

<img id="progressImgage" class="progress hide" alt="数据库操作中" src="./images/loading.jpg" width="250" height="200"/>
<div id="maskOfProgressImage" class="mask hide"></div>
<style type="text/css">
 .hide{display:none }
 .progress{z-index: 2000}
 .mask{position: fixed;top: 0;right: 0;bottom: 0;left: 0; z-index: 1000; background-color: #000000}
</style> 

第二,后台java代码,发送异步请求到后台java方法,java方法操作执行shell脚本,执行代码如下

/**
	 * 服务器数据库开关
	 */
	public void databaseSwitch() {
		logger.info("服务器数据库开关 start");
		PrintWriter out = null;
		try {
		 ActionContext context = ActionContext.getContext(); 
		 HttpServletRequest request = (HttpServletRequest)context.get(ServletActionContext.HTTP_REQUEST); 
		 HttpServletResponse response = (HttpServletResponse)context.get(ServletActionContext.HTTP_RESPONSE); 
		 request.setCharacterEncoding("UTF-8");
		 response.setCharacterEncoding("UTF-8"); 
		 out= getServletResponse().getWriter();
		 
		 
		 String param= request.getParameter("param"); 
		 if (null == param || "".equals(param)) {
		 	out.write("{"result":"脚本参数不能为空"+""}");
		 	return;
			}
		 String shellStr = "sh /data0/mysql_actions.sh "+param;
			logger.info("执行脚本:"+shellStr);
			List<String> result = new ArrayList<String>();
			result = execShell(shellStr);
			
			out.write("{"result":""+result.toString()+""}");
			logger.info("执行结果:"+result);
		} catch (UnsupportedEncodingException e1) {
			out.write("{"result":"操作数据库时不支持字符编码出错!"}");
			logger.error("execShell方法异常"+e1);
			e1.printStackTrace();
		} catch (Exception e) {
			out.write("{"result":"操作数据库出错!"}");
			logger.error("execShell方法异常");
			e.printStackTrace();
		}
		logger.info("服务器数据库开关 end");
	}
 
 /** 
 * 运行shell 
 * @param shStr 
 * 需要执行的shell 
 * @return 
 * @throws IOException 
 */ 
 public static List<String> execShell(String shStr) throws Exception { 
 List<String> strList = new ArrayList<String>(); 
 Process process; 
 process = Runtime.getRuntime().exec(new String[]{"/bin/sh","-c",shStr},null,null); ////执行shell命令 
 InputStreamReader ir = new InputStreamReader(process.getInputStream()); 
 LineNumberReader input = new LineNumberReader(ir); //脚本输出
 String line; 
 int extValue = process.waitFor(); //执行结果
 strList.add("extValue="+extValue);
 while ((line = input.readLine()) != null){ 
  strList.add(line); 
 } 
 process.destroy();//杀掉进程
 return strList; 
 } 

执行脚本的主要方法为:execShell(String shStr),其中shStr参数为要执行的shell脚本,本实例的脚本写成文件直接调用,这样可读性,可移植性强。


第三,关闭远程服务器数据库

主要是在shell脚本中通过ssh,连接远程服务器,通过脚本判断数据库是否开启并执行开关操作,最后返回结果

关键代码为:

ssh="ssh -c arcfour128 -o MACs=umac-64@openssh.com -o StrictHostKeyChecking=no -o GSSAPIAuthentication=no -p 22"

$ssh $1 "ps -ef |grep mysql |grep `cat /data/${3}/mysql/port`" &> /dev/null
 if [ $? -eq 0 ];then
 echo "主库目前已经处于运行状态"
 else
 $ssh $1 "sh /data0/${3}/mysql/start-mysql.sh &> /dev/null"
 if [ $? -eq 0 ];then
  echo "成功开启主库"
 else
  echo "开启主库失败"
 fi
 fi

其中$1参数为远程服务器ip

详细代码就不贴出来了,详解请私信我。这个功能做出来是非常耗时的,但做出来后,别人就很省时了,含金量比较大。

如果脚本不熟,需要运维人员提供。一个人写需要懂的技术很多,深度很深。


问题1:我执行脚本期间遇到一个问题就是没有在root用户下执行,导致失败,执行脚本需在管理员权限下执行才能成功。

问题2:后台需要远程服务器的无密码登录权限,通过key设置,ssh还要设置为“ForwardAgent yes”。

一切就绪后台即可执行,祝读者好运!






版权声明:本文为博主原创文章,未经博主允许不得转载。

Java执行shell脚本关闭远程数据库

标签:shell   java执行shell脚本   shell关闭数据库   服务器   

热心网友 时间:2022-04-08 06:12

在java中执行shell脚本 用法:Runtime.getRuntime().exec("命令");
String shpath="/test/test.sh"; //程序路径
Process process =null;
String command1 = “chmod 777 ” + shpath;
try {
Runtime.getRuntime().exec(command1 ).waitFor();
} catch (IOException e1) {
e1.printStackTrace();
}catch (InterruptedException e) {
e.printStackTrace();
}

String var="201102"; /参数
String command2 = “/bin/sh ” + shpath + ” ” + var;
Runtime.getRuntime().exec(command2).waitFor();
通过java程序(JSch)运行远程linux主机上的shell脚本

通过Java程序运行远程Linux主机上的shell脚本是可能的,这需要借助JSch库来实现。在使用之前,请确保远程主机已经开启SSH服务。接下来,通过Maven坐标引入JSch依赖库,以执行远程主机上的脚本。创建名为“hello.sh”的文件,内容仅用于测试,即输出“hello ”。将此文件保存在远程主机的“/root”目录下,并...

Java调用CMD(Shell)命令

Java调用shell命令有两种常用方式:第一种是使用Runtime.exec(),第二种是更先进的ProcessBuilder。针对项目实际需求,这里采用了ProcessBuilder。在测试代码中,通过ffmpeg下载网络视频,却发现执行耗时过长,实际下载视频大小远小于预期。分析问题后发现,Java程序在执行shell命令时,命令执行成功或失败的信息被...

怎样在java代码中调用执行shell脚本

// 用法:Runtime.getRuntime().exec("命令"); String shpath="/test/test.sh"; //程序路径 Process process =null; String command1 = “chmod 777 ” + shpath; try { Runtime.getRuntime().exec(command1 ).waitFor(); } catch (IOException e1) { e1.pr...

如何在java程序中调用linux命令或者shell脚本

envp中使用的是name=value的方式。下面说一下,如何使用process来调用shell脚本 例如,我需要在linux下实行linux命令:sh test.sh,下面就是执行test.sh命令的方法:这个var参数就是日期这个201102包的名字。String shpath="/test/test.sh"; //程序路径 Process process =null;String command1 = “...

如何在java程序中调用linux命令或者shell脚本

java程序是提供了这个一方法, Process pro = Runtime.getRuntime().exec(cmds); 但是一般来说,尽量去用一些其他脚本(lua,shell,python)去执行一系列linux命令比较灵活, 而且耗费资源少。但是Runtime.getRuntime().exec()这种调用方式在java虚拟机中是十分消耗资源的,即使命令可以很快的执行完毕...

shell脚本中调用JAVA 程序,如何让JAVA运行结束后,再执行下面命令(只有j...

shell脚本里调用JAVA程序 !/bin/sh java Test.class ##或者java -jar Test.jar stat=`sqlplus ...`if [ $stat = "**"]then nohup sh single1.sh fi shell里的命令也是按顺序执行的,java调用没返回的时候是不会继续往下执行的 如果你调用java程序的时候,命令后面带了个 &amp; 符,则这条命...

我可以用java的quartz来定时执行shell脚本吗

可以,其实你的问题就是java程序怎么调用shell脚本。ProcessBuilder pb = new ProcessBuilder("xx.sh");try {Process p = pb.start();} catch (IOException e) {e.printStackTrace();}

如何在Java中执行其它程序

1、启动程序Java提供了两种方法用来启动其它程序:(1)使用Runtime的exec()方法 (2)使用ProcessBuilder的start()方法 不管在哪种操作系统下,程序具有基本类似的一些属性。一个程序启动后就程序操作系统的一个进程,进程在执行的时候有自己的环境变量、有自己的工作目录。Runtime和ProcessBuilder提供了不...

如何用java调用linux shell命令

public static ArrayList&lt;String&gt; command(final String cmdline, final String directory) { try { Process process = new ProcessBuilder(new String[] {"bash", "-c", cmdline}) .redirectErrorStream(true) .directory(new File(directory)) .start(); ArrayList&lt;String&gt; ...

windows下java怎样调用shell脚本文件

// 用法:Runtime.getRuntime().exec("命令");String shpath="/test/test.sh"; //程序路径 Process process =null;String command1 = “chmod 777 ” + shpath;try { Runtime.getRuntime().exec(command1 ).waitFor();} catch (IOException e1) { e1.printStackTrace();}catch (...

shell并行执行java脚本 java 执行shell脚本 java怎么执行shell脚本 java远程执行shell脚本 shell脚本无法执行jar文件 shell脚本并发执行jar文件 java执行脚本sh java调用shell脚本 java怎么调用shell脚本
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
什么是~直接行销(直接营销) 直接营销方式有哪些 现在基金定投沪深300合适么?麻烦推荐一只沪深300的指数基 在一支试管里放三只火柴,火柴头向下,用橡皮塞轻轻塞住 电脑主机总是黑屏,要重新开才可以,重开之后总是出现写着DSUB的小框框... 悍马路虎到底哪个才是越野之王? 黄山限流是什么意思? 以"我和祖国"为话题的作文300---400字左右 要自己写的 写一篇作文&lt;&lt;歌颂祖国,热爱祖国&gt;&gt;怎么写? 华硕X42JZ 笔记本运行游戏赤壁无法更新? 初学者怎样学电脑比较好? 如何用java执行命令行 JAVA 如何停止一个运行着的指定线程? 请问各位我是个新手,刚买了新的笔记本电脑,应该... 怎么通过java去调用并执行shell脚本以及问题总结 新手学电脑先学什么 JAVA中如何执行DOS命令 新手使用笔记本电脑有什么技巧? java怎么杀掉java进程 java中如何执行命令行语句 笔记本电脑初学者怎样使用? 怎么在java代码中写入DOS命令 运行在linux下的java程序,调用了命令行,如何让java... 电脑新手怎么学习使用电脑? 如何用Java关闭一个进程 如何在Java中执行其它程序 java中如何执行一个应用程序 java process.waitfor=3是什么意思 Java Process.waitFor()这个方法是做什么用的?是不... 怎么样找到自己电脑在局域网中的IP ? java中如何清屏? 电脑初学者怎样使用电脑? Java中有什么代码是可以清屏啊?? Process.waitFor()、Runtime.getRuntime().exec方... java accept阻塞 用Java代码怎么在浏览器中显示一个网页 新手如何买电脑? 新手上电脑怎么操作把资料考进u盘 手机的前置30W像素摄像头拍出的照片能不能看清楚? 为什么iphone4s前置摄像头只有30万像素? 手机摄像头像素:30万像素算清晰吗? 前置摄像头30万像素,后置500万,总的来说,摄像功... iphone4s前置摄像头和后置摄像头,像素各是多少? 华为前置摄像头30万像素怎么样? iphone4s前置摄像头的像素是多少?像素好吗? iphone4s前置摄像头和后置摄像头,像素各是多少 手机前置摄像头30W像素是什么效果 为什么手机前置摄像头只做成30万像素的 “摄像头像素:前:30万像素,后:500万像素”是什么意思 手机电视高清直播版本:5.8.2下载