2016-05-11 7 views
3

LEDウォールを制御するために特別な設定が必要です。悲しいことに私は本当に私が使用するプログラミング言語を変更することはできません。私の設定は次のようになります:Javaのシェルスクリプトを起動し、終了時にすべてのプロセスを破棄します

処理(いくつかの狂気のJavaフォーク...)ブートプロセス後にスケッチが開始されます。処理スケッチは、サブフォルダ(開始可能な他のスケッチとLEDウォールを制御する)のフォルダをスキャンし、Webサーバを起動します。サーバーは、スキャンされたすべてのフォルダを含むリストをレンダリングします。オン "Webサーバ"をクリックすると、選択したSketch via ProcessBuilderが起動します。処理スケッチは次のようになります。

import http.*; 
import java.util.*; 
import java.lang.*; 

SimpleHTTPServer server; 
String prog = ""; 
int ExitValue = 1; 
ProcessBuilder preparedsketch; 
Process runningsketch; 

void setup() { 
    SimpleHTTPServer.useIndexHtml = false; 
    server = new SimpleHTTPServer(this); 
    TemplateFileHandler templateHandler = new ResultFiles("index.ftl"); 
    server.createContext("", templateHandler); 
} 


class ResultFiles extends TemplateFileHandler { 
    public ResultFiles(String templateFileName) { 
    super(templateFileName); 
    } 
    void createMap() { 
    Map<String, String> params = queryToMap(); 
    if (params.containsKey("prog")) { 
     if (params.get("prog").equals(prog)) { 
     println("Has not changed"); 
     } else { 
     println("PrevProcess: " + runningsketch); 
     if (runningsketch != null) { 
      println("Killing: " + runningsketch); 
      runningsketch.destroy(); 
     } 
     prog = params.get("prog"); 
     try { 
      runningsketch = new ProcessBuilder("/Users/kessleml/dev/pixelpusher/base/processing-quit.sh", "--sketch=/Users/kessleml/dev/pixelpusher/base/sketches/pixelpusher_colourcycle_halloween", "--run").start(); 
      // runningsketch = new ProcessBuilder("/usr/local/bin/processing-java", "--force", "--sketch=" + sketchPath("sketches/" + prog + "/"), "--no-java", "--run").start(); 
     } catch (IOException ex) { 
      println(ex); 
     } 
     println("ProjChagned: " + prog); 
     println("NewProcess: " + runningsketch); 
     } 
    } 

    File files = new File(sketchPath("sketches")); 
    String[] fileslist = files.list(); 
    addVariable("files", fileslist); 
    addVariable("selectedprog", prog); 
    } 
} 

これまでの処理はすべて動作します。しかし、もちろん私は変更(私はウェブサイト上の他のスケッチをクリック)している場合は、実行中の(およびループ)スケッチを閉じたいです。問題は

runninngsketch = new ProcessBuilder("Path/To/ProcessingCLI", "--sketch=Path/To/Selected/Sketch", "--run").start();経由で選択したスケッチを起動すると、複数のプロセスが起動します。 2つのJava-子供-プロセスを起動ワンSH-プロセス:

#!/bin/sh 

# Prevents processing-java from stealing focus, see: 
# https://github.com/processing/processing/issues/3996. 
OPTION_FOR_HEADLESS_RUN="" 
for ARG in "[email protected]" 
do 
    if [ "$ARG" = "--build" ]; then 
     OPTION_FOR_HEADLESS_RUN="-Djava.awt.headless=true" 
    fi 
done 

