前言
首先,我的启动命令如下,因为要对接nacos所以会比较长点.
nohup java -jar -Dnacos.server-addr=127.0.0.1:8848 -Dnacos.namespace=prod -Dnacos.username=nacos -Dnacos.password=nacos /data/app-service/app-service-1.0.0.jar > /data/app-service/log/app.service 2>&1 &
当然可以,这条命令是一个典型的用于后台启动 Java 应用程序的例子。下面是对这条命令各个部分的详细解释:
1. nohup
: 这个命令意味着即使用户退出登录(logout)后,被 nohup 命令启动的进程也不会终止。这对于长时间运行的服务来说非常有用。
2. java -jar
: 这是运行一个 JAR 文件的标准方式。-jar
参数告诉 Java 虚拟机 (JVM) 将给定的 JAR 文件作为应用程序来执行。
3. -Dnacos.server-addr=127.0.0.1:8848
: 这是一个 JVM 参数,用于设置 Nacos 服务器地址。这里指定了 Nacos 服务器的 IP 地址和端口为 127.0.0.1:8848
。
4. -Dnacos.namespace=prod
: 同样是一个 JVM 参数,用于指定 Nacos 的命名空间。这里的命名空间是 prod
,通常用来区分不同的环境或应用。
5. -Dnacos.username=nacos
和 -Dnacos.password=nacos
: 这两个参数分别用于指定访问 Nacos 服务器所需的用户名和密码。
6. /data/app-service/app-service-1.0.0.jar
: 这是指定要运行的 JAR 文件的路径。在这个例子中,JAR 文件名为 app-service-1.0.0.jar
,位于 /data/app-service/
目录下。
7. > /data/app-service/log/app-service.log
: 这个重定向操作符 (2>&1) 会把标准输出 (stdout) 重定向到指定文件中。在这个例子中,输出会被重定向到 /data/app-service/log/app-service.log
文件中。这意味着所有标准输出都会被记录到这个文件中,而不是显示在终端上。
8. 2>&1
: 这个重定向操作符 (2>&1
) 会把标准错误 (stderr) 重定向到与标准输出相同的地方。也就是说,所有的错误信息也会被记录到 /data/app-service/log/app-service.log
文件中。
9. &
: 这个符号表示命令应该在后台运行。这允许用户在启动服务后立即返回到命令行界面,并继续执行其他命令。
部署
创建成系统服务
创建 app.service
可以在本地创建好 在传到 /etc/systemd/system/ 目录下
/usr/bin/java 需要改成自己的java环境对应地址
/srv/sites/app.jar 改为自己jar存放包地址
请确保/data/app-service/log的log目录存在
[Unit] Description=Auth Center Service After=network.target [Service] User=root Group=root Type=simple ExecStart=/usr/bin/java -jar -Dnacos.server-addr=127.0.0.1:8848 -Dnacos.namespace=prod -Dnacos.username=nacos -Dnacos.password=nacos /data/app-service/app-service-1.0.0.jar > /data/app-service/log/app-service.log 2>&1 & ExecStop=/bin/kill -s TERM $MAINPID Restart=always RestartSec=10 WorkingDirectory=/data/app-service [Install] WantedBy=multi-user.target
重新加载服务单元文件
更新 app.service
文件后,请确保重新加载服务单元文件:
systemctl daemon-reload
启动服务
systemctl start app.service
检查服务状态
systemctl status app.service
设置服务开机启动
systemctl enable app.service
关闭开机启动
systemctl disable app.service
验证是否开机启动
systemctl is-enabled app.service
关闭服务
systemctl stop app.service
碰到错误项解决
启动状态显示错误: code=exited, status=200/CHDIR
一般都是目录权限问题
原因1 :systemctl执行脚本时需要知道脚本的解释器
原因2:目标目录的执行权限不够
原因3:要执行的脚本编码格式不正确
原因4:定义的workingdirectory路径有问题
解决方法:
1.在自定义脚本的开头加上#!/bin/sh
2.修改目标目录的权限 chmod -R 777 /目标目录
3.vi或vi编辑文件输入:set ff+回车键查看当前文件编码格式,:set ff=unix+回车键设置文件的编码格式为unix;
4.Systemd下的服务配置,如果设定使用了workingdirectory,但是在systemctl start之前没有创建该目录,将会无法正常启动,并且根据缺省方式下的status提示信息和journalctl无法清楚地定位问题,如果使用到workingdirectory,需要事先保证该目录的创建,可以考虑使用systemd提供的debug日志进行确认;