日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > linux >内容正文

linux

java执行linux命令

發(fā)布時(shí)間:2024/4/17 linux 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java执行linux命令 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
轉(zhuǎn):java程序中要執(zhí)行l(wèi)inux命令主要依賴2個(gè)類:Process和Runtime

首先看一下Process類:

[plain] view plaincopy
ProcessBuilder.start() 和 Runtime.exec 方法創(chuàng)建一個(gè)本機(jī)進(jìn)程,并返回 Process 子類的一個(gè)實(shí)例,?
該實(shí)例可用來控制進(jìn)程并獲得相關(guān)信息。Process 類提供了執(zhí)行從進(jìn)程輸入、執(zhí)行輸出到進(jìn)程、等待進(jìn)程完成、?
檢查進(jìn)程的退出狀態(tài)以及銷毀(殺掉)進(jìn)程的方法。?
創(chuàng)建進(jìn)程的方法可能無法針對某些本機(jī)平臺上的特定進(jìn)程很好地工作,比如,本機(jī)窗口進(jìn)程,守護(hù)進(jìn)程,Microsoft Windows?
上的 Win16/DOS 進(jìn)程,或者 shell 腳本。創(chuàng)建的子進(jìn)程沒有自己的終端或控制臺。它的所有標(biāo)準(zhǔn) io(即 stdin、stdout 和 stderr)?
操作都將通過三個(gè)流 (getOutputStream()、getInputStream() 和 getErrorStream()) 重定向到父進(jìn)程。?
父進(jìn)程使用這些流來提供到子進(jìn)程的輸入和獲得從子進(jìn)程的輸出。因?yàn)橛行┍緳C(jī)平臺僅針對標(biāo)準(zhǔn)輸入和輸出流提供有限的緩沖區(qū)大小,?
如果讀寫子進(jìn)程的輸出流或輸入流迅速出現(xiàn)失敗,則可能導(dǎo)致子進(jìn)程阻塞,甚至產(chǎn)生死鎖。?
當(dāng)沒有 Process 對象的更多引用時(shí),不是刪掉子進(jìn)程,而是繼續(xù)異步執(zhí)行子進(jìn)程。?
對于帶有 Process 對象的 Java 進(jìn)程,沒有必要異步或并發(fā)執(zhí)行由 Process 對象表示的進(jìn)程。?
特別需要注意的是:

1,創(chuàng)建的子進(jìn)程沒有自己的終端控制臺,所有標(biāo)注操作都會通過三個(gè)流

(getOutputStream()、getInputStream() 和 getErrorStream()) 重定向到父進(jìn)程(父進(jìn)程可通過這些流判斷子進(jìn)程的執(zhí)行情況)

2,因?yàn)橛行┍緳C(jī)平臺僅針對標(biāo)準(zhǔn)輸入和輸出流提供有限的緩沖區(qū)大小,如果讀寫子進(jìn)程的輸出流或輸入流迅速出現(xiàn)失敗,

則可能導(dǎo)致子進(jìn)程阻塞,甚至產(chǎn)生死鎖

[plain] view plaincopy
abstract? void destroy()??
????????? 殺掉子進(jìn)程。??
abstract? int exitValue()??
????????? 返回子進(jìn)程的出口值。根據(jù)慣例,值0表示正常終止。??
abstract? InputStream getErrorStream()??
????????? 獲取子進(jìn)程的錯(cuò)誤流。??
abstract? InputStream getInputStream()??
????????? 獲取子進(jìn)程的輸入流。??
abstract? OutputStream getOutputStream()??
????????? 獲取子進(jìn)程的輸出流。??
abstract? int waitFor()??
????????? 導(dǎo)致當(dāng)前線程等待,如有必要,一直要等到由該 Process 對象表示的進(jìn)程已經(jīng)終止。?
???? 如果已終止該子進(jìn)程,此方法立即返回。如果沒有終止該子進(jìn)程,調(diào)用的線程將被阻塞,直到退出子進(jìn)程。?
特別需要注意:如果子進(jìn)程中的輸入流,輸出流或錯(cuò)誤流中的內(nèi)容比較多,最好使用緩存(注意上面的情況2)

