前提:
java代碼是在windows下面寫的,要打包放到linux下面運(yùn)行,并且執(zhí)行某個(gè)腳本。
java代碼:
try {
// 起作用的代碼其實(shí)就下面這一行, 參數(shù)是linux中要執(zhí)行的代碼 Runtime.getRuntime().exec("sh generator.sh").waitFor(); } catch (IOException e) { e.printStackTrace(); } catch (InterruptedException e) { e.printStackTrace(); }
轉(zhuǎn)自:https://www.cnblogs.com/tohxyblog/p/6501396.html
c. 使用腳本調(diào)用別的腳本,比如有三個(gè)腳本:run1.sh,run2.sh,run3.sh,假設(shè)這三個(gè)腳本都使用了cat、grep等命令,那么它們直接放在crontab中是不會(huì)被成功執(zhí)行的,這時(shí)候我們可以寫個(gè)run.sh,在run.sh中調(diào)用run1.sh,run2.sh,run3.sh,這樣就不需要考慮export環(huán)境變量的問題,因?yàn)閞un.sh并沒有使用系統(tǒng)命令,而run.sh調(diào)用run1.sh的時(shí)候已經(jīng)不是crontab在管理了,所以會(huì)讀取用戶的環(huán)境變量。com對象就是一些具有特定函數(shù)功能項(xiàng)程序模塊,他們一般以ocx或者dll作為擴(kuò)展名,你只要找到包含有你需要的功能的模塊文件,并在腳本中規(guī)范的引用,就可以實(shí)現(xiàn)特定的功能,也就是說vbs腳本就是調(diào)用現(xiàn)成的“控件”作為對象,用對象的屬性和方法實(shí)現(xiàn)目的,完全免去了編寫代碼、設(shè)計(jì)算法等麻煩。我這樣理解,com對象就是一些具有特定函數(shù)功能項(xiàng)程序模塊,他們一般以ocx或者dll作為擴(kuò)展名,你只要找到包含有你需要的功能的模塊文件,并在腳本中規(guī)范的引用,就可以實(shí)現(xiàn)特定的功能,也就是說vbs腳本就是調(diào)用現(xiàn)成的“控件”作為對象,用對象的屬性和方法實(shí)現(xiàn)目的,完全免去了編寫代碼、設(shè)計(jì)算法等等麻煩。
深入:
Process的幾種方法
1、destroy():殺掉子進(jìn)程
2、exitValue():返回子進(jìn)程的出口值,值0表示正常終止
3、getErrorStream():獲取子進(jìn)程的錯(cuò)誤流
4、getInputStream():獲取子進(jìn)程的輸入流
5、getOutputStream():獲取子進(jìn)程的輸出流
6、waitFor():導(dǎo)致當(dāng)前線程等待,如有必要,一直要等到由該P(yáng)rocess對象表示的進(jìn)程已經(jīng)終止。如果已終止該子進(jìn)程,此方法立即返回。如果沒有終止該子進(jìn)程,調(diào)用的線程將被阻塞,知道退出子進(jìn)程,根據(jù)管理,0表示正常終止。
注意:在Java中,調(diào)用runtime線程執(zhí)行腳本是非常消耗資源的,所以切記不要頻繁使用!
c. 使用腳本調(diào)用別的腳本,比如有三個(gè)腳本:run1.sh,run2.sh,run3.sh,假設(shè)這三個(gè)腳本都使用了cat、grep等命令linux命令,那么它們直接放在crontab中是不會(huì)被成功執(zhí)行的,這時(shí)候我們可以寫個(gè)run.sh,在run.sh中調(diào)用run1.sh,run2.sh,run3.sh,這樣就不需要考慮export環(huán)境變量的問題,因?yàn)閞un.sh并沒有使用系統(tǒng)命令,而run.sh調(diào)用run1.sh的時(shí)候已經(jīng)不是crontab在管理了,所以會(huì)讀取用戶的環(huán)境變量。式的前一部分是對時(shí)間的設(shè)定,后面一部分是要執(zhí)行的命令,如果要執(zhí)行的命令太多,可以把這些命令寫到一個(gè)腳本里面,然后在這里直接調(diào)用這個(gè)腳本就可以了,調(diào)用的時(shí)候記得寫出命令的完整路徑。構(gòu)造handlerthread類的對象mhandlerthread,這樣生成一個(gè)子線程可以調(diào)用new myhandler(mhandlerthread.getlooper())來獲取子線程的handler,另一個(gè)子線程發(fā)消息,收到消息的就是子線程而不是主線程了。
所以兩個(gè)線程訪問同一塊資源時(shí),需要考慮線程同步問題,即其中一個(gè)線程操作改資源時(shí),其他線程不能訪問該資源,只能等待linux命令,該線程執(zhí)行結(jié)束之后,其他線程才能對該資源進(jìn)行訪問。并增加以下命令:等待線程,強(qiáng)制結(jié)束線程,關(guān)閉線程句柄。并增加以下命令:等待線程, 強(qiáng)制結(jié)束線程, 關(guān)閉句柄。
private static Process p = null; p = Runtime.getRuntime().exec("notepad.exe"); p.waitFor(); System.out.println("---------------我被執(zhí)行了");
以上代碼中,打開windows中記事本,如果我們不手動(dòng)關(guān)閉記事本,那么輸出語句就不會(huì)執(zhí)行,這點(diǎn)事需要理解的。