簡體   English   中英

Linux-通過Shell腳本運行jar文件時的IO異常

[英]Linux - IO exceptions when running jar file through shell script

我正在使用Debain 8.0-jessie(64位)。

當我嘗試通過Shell腳本從其目錄外部運行jar文件時,出現了IO異常。

目錄:“ / home / rscedit”

文件:“數據(目錄)”“ run.sh(文件)”“ Webserver.jar(文件)”

當我嘗試從“ / home / rscedit”之外的任何地方運行“ run.sh”時,我的jar文件中遇到IO異常。

但是,如果我嘗試從“ / home / rscedit”運行“ run.sh”,它將運行得很好。

我想在啟動時運行Shell腳本,因此我應該能夠從“ / home / rscedit”外部運行外殼腳本,對嗎?

Shell腳本

#!/bin/sh
java -jar -Xmx20480m /home/rscedit/Webserver.jar
read –n1

我執行Shell腳本時收到的錯誤

java.nio.file.NoSuchFileException: ./data/log/ipn.log.lck
        at sun.nio.fs.UnixException.translateToIOException(UnixException.java:86)
        at sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:102)
        at sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:107)
        at sun.nio.fs.UnixFileSystemProvider.newFileChannel(UnixFileSystemProvider.java:177)
        at java.nio.channels.FileChannel.open(FileChannel.java:287)
        at java.nio.channels.FileChannel.open(FileChannel.java:335)
        at java.util.logging.FileHandler.openFiles(FileHandler.java:459)
        at java.util.logging.FileHandler.<init>(FileHandler.java:326)
        at org.displee.utilities.logging.LogFactory.loadFileLogger(LogFactory.java:44)
        at org.displee.utilities.logging.LogFactory.<clinit>(LogFactory.java:19)

LogFactory.java

package org.displee.utilities.logging;

import java.io.IOException;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.logging.*;

public class LogFactory {

    private static final String FORMAT = "%1$td-%1$tm-%1$tY %1$tH:%1$tM:%1$tS %4$s %2$s - %5$s%6$s%n";

    private static final Map<String, Logger> MAP = new HashMap<>();

    static {
        try {
            loadFileLogger("ipn", "./data/log/ipn.log");
            loadFileLogger("error", "./data/log/error.log");

            Logger logger = Logger.getLogger("console");
            logger.setUseParentHandlers(false);
            ConsoleHandler ch = new ConsoleHandler();
            ch.setFormatter(new ConsoleFormatter());
            ch.setLevel(Level.ALL);
            logger.addHandler(ch);
            register(logger.getName(), logger);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static void register(String name, Logger logger) {
        MAP.putIfAbsent(name, logger);
    }

    public static Logger get(String name) {
        return MAP.get(name);
    }

    private static Logger loadFileLogger(String name, String path) throws IOException {
        Logger logger = Logger.getLogger(name);
        FileHandler fh = new FileHandler(path, true);
        fh.setFormatter(new ConsoleFormatter());
        logger.addHandler(fh);
        logger.setUseParentHandlers(false);
        register(name, logger);
        return logger;
    }

    private static class ConsoleFormatter extends Formatter {
        @Override
        public synchronized String format(LogRecord record) {
            Date date = new Date();
            date.setTime(record.getMillis());
            String source;
            if (record.getSourceClassName() != null) {
                source = record.getSourceClassName();
                if (record.getSourceMethodName() != null) {
                    source += " " + record.getSourceMethodName();
                }
            } else {
                source = record.getLoggerName();
            }
            String message = formatMessage(record);
            String throwable = "";
            if (record.getThrown() != null) {
                StringWriter sw = new StringWriter();
                PrintWriter pw = new PrintWriter(sw);
                pw.println();
                record.getThrown().printStackTrace(pw);
                pw.close();
                throwable = sw.toString();
            }
            return String.format(FORMAT,
                    date,
                    source,
                    record.getLoggerName(),
                    "LOG",
                    message,
                    throwable);
        }
    }

}

我用來執行Shell腳本的命令

exec /home/rscedit/run.sh

編輯:我的數據圖不僅包含日志文件,還包含其他內容,例如網站文件。

您的Java程序似乎對工作目錄敏感。 我知道的最簡單的解決方案,更改此

java -jar -Xmx20480m /home/rscedit/Webserver.jar

(cd /home/rscedit ; java -jar -Xmx20480m Webserver.jar)

或者 ,更改Java,這(以及所有您擁有模式的地方)

loadFileLogger("ipn", "./data/log/ipn.log");
loadFileLogger("error", "./data/log/error.log");

類似於(使其相對於$HOME ),

loadFileLogger("ipn", new File(System.getProperty("user.home"), 
        "data/log/ipn.log").getPath());
loadFileLogger("error", new File(System.getProperty("user.home"), 
        "data/log/error.log").getPath());

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM