执行shell脚本无权限讲解 java执行shell脚本无权限


背景 java可以通过Runtime来调用其他进程 , 如cmd命令 , shell文件或脚本等 。
基本用法 Runtime执行时返回一个Process对象 , 利用该对象完成脚本执行 。下面的例子中 , Linux的/home/目录下有一个删除指定日期文件的脚本deletefile.sh , Java调用该脚本的方法如下 。
private staticvoid setSystemDate(String date){Process process = null;String command1 = "/bin/sh /home/deletefile.sh " date;System.out.println(command1);try {process = Runtime.getRuntime().exec(command1);//必须等待该进程结束 , 否则时间设置就无法生效process.waitFor();} catch (IOException | InterruptedException e) {e.printStackTrace();}finally{if(process!=null){process.destroy();}}} 缓冲区满问题 如果脚本执行过程中产生大量的控制台输出信息 , 这种信息会被Shell进程输出到内存缓冲区中 , 而上述用法中作为父进程的java进程并没有处理缓冲区内容 , 那么就会出现缓冲区满 , Java进程挂起的情况 。
解决办法是 , 使用Java线程读取Shell脚本的输出信息 。
public static List executeShell(String shpath, String var){//String shpath="/test/test.sh";// sh 路径//String var="201102";// sh 参数String shellVar = (var==null)?"":var;String command1 = "chmod 777 "shpath; // 为 sh 添加权限String command2 = "/bin/sh "shpath" "shellVar;final List strList = new ArrayList();Process process1 = null;BufferedReader in = null;try {process1 = Runtime.getRuntime().exec(command1); // 执行添加权限的命令process1.waitFor(); // 如果执行多个命令,必须加上final Process process2 = Runtime.getRuntime().exec(command2);//处理InputStream的线程new Thread() {@Overridepublic void run() {BufferedReader in = new BufferedReader(new InputStreamReader(process2.getInputStream()));String line = null;try{while((line = in.readLine()) != null) {strList.add(line);}}catch(IOException e) {e.printStackTrace();}finally {try {in.close();}catch (IOException e) {e.printStackTrace();}}}}.start();//处理ErrorStream的线程new Thread() {@Overridepublic void run(){BufferedReader err = new BufferedReader(new InputStreamReader(process2.getErrorStream()));String line = null;try{while((line = err.readLine()) != null){strList.add(line);}}catch(IOException e){e.printStackTrace();}finally{try{err.close();}catch (IOException e){e.printStackTrace();}}}}.start();process2.waitFor();} catch (IOException e) {} catch (InterruptedException e) {}finally {if(in != null){try {in.close();} catch (IOException e) {}}if(process1 != null){process1.destroy();}}return strList;} 线程阻塞问题 如果执行的shell脚本中有等待输入命令 , 比如more操作 , 那么在使用java进程读取缓冲区内容的时候 , 会出现线程阻塞等待的问题 。
例如 , 下面的脚本读取文件内容 。
filePath=/home/software.infosoftType=$(more $filePath)echo $softType 【执行shell脚本无权限讲解 java执行shell脚本无权限】

推荐阅读