再來看一下Runtime類:

[plain] view plaincopy
每個(gè)Java應(yīng)用程序都有一個(gè)Runtime類實(shí)例,使應(yīng)用程序能夠與其運(yùn)行的環(huán)境相連接。可以通過getRuntime方法獲取當(dāng)前運(yùn)行時(shí)環(huán)境。??
應(yīng)用程序不能創(chuàng)建自己的Runtime類實(shí)例。??
介紹幾個(gè)主要方法:

[plain] view plaincopy
Process exec(String command)??
???????? 在單獨(dú)的進(jìn)程中執(zhí)行指定的字符串命令。?
Process exec(String command, String[] envp)??
???????? 在指定環(huán)境的單獨(dú)進(jìn)程中執(zhí)行指定的字符串命令。?
Process exec(String command, String[] envp, File dir)??
???????? 在有指定環(huán)境和工作目錄的獨(dú)立進(jìn)程中執(zhí)行指定的字符串命令。?
Process exec(String[] cmdarray)??
???????? 在單獨(dú)的進(jìn)程中執(zhí)行指定命令和變量。??
Process exec(String[] cmdarray, String[] envp)??
???????? 在指定環(huán)境的獨(dú)立進(jìn)程中執(zhí)行指定命令和變量。??
Process exec(String[] cmdarray, String[] envp, File dir)??
???????? 在指定環(huán)境和工作目錄的獨(dú)立進(jìn)程中執(zhí)行指定的命令和變量。??
command: 一條指定的系統(tǒng)命令。
envp:環(huán)境變量字符串?dāng)?shù)組,其中每個(gè)環(huán)境變量的設(shè)置格式為name=value;如果子進(jìn)程應(yīng)該繼承當(dāng)前進(jìn)程的環(huán)境,則該參數(shù)為null。
dir:子進(jìn)程的工作目錄;如果子進(jìn)程應(yīng)該繼承當(dāng)前進(jìn)程的工作目錄,則該參數(shù)為null。
cmdarray:包含所調(diào)用命令及其參數(shù)的數(shù)組。
以下為示例(要打成可執(zhí)行jar包扔到linux下執(zhí)行):

[java] view plaincopy
public class test {?
??? public static void main(String[] args){?
??????? InputStream in = null;?
??????? try {?
??????????? Process pro = Runtime.getRuntime().exec(new String[]{"sh",?
???????????????????????????????????? "/home/test/test.sh","select admin from M_ADMIN",?
???????????????????????????????????? "/home/test/result.txt"});?
??????????? pro.waitFor();?
??????????? in = pro.getInputStream();?
??????????? BufferedReader read = new BufferedReader(new InputStreamReader(in));?
??????????? String result = read.readLine();?
??????????? System.out.println("INFO:"+result);?
??????? } catch (Exception e) {?
??????????? e.printStackTrace();?
??????? }?
??? }?
}?
在這用的是Process exec(String[] cmdarray)這個(gè)方法
/home/test/test.sh腳本如下:

[plain] view plaincopy
#!/bin/sh?
?
#查詢sql?
SQL=$1?
#查詢結(jié)果保存文件?
RESULT_FILE=$2?
#數(shù)據(jù)庫連接?
DB_NAME=scott?
DB_PWD=tiger?
DB_SERVER=DB_TEST?
?
RESULT=`sqlplus -S ${DB_NAME}/${DB_PWD}@${DB_SERVER}<< !??
set heading off?
set echo off?
set pages 0?
set feed off?
set linesize 3000?
${SQL}?
/?
commit?
/?
!`?
?????
echo "${RESULT}" >> ${RESULT_FILE}?
echo 0;?
[img][/img][url][/url][flash=200,200][/flash]
?
引用

轉(zhuǎn)載于:https://www.cnblogs.com/shhaoran/archive/2013/02/17/2924412.html

總結(jié)

以上是生活随笔為你收集整理的java执行linux命令的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。