【Linux】Ubuntu 利用 update-rc.d命令 添加开机启动服务

  1. 复制或软连接脚本到/etc/init.d/目录下

  2. 将脚本添加到初始化执行的队列中去
    注意如果脚本需要用到网络,则NN需设置一个比较大的数字,如99。
    命令:update-rc.d xxx defaults NN命令 #(NN为启动顺序)

    ubuntu 16.04中一定要加上以下LSB信息,不然放入启动脚本的时候会报错无法开机启动。

    #!/bin/sh
    ### BEGIN INIT INFO
    # Provides:          svnd.sh
    # Required-start:    $local_fs $remote_fs $network $syslog
    # Required-Stop:     $local_fs $remote_fs $network $syslog
    # Default-Start:     2 3 4 5
    # Default-Stop:      0 1 6
    # Short-Description: starts the svnd.sh daemon
    # Description:       starts svnd.sh using start-stop-daemon
    ### END INIT INFO
    
  3. 设置脚本文件的权限
    $ sudo chmod 755 /etc/init.d/svnd.sh (注意一定要设置权限,不然开机不会启动)

  4. 执行如下命令将脚本放到启动脚本中去:
    $ cd /etc/init.d
    $ sudo update-rc.d svnd.sh defaults 95

注:其中数字95是脚本启动的顺序号,按照自己的需要相应修改即可。在你有多个启动脚本,而它们之间又有先后启动的依赖关系时你就知道这个数字的具体作用了。

  1. 卸载启动脚本的方法:
    $ cd /etc/init.d
    $ sudo update-rc.d -f svnd.sh remove

—— 2018-08-05 ——

