【Linux】使用 systemctl 管理jar包启动

一、摘要

  1. 掌握Linux系统服务管理器 systemctl 的使用方法
  2. 使用 systemctl 启动java服务 + 设置开机自启
  3. 编写shell脚本,实现手动重启java服务

二、使用 systemctl 管理jar包启动

2.1 systemctl 常用命令

## 1. 查看服务状态
systemctl status 服务名.service

## 2. 启动服务
systemctl start 服务名.service

## 3. 停止服务
systemctl stop 服务名.service

## 4. 重启服务
systemctl restart 服务名.service

## 5. 重新加载 Systemd 配置(不重启服务)
systemctl daemon-reload

## 6. 禁用服务的自启动
systemctl disable 服务名.service

## 7. 启用服务的自启动
systemctl enable 服务名.service

## 8. 列出所有服务的状态(使用grep进行过滤)
systemctl list-units --type=service | grep 'java'

## 9. 查看服务的日志(需要 journalctl 命令)
journalctl -u 服务名.service

## 10. 查看服务的依赖关系
systemctl list-dependencies 服务名.service

## 11. 查看帮助文档
man systemctl

2.2 创建自启动服务

在 /etc/systemd/system/ 目录下,创建 java-demo.service:

[Unit]
Description=java-demo
After=network.target

[Service]
Type=simple
User=root
WorkingDirectory=/usr/local/java/java-demo
ExecStart=/usr/local/jdk/jdk11/bin/java -Dspring.profiles.active=test -jar  /usr/local/java/java-demo/app-demo.jar
Restart=always
RestartSec=10

[Install]
WantedBy=multi-user.target

2.3 启动服务 + 设置开机自启

systemctl start java-demo.service

systemctl enable java-demo.service

2.4 手动重启服务

创建手动重启 shell 脚本

cd /usr/local/java/java-demo

vim restart.sh
#!/bin/bash  
# 停止 java 服务  
sudo systemctl stop java-demo
if [ $? -eq 0 ]; then  
    echo "正在停止已运行的 Java 程序..."  
else  
    echo "停止 Java 程序失败!"  
    exit 1  
fi  
  
# 等待一段时间确保服务已停止  
sleep 5
  
# 启动 java 服务  
sudo systemctl start java-demo
if [ $? -eq 0 ]; then  
    echo "正在启动 Java 程序..."  
else  
    echo "启动 Java 程序失败!"  
    exit 1  
