私はシェルサーブレットscript.sh
をjavaサーブレットと手作業の両方で実行する必要があります。その内容は次のとおりです。Javaサーブレット内で実行されるシェルスクリプトファイルでスリープが必要な理由
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
が返すwould'tが、一度起動稼働し続け、私は他のサービスを公開する必要があるので、末尾の&を削除することができません。
そして、サーブレットは次のとおりです。
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
命令が必要なのでしょうか?そのため、後続&
の
シェルスクリプトが 'のavahi-publish'のために(最後に&注意)バックグラウンド・プロセスが開始されているので、スクリプトは'のavahi-publish'が終了する前でも終了します。 – learningloop
@learningloop返信ありがとうございます。しかし、avahi-publishプロセスは 'ps aux'の結果で見つけることができます。 –
多分/ dev/nullへのリダイレクトを削除して、エラーメッセージが出力されていないかどうかを確認してください。 –