java 调用 script_Java如何调用script

本文探讨在Java中调用各种脚本(如shell、perl、python等)的方法,除了常用的Runtime.getRuntime().exec(cmd),还针对多脚本任务调度给出解决办法,包括开启服务端接受脚本、客户端接受服务端返回消息以及执行脚本的具体实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在Java 中如何调用各种脚本(shell,perl,python...)? 我们肯定会想到使用 Runtime.getRuntime().exec(cmd). 不过实际中根据需求会有更多更复杂的处理。 当有很多的脚本需要任务调度, 现在粗略给出一种解决办法 。

1. 开启一个服务端(单独的线程)专门来接受脚本

public class ScriptRunnerService {

private static int port = 4444;

public static void main(String[] args) {

ScriptRunnerService srs = new ScriptRunnerService();

String hostIp = args[0];

String hostPort = args[1];

srs.go(hostIp, hostPort);

}

public void go(String hostIp, String hostPort) {

try {

ServerSocket listener = new ServerSocket(Integer.valueOf(hostPort), 0, InetAddress.getByName(hostIp));

Socket clientSocket;

while (true) {

clientSocket = listener.accept();

Thread t = new Thread(new ServiceRunner(clientSocket));

t.start();

}

} catch (IOException ioe) {

System.out.println("IOException on socket listen: " + ioe);

} finally {

}

}

class ServiceRunner implements Runnable {

private Socket clientSocket;

ServiceRunner(Socket clientSocket) {

this.clientSocket = clientSocket;

}

@Override

public void run() {

int result = 1;

String line;

StringBuilder command = new StringBuilder();

BufferedReader br = null;

BufferedWriter bw = null;

try {

System.out.print("command receiving...");

br = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));

if ((line = br.readLine()) != null) {

command.append(line);

}

bw = new BufferedWriter(new OutputStreamWriter(clientSocket.getOutputStream()));

System.out.println(command);

Process p = Runtime.getRuntime().exec(command.toString());

result = p.waitFor();

p.destroy();

write(bw, command.toString() + "\r\n");

} catch (InterruptedException ie) {

write(bw, ie.getMessage() + "\r\n");

} catch (IOException ioe) {

write(bw, ioe.getMessage() + "\r\n");

} finally {

write(bw, "..Result.." + result + "\r\n");

write(bw, "..Command.." + command.toString() + "\r\n");

write(bw, "Host...." + clientSocket.getInetAddress().getHostAddress() + "\r\n");

try {

clientSocket.close();

} catch (IOException ioe) {

ioe.printStackTrace();

}

System.out.println("\t\tcommand finished with result: " + result);

}

}

}

private void write(BufferedWriter bw, String msg) {

try {

bw.write(msg);

bw.flush();

} catch (IOException ioe) {

ioe.printStackTrace();

}

}

}

public class AppInitializer{

public void execScriptService(){

String[] envParams = {"java -cp";, completeClasspath, ScriptRunnerService.class.getName(),“127.0.0.1”,“4445”};

ScriptRunnerService scriptRunnerProcess = Runtime.getRuntime().exec(envParams);

}

2. 客户端专门接受服务端的返回消息

public class SocketTransport {

protected Logger log = new Logger(SocketTransport.class.getName());

public String query(String host, int port, String queryString) throws IOException {

String line;

BufferedReader rd = null;

BufferedWriter wr = null;

Socket serverSocket = null;

StringBuilder response = new StringBuilder();

try {

serverSocket = new Socket(InetAddress.getByName(host), port);

wr = new BufferedWriter(new OutputStreamWriter(serverSocket.getOutputStream(), "UTF8"));

log.warn("sending request: %s to %s:%s ", queryString, host, port);

wr.write(queryString + "\r\n");

wr.flush();

rd = new BufferedReader(new InputStreamReader(serverSocket.getInputStream()));

while ((line = rd.readLine()) != null) {

response.append(line);

}

} catch (UnknownHostException e) {

log.error(e);

throw new IOException(e);

} finally {

IOUtils.closeQuietly(wr);

IOUtils.closeQuietly(rd);

if (serverSocket != null) {

serverSocket.close();

}

}

log.warn("finish request: ", queryString);

return response.toString();

}

}

3.  执行脚本

public class ScriptTest {

public static void execute(String path , String script, String param) throws IOException, InterruptedException{

if(...){

SocketTransport st = new SocketTransport();

String msg = st.query("127.0.0.1", 4445, "java -version");

System.out.println(msg);

else{

Process p = Runtime.getRuntime().exec(path + script + params);

System.out.println("Executing for "+type+": " + path + script + params);

p.waitFor();

p.destroy();

}

}

}

分享到:

18e900b8666ce6f233d25ec02f95ee59.png

72dd548719f0ace4d5f9bca64e1d7715.png

2012-05-16 16:25

浏览 1365

评论

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值