In diesem Artikel wird hauptsächlich die Methode zum Ausführen von Java-Programm-JAR über ein Shell-Skript vorgestellt. Jetzt werde ich es mit Ihnen teilen und als Referenz verwenden. Folgen wir dem Editor und werfen wir einen Blick darauf
Bei der Bereitstellung von Projekten auf UBuntu starten wir das Programm häufig über eine Shell oder rufen das Java-Programm sogar regelmäßig über die geplante Crontab-Aufgabe auf, aber es gibt ein sehr seltsames Problem Ich habe zum Beispiel das folgende Shell-Skript geschrieben:
#!/bin/sh export mypath=/root/project/wishnomal java -Xmx3000m -Xms3000m -server -d64 -Dfile.encoding=UTF-8 -Dfetch.threads=300 -classpath $mypath/:$mypath/wish2-assembly-1.0.0.jar newstandard.CrawlerNewStandard $* echo "END"
Wenn Sie das Skript manuell über die Befehlszeile ausführen, können Sie das Java-Programm normal ausführen, aber Verwenden Sie die geplante Crontab-Aufgabe, sie scheint keine Wirkung zu haben
Analyse möglicher Gründe:
1) Ob der aktuelle Benutzer keine ausführbaren Berechtigungen für dieses Shell-Skript hat, übergeben Sie ls -lrt / apps/service/mtk/checking/ Run.sh prüft, ob das Skript ausführbar ist, verfügt jedoch über die Ausführungsberechtigung – rwxr-xr-x
2) Da die alleinige Ausführung des Skripts kein Problem darstellt, ist es ein Timing Ausgabe? Also habe ich ein einfaches Ausgabe-Shell-Skript geschrieben und es gab zeitlich keine Probleme. Das Problem liegt immer noch am Skript.
Später habe ich online nachgeschaut und dachte, es könnten die Umgebungsvariablen im Skript sein, denn wenn das Skript über crontab ausgeführt wird, wird der Root-Benutzer anstelle des aktuellen Benutzers verwendet, also habe ich zur Überprüfung die Datei /etc/profile verwendet Die Umgebungsvariablen und dann ändern Sie sie wie folgt:
Analyse möglicher Gründe:
1) Überprüfen Sie über ls, ob der aktuelle Benutzer keine ausführbaren Berechtigungen für dieses Shell-Skript hat -lrt /apps/service/mtk/checking/run.sh Das Skript ist ausführbar, verfügt aber über die Ausführungsberechtigung -rwxr-xr-x
2) Da es kein Problem darstellt, das Skript alleine auszuführen, oder? ein Timing-Problem? Also habe ich ein einfaches Ausgabe-Shell-Skript geschrieben und es gab zeitlich keine Probleme. Das Problem liegt immer noch am Skript.
Später habe ich online nachgeschaut und dachte, es könnten die Umgebungsvariablen im Skript sein, denn wenn das Skript über crontab ausgeführt wird, wird der Root-Benutzer anstelle des aktuellen Benutzers verwendet, also habe ich zur Überprüfung die Datei /etc/profile verwendet Die Umgebungsvariablen und dann ändern Sie sie wie folgt:
#!/bin/sh export mypath=/root/project/wishnomal export JAVA_HOME=/root/lib/jdk1.7.0_72 PATH=$PATH:$JAVA_HOME/bin java -Xmx3000m -Xms3000m -server -d64 -Dfile.encoding=UTF-8 -Dfetch.threads=300 -classpath $mypath/:$mypath/wish2-assembly-1.0.0.jar newstandard.CrawlerNewStandard $* echo "END"
Export zeigt die als Benutzerumgebungsvariablen exportierten
an Auf diese Weise sind die von Crontab geplanten Aufgaben normal.
Änderungsreferenz:
#!/bin/sh # ----------------------------------------------------------------------------- # Start script for the CMGP BOSSCONTROL # # $Id: run_bosscontrol.sh,v 1.0 2007/11/06 Exp $ # ----------------------------------------------------------------------------- #指定字符集 LANG=zh_CN.GBK export LANG RUN_HOME=. CLASSPATH=$CLASSPATH:$RUN_HOME/lib/checking.jar CLASSPATH=$CLASSPATH:$RUN_HOME/lib/ojdbc14.jar CLASSPATH=$CLASSPATH:$RUN_HOME/lib/commons-dbutils-1.1.jar CLASSPATH=$CLASSPATH:$RUN_HOME/lib/log4j-1.2.14.jar CLASSPATH=$CLASSPATH:$RUN_HOME/lib/dom4j-1.6.jar export CLASSPATH java com.**.checking.Checking_Start >> log.out &
Wenn Sie das Skript manuell über die Befehlszeile ausführen, können Sie das Java-Programm normal ausführen, jedoch mit crontab geplant Aufgaben, es scheint, dass es nicht mehr funktioniert. Ich bin sehr deprimiert. Überprüfen Sie den Grund und analysieren Sie die möglichen Gründe:
1) Ob der aktuelle Benutzer keine ausführbaren Berechtigungen für dieses Shell-Skript hat, verwenden Sie ls -lrt /apps/service/mtk/checking /run.sh zeigt an, dass das Skript ausführbar ist, aber über die Ausführungsberechtigung verfügt -rwxr-xr-x
2) Da es kein Problem gibt, das Skript alleine auszuführen , ist es ein Timing-Problem? Also habe ich ein einfaches Ausgabe-Shell-Skript geschrieben und es gab zeitlich keine Probleme. Das Problem liegt immer noch am Skript.
Später habe ich online nachgeschaut und dachte, es könnten die Umgebungsvariablen im Skript sein, denn wenn das Skript über crontab ausgeführt wird, wird der Root-Benutzer anstelle des aktuellen Benutzers verwendet, also habe ich zur Überprüfung die Datei /etc/profile verwendet die Umgebungsvariablen und ändern Sie sie dann wie folgt:
#!/bin/sh # ----------------------------------------------------------------------------- # Start script for the CMGP BOSSCONTROL # # $Id: run_bosscontrol.sh,v 1.0 2007/11/06 Exp $ # ----------------------------------------------------------------------------- export PATH=/apps/usr/java/jdk1.5/bin:$PATH export JAVA_HOME=/apps/usr/java/jdk1.5 export JRE_HOME=/apps/usr/java/jdk1.5/jre export CLASSPATH=/apps/usr/java/jdk1.5/lib:/apps/usr/java/jdk1.5/jre/lib:$CLASSPATH RUN_HOME=/apps/service/checking CLASSPATH=$CLASSPATH$RUN_HOME/lib/checking.jar CLASSPATH=$CLASSPATH:$RUN_HOME/lib/ojdbc14.jar CLASSPATH=$CLASSPATH:$RUN_HOME/lib/commons-dbutils-1.1.jar CLASSPATH=$CLASSPATH:$RUN_HOME/lib/log4j-1.2.14.jar CLASSPATH=$CLASSPATH:$RUN_HOME/lib/dom4j-1.6.jar export CLASSPATH=$CLASSPATH java com.**.checking.Checking_Start >> log.out &
export zeigt die als Benutzerumgebungsvariablen exportierten Umgebungsvariablen an
Das obige JAR-Paket wird über das Eclipse-Tool exportiert. Der Export enthält nicht die MANIFEST.MF-Datei. Wenn Sie das Verpackungstool Ant verwenden, können wir Class-Path
in der Standard-Build.xml festlegen Datei und fügen Sie das Drittanbieter-JAR-Paket zur Datei manifest.mf hinzu, geben Sie die Programmhauptklasse
an und fügen Sie den folgenden Inhalt in build.xml hinzu:
<!-- create a property containing all .jar files, prefix lib/, and seperated with a space --> <pathconvert property="libs.project" pathsep=" "> <mapper> <chainedmapper> <!-- remove absolute path --> <flattenmapper /> <!-- add lib/ prefix --> <globmapper from="*" to="lib/*" /> </chainedmapper> </mapper> <path> <!-- lib.home contains all jar files, in several subdirectories --> <fileset dir="${lib.dir}"> <include name="**/*.jar" /> </fileset> </path> </pathconvert>
Fügen Sie außerdem beim Erstellen der Manifestdatei Folgendes hinzu:
<!-- 这样就可以将第三方jar包加入 --> <attribute name="Class-Path" value="${libs.project}" /> <!-- 程序运行的主类 --> <attribute name="Main-Class" value="com.**.checking.Checking_Start " />
Führen Sie den Inhalt von MANIFEST.MF wie folgt aus Das resultierende JAR-Paket lautet wie folgt:
Manifest-Version: 1.0 Ant-Version: Apache Ant 1.7.0 Created-By: 1.5.0_09-b01 (Sun Microsystems Inc.) Implementation-Title: fee task Implementation-Version: 1.0 Implementation-Vendor: Aspire Main-Class: com.aspire.cmgp.flowcontrol.server.FlowControlServer Class-Path: lib/cmgp-util-1.0.1.jar lib/commons-codec-1.3.jar lib/comm ons-collections.jar lib/commons-dbcp-1.2.1.jar lib/commons-httpclient .jar lib/commons-logging.jar lib/commons-pool-1.2.jar lib/dom4j.jar l ib/log4j.jar lib/ojdbc14.jar
Auf diese Weise ist es nicht erforderlich, das vom Programm benötigte JAR-Paket im Shell-Skript anzugeben, und Es gibt kein lästiges Problem beim Festlegen von Umgebungsvariablen. So funktionieren die formelleren.
Führen Sie einfach das JAR-Paket direkt in der Shell aus: java -jar main program.jar -Xmx1024m -Xms1024m -Xmn512m,
Append
source /etc/profilesource ~/.bash_profile
#! /bin/sh export JAVA_HOME=/usr/java/jdk1.6.0_18 export CLASSPATH=.:${JAVA_HOME}/lib/dt.jar:${JAVA_HOME}/lib/tools.jar for i in lib/*.jar; do CLASSPATH=$i:${CLASSPATH} done export CLASSPATH=.:${CLASSPATH}java -cp ${CLASSPATH} Der Paketname, in dem sich die Hauptmethode befindet. Der Klassenname, in dem sich die Hauptmethode befindet.
Das obige ist der detaillierte Inhalt vonDas Shell-Skript implementiert die Methode zum Ausführen des Java-Programms jar. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!