cd "/Applications/Processing.app/Contents/Java" && /Applications/Processing.app/Contents/PlugIns/jdk1.8.0_74.jdk/Contents/Home/jre/bin/java -Djna.nosys=true $OPTION_FOR_HEADLESS_RUN -cp "ant-launcher.jar:ant.jar:core.jar:jna.jar:pde.jar:core/library/core.jar:core/library/gluegen-rt-natives-linux-amd64.jar:core/library/gluegen-rt-natives-linux-armv6hf.jar:core/library/gluegen-rt-natives-linux-i586.jar:core/library/gluegen-rt-natives-macosx-universal.jar:core/library/gluegen-rt-natives-windows-amd64.jar:core/library/gluegen-rt-natives-windows-i586.jar:core/library/gluegen-rt.jar:core/library/jogl-all-natives-linux-amd64.jar:core/library/jogl-all-natives-linux-armv6hf.jar:core/library/jogl-all-natives-linux-i586.jar:core/library/jogl-all-natives-macosx-universal.jar:core/library/jogl-all-natives-windows-amd64.jar:core/library/jogl-all-natives-windows-i586.jar:core/library/jogl-all.jar:modes/java/mode/antlr.jar:modes/java/mode/classpath-explorer-1.0.jar:modes/java/mode/com.ibm.icu.jar:modes/java/mode/JavaMode.jar:modes/java/mode/jdi.jar:modes/java/mode/jdimodel.jar:modes/java/mode/jdtCompilerAdapter.jar:modes/java/mode/jsoup-1.7.1.jar:modes/java/mode/org.eclipse.core.contenttype.jar:modes/java/mode/org.eclipse.core.jobs.jar:modes/java/mode/org.eclipse.core.resources.jar:modes/java/mode/org.eclipse.core.runtime.jar:modes/java/mode/org.eclipse.equinox.common.jar:modes/java/mode/org.eclipse.equinox.preferences.jar:modes/java/mode/org.eclipse.jdt.core.jar:modes/java/mode/org.eclipse.osgi.jar:modes/java/mode/org.eclipse.text.jar:modes/java/mode/org.netbeans.swing.outline.jar" processing.mode.java.Commander "[email protected]" 

