Centos java standalone service - boot on start

本文介绍了一个用于启动和管理Web应用程序守护进程的shell脚本实现,包括如何通过cron任务自动启动该守护进程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

假设我们已经有一个web应用的standalone jar包:hello.jar

在命令行启动:java -jar hello.jar

我们先暂时把hello.jar放在了根目录下


Money see,Monkey do


模仿crond,注意/etc/init.d/hello需要可执行权限



1. /etc/init.d/hello

#!/bin/sh
#
# hello          Start/Stop the hello daemon.
#
# chkconfig: 2345 95 20
# description: hello api server

### BEGIN INIT INFO
# Provides: hello thoughtworks
# Required-Start: $local_fs $syslog
# Required-Stop: $local_fs $syslog
# Default-Start:  2345
# Default-Stop: 95
# Short-Description: run hello api daemon
# Description: hello api server
### END INIT INFO


[ -f /etc/sysconfig/hello ] || {
    [ "$1" = "status" ] && exit 4 || exit 6
}


RETVAL=0
prog="hello"
exec=/usr/sbin/hello
lockfile=/var/lock/subsys/hello
config=/etc/sysconfig/hello


# Source function library.
. /etc/rc.d/init.d/functions


[ -e /etc/sysconfig/$prog ] && . /etc/sysconfig/$prog


start() {
    if [ $UID -ne 0 ] ; then
        echo "User has insufficient privilege."
        exit 4
    fi
    [ -x $exec ] || exit 5
    [ -f $config ] || exit 6
    echo -n $"Starting $prog: "
    daemon $prog $HELLOARGS
    retval=$?
    echo
    [ $retval -eq 0 ] && touch $lockfile
}


stop() {
    if [ $UID -ne 0 ] ; then
        echo "User has insufficient privilege."
        exit 4
    fi
    echo -n $"Stopping $prog: "
    if [ -n "`pidfileofproc $exec`" ]; then
        killproc $exec
        RETVAL=3
    else
        failure $"Stopping $prog"
    fi
    retval=$?
    echo
    [ $retval -eq 0 ] && rm -f $lockfile
}


restart() {
    stop
    start
}


reload() {
    echo -n $"Reloading $prog: "
    if [ -n "`pidfileofproc $exec`" ]; then
        killproc $exec -HUP
    else
        failure $"Reloading $prog"
    fi
    retval=$?
    echo
}


force_reload() {
    # new configuration takes effect after restart
    restart
}


rh_status() {
    # run checks to determine if the service is running or use generic status
    status -p /var/run/hello.pid $prog
}


rh_status_q() {
    rh_status >/dev/null 2>&1
}




case "$1" in
    start)
        rh_status_q && exit 0
        $1
        ;;
    stop)
        rh_status_q || exit 0
        $1
        ;;
    restart)
        $1
        ;;
    reload)
        rh_status_q || exit 7
        $1
        ;;
    force-reload)
        force_reload
        ;;
    status)
        rh_status
        ;;
    condrestart|try-restart)
        rh_status_q || exit 0
        restart
        ;;
    *)
        echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload}"
        exit 2
esac
exit $?



2./usr/sbin/hello

/usr/bin/java -jar /hello.jar 1>/dev/null  2>&1 </dev/null &


3./etc/sysconfig/hello

# Settings for the CRON daemon.
# HELLOARGS= :  any extra command-line startup arguments for hello

HELLOARGS=



配置start on boot

/sbin/chkconfig --add hello

/sbin/chkconfig hello on


