1. 程式人生 > 其它 >Java程式呼叫linux指令碼-簡單版

Java程式呼叫linux指令碼-簡單版

技術標籤:工作技巧javashell

最近快要過年了,在研究Java程式直接呼叫linux指令碼,保障系統故障時自動重啟,雖然簡單,但還是要記錄一下,以免踩坑。

1、編寫shell指令碼

在伺服器指定目錄編寫好本次要執行的shell指令碼,如下圖。

2、編寫Java程式

本次編寫的Java程式是基於ProcessBuilder呼叫shell指令碼,可謂是非常簡單明瞭了~

示例程式碼如下:

   /**
     * java程式呼叫shell指令碼
     */
    public void autoRunShell(){
        try{
            log.info("autoRunShell start......");
            //要執行的shell指令碼命令檔案
            String command = "./test.sh";
            //要執行的命令所在目錄path
            String path = "/data/service-control/backup";
            //1.執行命令,要先切換目錄
            ProcessBuilder processBuilder = new ProcessBuilder();
            //切換目標目錄
            processBuilder.directory(new File(path));
            //新增要執行的命令
            processBuilder.command(command);
            Process ps = processBuilder.start();
            int execStatus  = ps.waitFor(); //阻塞,直到上述命令執行完,返回為0則表示執行成功
            log.info("autoRunShell execStatus:"+execStatus+",返回為0表示執行成功");
            log.info("autoRunShell stop......");
        }catch (Exception e){
            log.error("autoRunShell:error:"+e.getMessage(),e);
        }
    }

3、執行Java程式

上面編寫好了shell指令碼以及Java程式後,只需要執行Java程式,就可以達到目的了,是不是很簡單。

程式執行後的目錄截圖

PS:呼叫指令碼時如果有許可權問題的話,可通過下面的程式碼進行賦權。

賦權的程式碼:

   /**
     * java程式呼叫shell指令碼,並且附帶許可權控制
     */
    public void autoRunShellWithChmod(){
        try{
            log.info("autoRunShellWithChmod start......");
            //要執行的命令
            String command = "./test.sh";
            //要執行的命令所在目錄path
            String path = "/data/service-control/backup";
            //0.賦權:如果許可權不夠的話,需要先賦權
            ProcessBuilder processBuilder0 = new ProcessBuilder("/bin/chmod","755",command);
            processBuilder0.directory(new File(path));
            Process ps0 = processBuilder0.start();
            int chmodStatus  = ps0.waitFor(); //阻塞,直到上述命令執行完
            log.info("autoRunShellWithChmod chmodStatus:"+chmodStatus+",返回為0表示賦權成功");

            //1.執行命令,要先切換目錄
            ProcessBuilder processBuilder = new ProcessBuilder();
            //先切換目標目錄
            processBuilder.directory(new File(path));
            processBuilder.command(command);
            Process ps = processBuilder.start();
            int execStatus  = ps.waitFor(); //阻塞,直到上述命令執行完,返回為0則表示執行成功
            log.info("autoRunShellWithChmod execStatus:"+execStatus+",返回為0表示執行成功");
            log.info("autoRunShellWithChmod stop......");
        }catch (Exception e){
            log.error("autoRunShellWithChmod:error:"+e.getMessage(),e);
        }
    }

編碼不易,不喜勿噴~