fi
<think>好的,我现在需要帮助用户解决在Linux使用systemctl执行sh脚本启动JAR的问题。用户之前遇到了关于用户权限和脚本路径的错误,现在可能想知道如何正确配置服务单元文件来启动Java应用。首先,我需要回忆一下systemctl的基本用法和.service文件的配置项。 用户提到通过sh启动jar,这通常意味着有一个shell脚本用来设置Java环境变量,比如内存参数,然后执行java -jar命令。需要确保这个脚本有执行权限,并且路径正确。另外,用户之前遇到的是USER错误,所以需要检查服务文件中指定的用户是否存在,是否有权限访问脚本和jar文件。 接下来,我需要考虑服务文件的各个部分:[Unit]部分可能需要定义依赖,比如网络和文件系统的就绪。[Service]部分要设置正确的用户、工作目录、执行命令以及环境变量。特别是Type的类型,如果是长时间运行的服务,应该用simple或者forking,根据脚本的行为而定。Restart策略也很重要,确保应用崩溃后能自动重启。 然后,用户可能需要知道如何调试问题,比如查看日志的方法,使用journalctl来跟踪服务状态。此外,权限问题也是常见的,比如脚本和jar文件的权限,以及用户是否有权访问这些文件。还有,SELinux或AppArmor可能会阻止执行,需要检查这些安全模块的状态。 最后,给出一个示例的.service文件和操作步骤,让用户能够一步步配置。需要提醒用户替换实际路径和参数,执行daemon-reload,以及启用和启动服务。可能还需要提到内存参数的调整,如何根据应用需求配置Xms和Xmx。</think>在 Linux 中通过 `systemctl` 执行 Shell 脚本启动 Java JAR 是一种常见的服务托管方式,尤其适用于生产环境。以下是详细配置方法和注意事项: --- ### **1. 创建启动脚本(例如 `startup.sh`)** ```bash #!/bin/bash # 脚本路径:/opt/myapp/startup.sh # 设置 Java 环境变量(可选) export JAVA_HOME=/usr/lib/jvm/java-11-openjdk export PATH=$JAVA_HOME/bin:$PATH # 启动 JAR # -Xms: 初始堆内存,-Xmx: 最大堆内存 nohup java -Xms512m -Xmx1024m -jar /opt/myapp/myapp.jar > /opt/myapp/logs/app.log 2>&1 & ``` **关键操作**: 1. 赋予脚本可执行权限: ```bash chmod +x /opt/myapp/startup.sh ``` 2. 测试脚本是否能独立运行: ```bash /opt/myapp/startup.sh ``` --- ### **2. 创建 Systemd 服务单元文件** 创建文件 `/etc/systemd/system/myapp.service`: ```ini [Unit] Description=My Java Application After=network.target syslog.target # 确保网络就绪后启动 [Service] Type=simple User=appuser # 指定运行用户(需提前创建) Group=appuser WorkingDirectory=/opt/myapp # 设置工作目录(确保路径存在) ExecStart=/opt/myapp/startup.sh # 指向启动脚本 Restart=always # 崩溃后自动重启 RestartSec=5 # 重启间隔(秒) StandardOutput=syslog # 日志输出到 syslog StandardError=syslog [Install] WantedBy=multi-user.target # 多用户模式下启用 ``` --- ### **3. 配置关键点** #### **(1) 用户和权限** - 创建专用用户(避免使用 `root`): ```bash useradd -r -s /bin/false appuser ``` - 确保用户对以下内容有权限: ```bash chown -R appuser:appuser /opt/myapp ``` #### **(2) 日志管理** - 推荐将日志明确写入文件(而非依赖 `nohup`): ```bash # 修改脚本中的启动命令: java -jar /opt/myapp/myapp.jar >> /var/log/myapp.log 2>&1 ``` - 或通过 `systemd` 直接管理日志(需配置 `journald`)。 #### **(3) JVM 参数优化** - 根据需求调整内存、GC 策略等: ```bash java -Xms2g -Xmx2g -XX:+UseG1GC -jar myapp.jar ``` --- ### **4. 操作服务** ```bash # 重新加载 systemd 配置 sudo systemctl daemon-reload # 启动服务 sudo systemctl start myapp # 设置开机自启 sudo systemctl enable myapp # 查看状态 sudo systemctl status myapp # 跟踪日志 journalctl -u myapp.service -f ``` --- ### **5. 常见问题排查** #### **(1) 权限不足** - 错误现象:`Permission denied` - 解决: ```bash chmod +x /opt/myapp/startup.sh chmod 644 /opt/myapp/myapp.jar # 确保 JAR 可读 ``` #### **(2) 脚本路径错误** - 错误现象:`No such file or directory` - 解决: ```bash # 检查脚本路径和换行符(Windows 转 Linux 需删除 CR) dos2unix /opt/myapp/startup.sh ``` #### **(3) JAR 依赖缺失** - 错误现象:`ClassNotFoundException` - 解决: - 通过 `-Dloader.path` 指定外部依赖目录: ```bash java -jar -Dloader.path=/opt/myapp/libs myapp.jar ``` --- ### **6. 扩展配置示例** #### **(1) 环境变量文件** - 创建 `/opt/myapp/myapp.conf`: ```ini JAVA_OPTS="-Xms1g -Xmx2g" SPRING_PROFILES_ACTIVE=prod ``` - 在服务文件中加载: ```ini [Service] EnvironmentFile=/opt/myapp/myapp.conf ExecStart=/opt/myapp/startup.sh $JAVA_OPTS ``` #### **(2) 限制资源使用** ```ini [Service] LimitNOFILE=65535 # 最大打开文件数 LimitCPU=600 # CPU 时间(秒) MemoryMax=2G # 最大内存(systemd v244+) ``` --- 通过以上配置,你可以可靠地通过 `systemctl` 管理 Java 应用,实现自动化启停、日志收集和资源监控。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qiye丶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值