java代码操作linux

409 阅读2分钟

java调用shell的方法

public class testProcessBuilder{
    ProcessBuilder pb = new ProcessBuilder("./" + RUNNING_SHELL_FILE, param1,
                param2, param3);
      pb.directory(new File(SHELL_FILE_DIR));
      int runningStatus = 0;
      String s = null;
      try {
       Process p = pb.start();
       try {
        runningStatus = p.waitFor();
       } catch (InterruptedException e) {
       }

      } catch (IOException e) {
      
      }
      if (runningStatus != 0) {
      
      }
     
}
里面的参数意思
RUNNING_SHELL_FILE:要运行的脚本
SHELL_FILE_DIR:要运行的脚本所在的目录; 当然你也可以把要运行的脚本写成全路径。
runningStatus:运行状态,0标识正常。 详细可以看java文档。
param1, param2, param3:可以在RUNNING_SHELL_FILE脚本中直接通过1,2,$3分别拿到的参数。

直接通过系统Runtime执行.sh文件

public class RestartServer  {
    private static final Logger LOG = LoggerFactory.getLogger(RestartServer.class);
    public static void restart(){
        Process process = null;
        try {
            String p2="./script.sh restart";
            String[] pash = new String[]{"/bash/sh","-c",p2};
            process = Runtime.getRuntime().exec(p2);
            process.waitFor();
            int i = process.exitValue();
            // 0成功
            if (i==0){
                LOG.info("重启成功");
            }else {
                LOG.info("重启失败");
            }

        } catch (Exception e) {
            e.printStackTrace();
        }finally {

        }

    }
}

script.sh 里面内容是

#! /bin/bash                                                                                                                     

server_name="ccn.paas.service"
server_path="nohup java -jar -Djava.ext.dirs=$JAVA_HOME/jre/lib/ext:./:./lib:./plugins ccn.paas.service.jar > /dev/null 10240 &"




start(){
    echo "--start-"
    ($server_path) &
    pid=$(ps -ef|grep $server_name |grep -v grep |awk '{print $2}')
    if [ ! $pid ]; then
        echo "service is not exit ..."
    else
        echo "pid=$pid"
    fi
}

stop(){
    pid=$(ps -ef|grep $server_name |grep -v grep |awk '{print $2}')
    if [ ! $pid ]; then
        echo "service is not exit ..."
    else
        kill -9 $pid
    fi
}

restart(){
    pid=$(ps -ef|grep $server_name |grep -v grep |awk '{print $2}')
    if [ ! $pid ]; then
        echo "service is not exit ..."
                start
    else
        kill -9 $pid
                start
    fi
}

checkrun(){
    while true
    do
        pid=$(ps -ef|grep $server_name |grep -v grep |awk '{print $2}')
        if [[ $pid -eq 0 ]]; then
            echo "--restart-"
            start
        fi

        sleep 30s
    done
}

case $1 in
start):
    start
    ;;
stop):
    echo "--stop"
    echo $pid
    stop
    ;;
restart):
    echo "--restart"
    restart
    ;;
checkrun):
    echo "--restart"
    checkrun
    ;;
*):
    echo "error ..."
    ;;
esac

exit 0

java直接运行linux命令

  public void test(){
        Process process = null;
        try {
            String p1="kill -9 $(ps -ef|grep ccn.paas.service |grep -v grep |awk '{print $2}')";
            String [] path = new String[]{"sh","-c",p1};
            process = Runtime.getRuntime().exec( path);

            Thread.sleep(20000);
            //运行java文件
            String p2="$(nohup java -jar -Djava.ext.dirs=$JAVA_HOME/jre/lib/ext:./:./lib:./plugins ccn.paas.service.jar > /dev/null 10240 &) &";
            String[] pash = new String[]{"sh","-c",p2};
            process = Runtime.getRuntime().exec(pash);
           //创建文件命令
//         process = Runtime.getRuntime().exec(new String[]{ "/bin/sh","-c","touch /usr/local/sup8/monitoring/test.txt"});
            process.waitFor();

            System.out.println("--------------------------------------------我被执行了");
            int i = process.exitValue();
            // 0成功
            if (i==0){
                LOG.info("重启成功");
            }else {
                LOG.info("重启失败");
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

总结

String p2="$(nohup java -jar -Djava.ext.dirs=$JAVA_HOME/jre/lib/ext:./:./lib:./plugins ccn.paas.service.jar > /dev/null 10240 &) &";

String nohup java -jar -Djava.ext.dirs=$JAVA_HOME/jre/lib/ext:./:./lib:./plugins ccn.paas.service.jar > /dev/null 10240 &";

调用这两条命令时 查询运行信息时候 ps -ef|grep ccn.pass.server 查询出来的信息是

root     10600     1  0 13:28 ?        00:00:09 java -jar -Djava.ext.dirs=/usr/local/src/softinstall/jdk1.8.0_231/jre/lib/ext:./:./lib:./plugins ccn.paas.service.jar  10240 &
root     18184 18059  0 14:14 pts/0    00:00:00 grep --color=auto ccn.paas.service.jar

执行 script.sh ps -ef|grep ccn.pass.server 查询出来的信息如下 这是什么原因呢?

root     10600     1  0 13:28 ?        00:00:09 java -jar -Djava.ext.dirs=/usr/local/src/softinstall/jdk1.8.0_231/jre/lib/ext:./:./lib:./plugins ccn.paas.service.jar 10240 &
root     18184 18059  0 14:14 pts/0    00:00:00 grep --color=auto ccn.paas.service.jar

运行的java项目必须要和 .sh 文件在同一目录下 才能运行成功

用到的命令总结

#查询程序信息
ps -ef|grep ccn.pass.server
#查询程序运行程序的端口
netstat -nap | grep pid