0

script.shJava サーブレットと手動の両方で実行する必要があるシェル スクリプトがあります。その内容は次のとおりです。

service avahi-daemon restart
instance=MyInstance
avahi-publish -s -d local $instance _temp._tcp 443 "model=Model1"  > /dev/null 2>&1 &
# update: publish other services.

更新: 末尾の & を削除することはできません。これは、がavahi-publish返されないためですが、開始すると実行され続け、他のサービスを公開する必要があるためです。

サーブレットは次のとおりです。

public class DefaultServlet extends HttpServlet{

    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) {
        try {
            Process process = Runtime.getRuntime().exec("bash script.sh");
            process.waitFor();
        }catch (Exception ex) {
            System.out.println(ex.getMessage());
            ex.printStackTrace();
        }
    }
}

問題は、サーブレットがブラウザーでアクセスされた場合、サービス MyInstance が公開されないことです。しかしsleep 0.1s、スクリプトファイルに追加すると解決します。

私の質問は、Runtime.exec() に魔法があり、なぜsleep命令が必要なのかということです。

4

2 に答える 2

-1

最後に、ProcessBuilder が役立つことがわかりました。ここに私の疑似コードがあります:

protected void service(HttpServletRequest request, HttpServletResponse response) {
    new HandlerThread("avahi-publish","-s","-d", "local","MyInstance", "_https._tcp",
     "443","model=abc")
    .start();
}

private static class HandlerThread extends Thread {
    Process process;

    HandlerThread(String... args) {
        ProcessBuilder processBuilder = new ProcessBuilder(args);
        process = processBuilder.start();
    }

    public void run() {
         StringBuilder stringBuilder = new StringBuilder();

        try {
            process.waitFor();
            readStream(process.getInputStream(),stringBuilder);
            readStream(process.getErrorStream(),stringBuilder);
        }catch( IOException|InterruptedException ioe){
            System.out.println(ioe.getMessage());
        }
        System.out.println(stringBuilder);
    }
    private static String readStream(InputStream inputStream, StringBuilder sb) throws IOException {
        BufferedReader br = null;
        try {
            br = new BufferedReader(new InputStreamReader(inputStream));
            String line = null;
            while ((line = br.readLine()) != null) {
                sb.append(line);
                sb.append('\n');
            }
        } finally {
            if(br!=null) br.close();
        }
        return sb.toString();
    }
}
于 2016-11-01T08:33:29.887 に答える