1. 程式人生 > >java 執行linux命令或shell指令碼方法

java 執行linux命令或shell指令碼方法

一.容易出錯的地方之一,執行ps等命令要注意到jvm呼叫的linux命令也是一個程序

背景:第1,2,3,4行程式碼都可以完成java 執行shell指令碼的任務,第2,3,4行程式碼的陣列中第三個引數可以是指令碼名,也可以是cd / ls / chown 這種命令。

問題:本例中呼叫其他shell指令碼和linux命令都正常,而在第四行程式碼中呼叫ps時候,會遇到不能執行的問題

import java.io.IOException;

public class test {
    public static void main(String[] args) throws IOException,InterruptedException {
        //Runtime.getRuntime().exec("/Users/lijialiang/codetest/stop.sh jmeter");
        //Runtime.getRuntime().exec(new String[]{"/bin/sh","-c","/codetest/stop.sh jmeter"});
        //Runtime.getRuntime().exec(new String[]{"/bin/sh","-c","ps -ef | grep jmeter | grep -v 'grep' |awk '{print $2}'>>result.txt"});
       	Runtime.getRuntime().exec(new String[]{"/bin/sh","-c","ps -ef | grep <span style="font-family: Arial, Helvetica, sans-serif;">jmeter</span><span style="font-family: Arial, Helvetica, sans-serif;"> | awk '{print $2}' | xargs kill -9"});</span>
        //Thread.sleep(100000);
        }
}

java程式碼中,第一行和第二行等價,都是呼叫stop.sh指令碼,第三行第四行等價,都是直接執行linux命令

在此處第一句第二句總能拿到兩個pid,並且當前stop.sh指令碼程序也被kill調。而java的第3行和第4行能正確執行,只拿到1個pid,而且kill掉jmeter程序後,stop.sh程序

仍然正常存在。

stop.sh如下:

pid=`ps -ef | grep jmeter | grep -v 'grep' |awk '{print $2}'`
echo ${pid}>>result.txt
ps -ef | grep jmeter | grep -v 'grep'| awk '{print $2}' | xargs kill -9 

原因:java程式碼呼叫shell指令碼和直接執行shell腳本里的code,在此處不等效。stop.sh的第1句執行,時而拿到1個pid,時而拿到2個的原因是,在java中直接呼叫stop.sh,jvm程序,stop.sh程序,ps -ef 和被判斷的jmeter程序,共存在這四個程序。在java中直接呼叫ps -ef命令,則只存在jvm和ps -ef 和jmeter這三個程序,這時,ps -ef 不止能判斷出jmeter程序,還能把stop.sh jmeter這個程序的pid拿出來並且kill掉,以上問題解決。

二.容易出錯的地方之二,路徑問題

     這個linux命令被jvm或者tomcat啟動,那麼這個命令的程序所在路徑是他的父程序的路徑(classpath),此時linux命令中和路徑有關的命令,要注意。

三.容易出錯的地方之三,父程序執行完就結束,子程序還沒執行完就被迫結束

     如果java中執行‘nohup  run.sh   30min   &’ 這種命令,命令本身需要30分鐘能執行完,但是java 執行nohup這句一瞬間執行完,所代表的父程序結束,則nohup子程序也結束。如果不想被結束,就不要用這種很特殊的nohup命令,而直接在java中呼叫' run.sh 30min '命令即可。

四.列印執行命令的結果

public static void main(String[] args) throws IOException {
		 String line = "";
		 Process ps = Runtime.getRuntime().exec("ls");
		 BufferedReader br = new BufferedReader(new InputStreamReader(ps.getInputStream()));
		 while((line = br.readLine())!=null ){  
		     System.out.println(line);  
         }  
}

完成任務.




相關推薦

java 執行linux命令shell指令碼方法

一.容易出錯的地方之一,執行ps等命令要注意到jvm呼叫的linux命令也是一個程序 背景:第1,2,3,4行程式碼都可以完成java 執行shell指令碼的任務,第2,3,4行程式碼的陣列中第三個引數可以是指令碼名,也可以是cd / ls / chown 這種命令。 問題

Java執行linux命令shell指令碼

import java.io.*; import java.util.*; import org.apache.log4j

java呼叫linux中的shell指令碼並返回執行結果

來自:http://blog.sina.com.cn/s/blog_8e5354210101ku2e.html process這個類是一個抽象類,封裝了一個程序(你在呼叫linux的命令或者shell指令碼就是為了執行一個在linux下執行的程式,所以應該使用process

java執行Linux命令,支援萬用字元(*)

