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