だからProcessBuilderを使用三つのプロセスを開始します。この理由は、ProcessingCLIファイルです。 runningsketch.destroy()を使用すると、shプロセスだけが終了します。 2つのJavaプロセスは引き続き実行されます。 (最終的な製品はLinuxマシン上で動作しているので、このバグも http://bugs.java.com/bugdatabase/view_bug.do?bug_id=4770092であることは確かではありません)。

私の解決策は、すべてを殺す新しいshスクリプトを書くことでした。その子どもはtrap

#!/bin/sh 

OPTION_FOR_HEADLESS_RUN="" 

function killAllChildren { 
    kill -9 -$(ps -o pgid= $$ | grep -o '[0-9]*') 
} 

trap killAllChildren SIGTERM SIGKILL 
# trap "trap - SIGTERM && kill -- $$" SIGINT SIGTERM EXIT 

cd "/Applications/Processing.app/Contents/Java" 

/Applications/Processing.app/Contents/PlugIns/jdk1.8.0_74.jdk/Contents/Home/jre/bin/java -Djna.nosys=true $OPTION_FOR_HEADLESS_RUN -cp "ant-launcher.jar:ant.jar:core.jar:jna.jar:pde.jar:core/library/core.jar:core/library/gluegen-rt-natives-linux-amd64.jar:core/library/gluegen-rt-natives-linux-armv6hf.jar:core/library/gluegen-rt-natives-linux-i586.jar:core/library/gluegen-rt-natives-macosx-universal.jar:core/library/gluegen-rt-natives-windows-amd64.jar:core/library/gluegen-rt-natives-windows-i586.jar:core/library/gluegen-rt.jar:core/library/jogl-all-natives-linux-amd64.jar:core/library/jogl-all-natives-linux-armv6hf.jar:core/library/jogl-all-natives-linux-i586.jar:core/library/jogl-all-natives-macosx-universal.jar:core/library/jogl-all-natives-windows-amd64.jar:core/library/jogl-all-natives-windows-i586.jar:core/library/jogl-all.jar:modes/java/mode/antlr.jar:modes/java/mode/classpath-explorer-1.0.jar:modes/java/mode/com.ibm.icu.jar:modes/java/mode/JavaMode.jar:modes/java/mode/jdi.jar:modes/java/mode/jdimodel.jar:modes/java/mode/jdtCompilerAdapter.jar:modes/java/mode/jsoup-1.7.1.jar:modes/java/mode/org.eclipse.core.contenttype.jar:modes/java/mode/org.eclipse.core.jobs.jar:modes/java/mode/org.eclipse.core.resources.jar:modes/java/mode/org.eclipse.core.runtime.jar:modes/java/mode/org.eclipse.equinox.common.jar:modes/java/mode/org.eclipse.equinox.preferences.jar:modes/java/mode/org.eclipse.jdt.core.jar:modes/java/mode/org.eclipse.osgi.jar:modes/java/mode/org.eclipse.text.jar:modes/java/mode/org.netbeans.swing.outline.jar" processing.mode.java.Commander "[email protected]" 

経由で何とかしています。新しいshスクリプトを起動して、起動されたshプロセスにSIGTERMなどを送信しても、2つのJavaプロセスとshプロセスのどちらも破壊されません。

+0

'killAllChildren'関数で' = 'の後に空白を入れてはいけないと思います。すなわち、 '-o pgid = $$' – geert3

+0

これはタイプミスのようです(私はこの問題を数日から解決しようとしているので、少しコードが混乱してしまいました。とにかく、それはスペースなしで動作しません。 もう少しテストをしました。走っているshプロセスはSIGTERMに全く反応しません。私のトラップラインは機能していませんか? shプロセスにSIGKILLを送信すると、シャットダウンされますが、その子プロセスはシャットダウンしません。彼らはProcessTreeから脱落し、Orphan-Processesのように動作します。 – DonHansDampf

+0

もう一つの奇妙な現象: 'trap 'echo $$" SIGINT SIGTERM EXIT'のような単純なトラップを設定し、shプロセスをSIGTERMまたはSIGKILLしようとすると、何も起こらないか、shプロセスがトラップを実行することなく単にシャットダウンします上記のコメント)。しかし、私がSIGTERMまたはSIGKILLのいずれかのJavaプロセスを実行すると、トラップが実行され、テスト・メッセージ(PID)とJavaアプレットがシャットダウンします。私はここで何かを逃しているようです。 – DonHansDampf

答えて

1

私は解決策を見つけた:

JavaはSIGTERMシグナルを送るので、私はトラップこの信号をしなければなりませんでした。しかし、java /処理ファイルは問題ではなく、shスクリプトは意図したとおりに動作しませんでした。

私のスクリプトには& waitを追加する必要がありました。それ以外の場合、SIGTERMはトラップできません(このポストを参照:https://apple.stackexchange.com/questions/123631/why-does-a-shell-script-trapping-sigterm-work-when-run-manually-but-not-when-ru)。

また、殺害プロセスは正しく機能しませんでした。私はすべての子供たち、shスクリプト自体を殺す必要がありますが、shスクリプトの親プロセスではありません(この使用例ではウェブサーバーなど)。だから私はすべての子プロセスを見つけてそれらを殺す関数を書いた。 kill -9 -$(ps -o pgid= $$ | grep -o '[0-9]*')のようなものは、彼らが木全体を殺してからの仕事ではありませんでした。最後に、shファイルは次のようになります。

#!/bin/sh 

function killAllChildren { 
    getChild $$ 
    pkill -TERM -P $$ 
} 

function getChild() { 
    cpids=`pgrep -P $1|xargs` 
    for cpid in $cpids; 
    do 
     kill -15 $cpid 
     getChild $cpid 
    done 
} 

trap killAllChildren SIGUSR1 SIGTERM SIGKILL EXIT 

cd "/Applications/Processing.app/Contents/Java" 

/Applications/Processing.app/Contents/PlugIns/jdk1.8.0_74.jdk/Contents/Home/jre/bin/java -Djna.nosys=true -cp "ant-launcher.jar:ant.jar:core.jar:jna.jar:pde.jar:core/library/core.jar:core/library/gluegen-rt-natives-linux-amd64.jar:core/library/gluegen-rt-natives-linux-armv6hf.jar:core/library/gluegen-rt-natives-linux-i586.jar:core/library/gluegen-rt-natives-macosx-universal.jar:core/library/gluegen-rt-natives-windows-amd64.jar:core/library/gluegen-rt-natives-windows-i586.jar:core/library/gluegen-rt.jar:core/library/jogl-all-natives-linux-amd64.jar:core/library/jogl-all-natives-linux-armv6hf.jar:core/library/jogl-all-natives-linux-i586.jar:core/library/jogl-all-natives-macosx-universal.jar:core/library/jogl-all-natives-windows-amd64.jar:core/library/jogl-all-natives-windows-i586.jar:core/library/jogl-all.jar:modes/java/mode/antlr.jar:modes/java/mode/classpath-explorer-1.0.jar:modes/java/mode/com.ibm.icu.jar:modes/java/mode/JavaMode.jar:modes/java/mode/jdi.jar:modes/java/mode/jdimodel.jar:modes/java/mode/jdtCompilerAdapter.jar:modes/java/mode/jsoup-1.7.1.jar:modes/java/mode/org.eclipse.core.contenttype.jar:modes/java/mode/org.eclipse.core.jobs.jar:modes/java/mode/org.eclipse.core.resources.jar:modes/java/mode/org.eclipse.core.runtime.jar:modes/java/mode/org.eclipse.equinox.common.jar:modes/java/mode/org.eclipse.equinox.preferences.jar:modes/java/mode/org.eclipse.jdt.core.jar:modes/java/mode/org.eclipse.osgi.jar:modes/java/mode/org.eclipse.text.jar:modes/java/mode/org.netbeans.swing.outline.jar" processing.mode.java.Commander "[email protected]" & wait 
関連する問題