java執行linux或者windows命令,這個需求比較常見。 但是若使用  Runtime.getRuntime().exec(cmd); 會發現,若cmd中含有萬用字元,則無法執行,如cp  /dira/*.txt /dirb 可用如下方式執行: String[]

linux下使用shell指令碼開啟多個terminal並在其中執行程式的方法

gnome-terminal(是一種模擬終端器,一說是ubuntu的terminal就叫gnome-terminal)命令用於開啟一個新的終端,直接在命令列 $ gnome-terminal 就可以開啟一個新的終端,有一些常用引數: 開啟後自動最大化 $ gnome-terminal --maxim

linux中利用shell指令碼條件執行linux命令

linux中利用shell指令碼條件執行命令 在linux環境中,我們總會有一些命令需要經常用,例如經常跳轉到某些目錄下或者執行某些命令,輸入一連串的命令是很煩的,此時我們可以預先寫一些指令碼然後根據我們的選擇自動執行命令,那豈不是完美,本指令碼就是為此而生的(以跳轉不

linux中利用shell指令碼條件執行命令

在linux環境中,我們總會有一些命令需要經常用,例如經常跳轉到某些目錄下或者執行某些命令,輸入一連串的命令是很煩的,此時我們可以預先寫一些指令碼然後根據我們的選擇自動執行命令,那豈不是完美,本指令碼就是為此而生的(以跳轉不同的目錄舉例,當然也可以執行其他命令,

使用java代碼執行linux命令

and linux env file 沒有 子線程 catch tin interrupt 前提: java代碼是在windows下面寫的,要打包放到linux下面運行,並且執行某個腳本。 java代碼:        try {          // 起作用的代碼其實

Linux Centos7通過shell指令碼來監控mysql的執行狀態

vim checkmysql.sh #!/bin/sh #create by mingongge at 2018-10-10 port=`netstat -lnt|grep 3306|wc -l` if  [ $post -ne 1 ] ;then    now

Java 呼叫Linux 命令,並獲取命令執行結果

1.工具類 public class ExcuteLinux { public static String exeCmd(String commandStr) { String result = null; try { St

java實現 連線遠端伺服器 執行Linux命令 並獲取 執行返回的結果

情景:要通過java連線伺服器,並執行指令碼命令 得到 返回的結果 package com.ideal.openapi.util; import com.jcraft.jsch.*; import org.slf4j.Logger; import org.slf4j.LoggerFacto

java執行linux和windows指令碼工具類

我們有時候會 在java程式碼中,去執行一個linux shell指令碼或者windows觸發執行一個.bat指令碼 本文章,會寫一個通用的指令碼工具類,通過這個工具類,可以在java程式碼中,呼叫linux shell指令碼,或者window .bat指令碼。 比

Linux的基礎命令Shell指令碼

一、計算機   1、能接收使用者輸入的指令和資料,經過中央處理器的算術邏輯單元處理,然後會產生或者顯示新資料的,就是計算機。    比如,普通商戶用的計算器,手機,提款機,汽車導航,桌面電腦,手提電腦等   2、計算機

實現在Java執行python程式碼py指令碼(可傳引數)

最近用Java寫服務端程式時,遇到這樣一個需求:需要把用python寫的機器學習演算法部署到伺服器上,然後Java執行py指令碼,並且取得演算法執行的結果。在網上找了很久,有些跑不通,有些是基於windows的,我的伺服器是linux的,遇到了不少坑= =好不容易解決了,記錄

Java執行window命令linux命令

這裡強調一點,命令中用到的jdk還有其他一些需要配置的軟體的環境變數一定要配置成全域性的,外部可以讀取的,否則java根本無法執行命令。比如linux需要配置在 /etc/profile,用source /etc/profile可以即時生效。 下面是程式碼: packag

java執行bat命令碰到的阻塞問題的解決方法

事件起因:在Java中可以執行bat檔案,有個需求需要執行bat檔案才能完成,bat命令中會生成多個檔案,在程式執行過程中我驚奇的發現,生成的檔案在到一定數量時(當時是10個)就不再增加了,這遠遠的低於我設定的數量(100個),在我關閉程式後文件的數量又開始增

Linux下使用shell指令碼自動執行指令碼檔案

一、定時複製檔案   a、在/usr/local/wfjb_web_back目錄下建立 tomcatBack.sh檔案   檔案內容: ? 1 2 #將tomcat中的應用wfjb_web 複製到 /usr/local/wfjb_web_bac

Java服務部署上linux主機及shell指令碼啟停

今天在工作中需要將自己寫的http服務端和客戶端程式碼分別打包部署上linux主機並以shell指令碼形式啟停,如下為操作流程及總結。 1,java程式打包: 選擇專案–>Export–>Runnable JAR file 2,將jar包放

linux系統crontab執行jar包的shell指令碼

-cp 和 -classpath指定類執行所依賴其他類的路徑,通常是類庫,jar包之類 window上分號“;” 分隔 linux上是分號“:”分隔。 用一點“.”代表當前路徑(例項沒有應用) /usr/java/jdk1.6.0_18/bin 是$JAVA_H

Java中通過jsch來連線遠端伺服器執行linux命令

有時候你可能需要通過程式碼來控制執行linux命令實現某些功能。 針對這類問題可以使用JSCH來實現,具體程式碼如下: public class CogradientImgFileManager{ private static final Logg