<think>我们创建一个开机自启的脚本,通常有两种方式:1.使用systemd服务(推荐,现代Linux发行版的标准方式)2.创建/etc/rc.local脚本(传统方式,但有些系统可能不支持)根据用户提供的命令:nohupenvJAVA_HOME=/home/jdk-17/binJADX_DEV_ALL=/home/appcheck/jadx-dev-all.jarHAP_SIGN_TOOL_PATH=/home/appcheck/hap-sign-tool.jarjava-Xms512m-Xmx1024m-jar/home/appcheck/appcheck.jar--spring.config.location=file:/home/appcheck/application.yml&我们需要将这个命令转化为一个系统服务。步骤:1.创建一个systemd服务单元文件(.service)2.配置该服务文件,设置环境变量、工作目录、启动命令等3.启用服务,使其开机自启注意:用户命令中使用了nohup和&,但在systemd服务中不需要,因为systemd可以管理后台进程。具体步骤:1.创建服务文件,例如:appcheck.servicesudonano/etc/systemd/system/appcheck.service2.写入以下内容(根据用户命令调整):```[Unit]Description=AppCheckServiceAfter=network.target[Service]#设置环境变量Environment="JAVA_HOME=/home/jdk-17"Environment="JADX_DEV_ALL=/home/appcheck/jadx-dev-all.jar"Environment="HAP_SIGN_TOOL_PATH=/home/appcheck/hap-sign-tool.jar"#设置工作目录(根据实际情况,这里假设为/home/appcheck)WorkingDirectory=/home/appcheck#启动命令#注意:JAVA_HOME已经设置到环境变量,所以直接使用java命令(注意使用绝对路径)ExecStart=${JAVA_HOME}/bin/java-Xms512m-Xmx1024m-jar/home/appcheck/appcheck.jar--spring.config.location=file:/home/appcheck/application.yml#以哪个用户运行,根据实际情况修改User=your_usernameGroup=your_groupname#重启策略Restart=on-failureRestartSec=10s[Install]WantedBy=multi-user.target```注意:如果JAVA_HOME的路径是/home/jdk-17,那么bin目录就在这个路径下,所以ExecStart中写${JAVA_HOME}/bin/java。但是,在systemd服务文件中,环境变量的引用方式为${ENV_VAR},但实际上在ExecStart行中,我们可以直接使用环境变量名,因为systemd会解析环境变量。不过,也可以使用$JAVA_HOME/bin/java的形式。3.保存文件后,执行以下命令:sudosystemctldaemon-reloadsudosystemctlenableappcheck.servicesudosystemctlstartappcheck.service4.检查服务状态:sudosystemctlstatusappcheck.service如果用户没有权限创建系统服务,或者系统不支持systemd(比如旧版的Debian或Ubuntu),可以使用rc.local方式。使用rc.local方式:1.创建启动脚本(例如:/home/appcheck/start_appcheck.sh)#!/bin/bashcd/home/appcheckenvJAVA_HOME=/home/jdk-17/binJADX_DEV_ALL=/home/appcheck/jadx-dev-all.jarHAP_SIGN_TOOL_PATH=/home/appcheck/hap-sign-tool.jarnohupjava-Xms512m-Xmx1024m-jarappcheck.jar--spring.config.location=file:/home/appcheck/application.yml>/home/appcheck/appcheck.log2>&1&注意:这里将标准输出和错误输出重定向到/home/appcheck/appcheck.log文件。2.给脚本执行权限:chmod+x/home/appcheck/start_appcheck.sh3.编辑/etc/rc.local文件(如果不存在则创建,并确保其有执行权限)sudonano/etc/rc.local4.在exit0之前添加:/home/appcheck/start_appcheck.sh5.保存并退出,然后给/etc/rc.local执行权限(如果还没有):sudochmod+x/etc/rc.local但是,请注意,现代Linux发行版(如Ubuntu16.04以上)默认使用systemd,rc.local可能默认不启用。如果需要启用rc.local,可以执行:sudosystemctlenablerc-local.service或者创建rc-local.service文件(如果不存在)。考虑到兼容性和现代系统的标准做法,我们推荐使用systemd方式。根据用户的需求,我们给出systemd服务方式作为主要方案。注意:在服务文件中,我们设置的环境变量是直接写在Environment行中的。另外,ExecStart行中,我们直接使用$JAVA_HOME/bin/java,因为systemd会解析环境变量。但是,有一个细节:用户原来的命令中JAVA_HOME设置的是/home/jdk-17/bin,这通常是不对的,因为JAVA_HOME应该指向JDK的安装根目录,而不是bin目录。所以我们在服务文件中将JAVA_HOME设置为/home/jdk-17(假设这是正确的JDK根目录)。如果用户确实需要将JAVA_HOME设置为bin目录的父目录,那么这样设置是正确的。如果用户原来的命令中JAVA_HOME设置就是指向bin目录,那么我们需要调整,因为通常JAVA_HOME应该指向包含bin、lib等目录的父目录。所以,我们按照常规做法,将JAVA_HOME设置为/home/jdk-17,然后在ExecStart中使用$JAVA_HOME/bin/java。如果用户希望保持原来的环境变量设置(即JAVA_HOME包含bin目录),那么可以这样设置环境变量:Environment="JAVA_HOME=/home/jdk-17/bin"然后在ExecStart中直接使用$JAVA_HOME/java,因为此时$JAVA_HOME就是bin目录,所以java可执行文件就在这个目录下。但是,这样设置JAVA_HOME是不标准的,可能会引起其他问题。所以建议按照标准做法,将JAVA_HOME设置为/home/jdk-17,然后在ExecStart中使用$JAVA_HOME/bin/java。因此,我们调整服务文件中的环境变量设置:假设用户的JDK实际安装路径是/home/jdk-17(即bin目录的父目录),那么:Environment="JAVA_HOME=/home/jdk-17"然后ExecStart中写:$JAVA_HOME/bin/java...如果用户的环境变量必须包含bin目录,那么按照用户原来的方式设置。由于用户原来的命令是:envJAVA_HOME=/home/jdk-17/bin...java...所以,这里用户设置的JAVA_HOME为bin目录。这可能是因为用户将java可执行文件所在的目录作为JAVA_HOME。虽然不标准,但也可以工作。因此,为了与用户原来的命令一致,我们可以这样写服务文件:Environment="JAVA_HOME=/home/jdk-17/bin"然后在ExecStart中写:$JAVA_HOME/java...或者,更标准的方式是,将JAVA_HOME设置为/home/jdk-17,然后ExecStart中写$JAVA_HOME/bin/java。我们这里采用标准方式,因为这样设置JAVA_HOME是常规做法。因此,服务文件修改为:```[Unit]Description=AppCheckServiceAfter=network.target[Service]#设置环境变量(采用标准JAVA_HOME设置,指向JDK根目录)Environment="JAVA_HOME=/home/jdk-17"Environment="JADX_DEV_ALL=/home/appcheck/jadx-dev-all.jar"Environment="HAP_SIGN_TOOL_PATH=/home/appcheck/hap-sign-tool.jar"WorkingDirectory=/home/appcheck#使用标准JAVA_HOME下的java命令ExecStart=$JAVA_HOME/bin/java-Xms512m-Xmx1024m-jar/home/appcheck/appcheck.jar--spring.config.location=file:/home/appcheck/application.ymlUser=your_usernameGroup=your_groupnameRestart=on-failureRestartSec=10s[Install]WantedBy=multi-user.target```注意:上面的ExecStart行中,$JAVA_HOME前面没有使用大括号,在systemd服务文件中,环境变量的引用可以是$VAR或${VAR},这里使用$JAVA_HOME即可。另外,关于用户和组:请替换为实际的运行用户和组,如果是在root用户下运行,可以设置为root,但建议使用非root用户。最后,如果用户希望使用原来的环境变量设置(即JAVA_HOME包含bin目录),那么可以按照用户原来的方式设置环境变量,并调整ExecStart中的java命令路径。我们按照标准方式提供最终方案。如果用户不清楚JDK的路径,可以通过以下命令查找:whichjava然后查看指向,例如:ls-l/usr/bin/java可能会指向:/usr/bin/java->/etc/alternatives/javals-l/etc/alternatives/java可能会指向:/etc/alternatives/java->/usr/lib/jvm/java-17-openjdk-amd64/bin/java那么JAVA_HOME就应该设置为:/usr/lib/jvm/java-17-openjdk-amd64所以,用户需要确认自己的JDK路径。总结:我们使用systemd服务方式,并按照标准设置JAVA_HOME。现在,我们提供完整的步骤:步骤1:创建服务文件步骤2:配置服务文件(内容如上)步骤3:设置正确的用户和组(例如,如果当前用户是ubuntu,组也是ubuntu,则User=ubuntu,Group=ubuntu)步骤4:启用服务注意:确保JDK路径、jar文件路径等正确。如果用户需要,也可以将日志重定向到文件,但在systemd中,可以通过journalctl查看日志,也可以配置日志重定向到文件。这里我们先不配置,使用systemd默认的日志管理。如果需要将日志输出到文件,可以在ExecStart行后添加:StandardOutput=file:/home/appcheck/appcheck.logStandardError=file:/home/appcheck/appcheck_error.log但这样可能会不断追加,需要定期清理。或者使用日志轮转功能。另一种方式是在ExecStart中直接重定向,但systemd不建议这样做,而是使用它自己的重定向机制。因此,我们使用systemd的日志管理,用户可以通过journalctl-uappcheck.service查看日志。最终服务文件内容:```[Unit]Description=AppCheckServiceAfter=network.target[Service]Environment="JAVA_HOME=/home/jdk-17"Environment="JADX_DEV_ALL=/home/appcheck/jadx-dev-all.jar"Environment="HAP_SIGN_TOOL_PATH=/home/appcheck/hap-sign-tool.jar"WorkingDirectory=/home/appcheckExecStart=$JAVA_HOME/bin/java-Xms512m-Xmx1024m-jar/home/appcheck/appcheck.jar--spring.config.location=file:/home/appcheck/application.ymlUser=ubuntuGroup=ubuntuRestart=on-failureRestartSec=10s[Install]WantedBy=multi-user.target```请将User和Group替换为实际运行的用户和组。完成。</think>以下是为 Java 应用程序创建开机自启脚本的完整方案,采用 systemd 服务方式(推荐)和传统 init.d 脚本方式两种方法: ### 方法 1:使用 systemd 服务(推荐,现代 Linux 标准) ```bash # 创建服务文件 sudo nano /etc/systemd/system/appcheck.service ``` 文件内容: ```ini [Unit] Description=AppCheck Java Application After=network.target [Service] # 设置环境变量 Environment="JAVA_HOME=/home/jdk-17" Environment="JADX_DEV_ALL=/home/appcheck/jadx-dev-all.jar" Environment="HAP_SIGN_TOOL_PATH=/home/appcheck/hap-sign-tool.jar" # 设置工作目录 WorkingDirectory=/home/appcheck # 启动命令(注意:$JAVA_HOME 引用环境变量) ExecStart=$JAVA_HOME/bin/java -Xms512m -Xmx1024m -jar appcheck.jar --spring.config.location=file:application.yml # 指定运行用户(替换 your_username 为实际用户) User=your_username Group=your_group # 自动重启配置 Restart=on-failure RestartSec=10s [Install] WantedBy=multi-user.target ``` 启用服务: ```bash sudo systemctl daemon-reload sudo systemctl enable appcheck.service # 启用开机自启 sudo systemctl start appcheck.service # 立即启动服务 ``` 验证状态: ```bash sudo systemctl status appcheck.service journalctl -u appcheck.service -f # 查看实时日志 ``` ### 方法 2:创建传统 init.d 脚本(兼容旧系统) ```bash # 创建启动脚本 sudo nano /etc/init.d/appcheck ``` 文件内容: ```bash #!/bin/bash ### BEGIN INIT INFO # Provides: appcheck # Required-Start: $network $remote_fs $syslog # Required-Stop: $network $remote_fs $syslog # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: AppCheck Java Service ### END INIT INFO # 配置环境 JAVA_HOME=/home/jdk-17 APP_DIR=/home/appcheck JAR_FILE=$APP_DIR/appcheck.jar CONFIG_FILE=$APP_DIR/application.yml LOG_FILE=$APP_DIR/appcheck.log # 启动函数 start() { echo "Starting AppCheck..." cd $APP_DIR nohup env JAVA_HOME=$JAVA_HOME/bin \ JADX_DEV_ALL=$APP_DIR/jadx-dev-all.jar \ HAP_SIGN_TOOL_PATH=$APP_DIR/hap-sign-tool.jar \ $JAVA_HOME/bin/java -Xms512m -Xmx1024m -jar $JAR_FILE \ --spring.config.location=file:$CONFIG_FILE > $LOG_FILE 2>&1 & echo $! > /var/run/appcheck.pid } # 停止函数 stop() { echo "Stopping AppCheck..." kill -9 $(cat /var/run/appcheck.pid) || true rm -f /var/run/appcheck.pid } case "$1" in start) start ;; stop) stop ;; restart) stop sleep 2 start ;; *) echo "Usage: $0 {start|stop|restart}" exit 1 esac exit 0 ``` 设置权限并启用: ```bash sudo chmod +x /etc/init.d/appcheck sudo update-rc.d appcheck defaults # 启用开机启动 sudo service appcheck start # 立即启动 ``` ### 关键配置说明: 1. **环境变量**: - `JAVA_HOME` 指向 JDK 安装目录 - `JADX_DEV_ALL` 和 `HAP_SIGN_TOOL_PATH` 指定依赖库路径 - `WorkingDirectory` 确保应用在正确目录启动 2. **JVM 参数**: - `-Xms512m` 设置初始堆内存为 512MB - `-Xmx1024m` 设置最大堆内存为 1024MB - `--spring.config.location` 指定配置文件路径 3. **日志管理**: - systemd 自动记录日志到 journal - init.d 脚本将日志重定向到指定文件 > **重要提示**: > - 替换 `your_username` 和 `your_group` 为实际运行用户 > - 确保所有路径存在且权限正确 > - 使用 `systemd-analyze verify appcheck.service` 检查服务文件语法 ### 验证自启动 重启系统后检查: ```bash # systemd 方式 systemctl is-enabled appcheck.service # init.d 方式 service appcheck status ``` ### 常见问题解决 1. **权限问题**: ```bash sudo chown -R your_username:your_group /home/appcheck ``` 2. **Java 路径错误**: 验证 Java 路径: ```bash $ ls $JAVA_HOME/bin/java ``` 3. **内存不足**: 根据系统资源调整 `-Xms` 和 `-Xmx` 参数值
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值