<think>好的,我需要解决用户的问题:如何在Docker CentOS7环境中使用documents4j(Java JDK1.8)将Word转换为PDF。首先,我得回顾一下用户提供的引用内容,看看有没有相关的线索。 用户提到了引用[3],其中提到在Docker镜像中集成libreoffice来实现Word转PDF,但用户现在想用documents4j。documents4j通常需要一个MS Office的后端,这在Linux下可能不太适用,不过用户可能已经考虑过替代方案。或者可能用户希望结合documents4j和libreoffice?不过documents4j默认依赖MS Office,这点需要注意。 接下来,我需要确保Dockerfile中正确配置JDK8。根据引用[1],用户之前遇到ENV配置不生效的问题,主要是少了CLASSPATH的设置,所以在Dockerfile里需要正确设置环境变量,包括JAVA_HOME和CLASSPATH。这可能需要在安装JDK后设置这些变量。 然后,用户需要在CentOS7的Docker环境中安装documents4j所需的依赖。documents4j可能需要一些本地库或者服务,比如可能需要运行一个本地的转换服务,或者需要安装一些软件包。例如,如果documents4j依赖libreoffice,那么需要像引用[3]那样安装libreoffice到镜像中。不过需要确认documents4j是否支持libreoffice作为后端,或者是否需要其他配置。 另外,用户可能需要处理文档转换时的字体问题,安装中文字体支持,避免转换后的PDF出现乱码。这可能需要安装fontconfig和相关的字体包。 然后,构建Docker镜像时,需要将documents4j的依赖添加到项目中,可能通过Maven或Gradle引入,并确保在镜像构建过程中正确打包应用。同时,可能需要暴露相应的端口或配置卷来传递文件。 测试环节也很重要,需要确保在容器内能够成功执行转换,可能需要运行一个简单的Java程序来测试documents4j的功能,并处理可能的错误,比如权限问题或依赖缺失。 最后,用户可能关心如何优化镜像大小,比如清理缓存和临时文件,使用多阶段构建等,但根据用户的问题,这可能不是主要需求,但可以作为建议提到。 总结步骤可能包括: 1. 创建Dockerfile,基于CentOS7。 2. 安装JDK8,正确设置环境变量。 3. 安装documents4j所需的依赖,如libreoffice或其他工具。 4. 安装中文字体支持。 5.Java应用打包到镜像中。 6. 构建并运行容器,测试转换功能。 需要确保所有步骤的Docker指令正确,比如使用yum安装软件包,处理依赖关系,设置环境变量,复制项目文件等。同时,参考引用中的示例,如引用[2]中的Dockerfile编写方法,引用[4]的镜像上传方法可能不相关,但需要注意私有仓库的使用是否需要,但用户当前问题可能不需要。 可能遇到的问题包括:documents4j在Linux下的兼容性,是否需要MS Office的替代方案,依赖库的安装是否正确,环境变量是否生效,以及文件权限问题等。需要逐一排查,并参考用户之前遇到的CLASSPATH问题,确保环境变量正确设置。</think>### 分步解答:在Docker CentOS7环境中使用documents4j实现Word转PDF #### 1. 创建基础Docker镜像 基于CentOS7镜像构建,安装JDK8及必要依赖: ```dockerfile FROM centos:7 # 安装JDK8(参考引用[1]中CLASSPATH配置) RUN yum -y install wget unzip fontconfig && \ wget https://repo.huaweicloud.com/java/jdk/8u202-b08/jdk-8u202-linux-x64.tar.gz && \ tar -zxvf jdk-8u202-linux-x64.tar.gz -C /usr/local/ && \ rm -f jdk-8u202-linux-x64.tar.gz # 配置环境变量(关键步骤,避免CLASSPATH缺失) ENV JAVA_HOME /usr/local/jdk1.8.0_202 ENV PATH $JAVA_HOME/bin:$PATH ENV CLASSPATH .:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar # 安装中文字体(防止PDF中文乱码) RUN yum -y install cjkuni-ukai-fonts && fc-cache -fv # 安装LibreOffice(documents4j可能需要,参考引用[3]) RUN yum -y install libreoffice-headless ``` #### 2. 集成documents4j documents4j需要绑定MS Office或兼容服务,Linux环境下建议使用`documents4j-standalone`: ```dockerfile # 继续在Dockerfile中添加以下内容 # 安装documents4j-standalone(需提前下载) ADD documents4j-standalone.zip /opt/ RUN unzip /opt/documents4j-standalone.zip -d /opt/ && \ chmod +x /opt/documents4j-standalone/bin/*.sh ``` #### 3. 编写Java转换代码 在Spring Boot项目中添加依赖: ```xml <dependency> <groupId>com.documents4j</groupId> <artifactId>documents4j-remote</artifactId> <version>1.1.3</version> </dependency> ``` 转换逻辑示例: ```java IConverter converter = RemoteConverter.builder() .baseFolder(new File("/tmp")) .workerPool(20, 25, 2, TimeUnit.SECONDS) .requestTimeout(10, TimeUnit.SECONDS) .baseUri("http://localhost:9998") // documents4j-standalone服务地址 .build(); try (InputStream docx = new FileInputStream("input.docx"); OutputStream pdf = new FileOutputStream("output.pdf")) { converter.convert(docx).as(DocumentType.DOCX) .to(pdf).as(DocumentType.PDF) .execute(); } ``` #### 4. 构建与运行容器 ```bash # 构建镜像 docker build -t centos-documents4j:1.0 . # 启动documents4j服务(后台运行) docker run -d -p 9998:9998 --name converter centos-documents4j:1.0 \ /opt/documents4j-standalone/bin/start.sh # 启动应用容器(与服务容器交互) docker run --network=host -v /path/to/files:/data your-spring-app-image ``` #### 5. 验证转换功能 进入容器执行测试: ```bash docker exec -it converter /bin/bash /opt/documents4j-standalone/bin/test.sh ``` ### 关键问题解决 1. **字体缺失**:安装`cjkuni-ukai-fonts`解决中文乱码[^1] 2. **CLASSPATH配置**:确保Dockerfile中明确声明`CLASSPATH`环境变量(引用[1]) 3. **服务通信**:容器间通过`--network=host`共享网络,或使用Docker Compose定义服务依赖
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值