用 systemd 让应用开机自启
May 16, 2024About 1 min
用 systemd 让应用开机自启
一个 jar 包要在服务器重启后自动拉起,最干净的做法是写个 systemd service,而不是塞到 rc.local 或者 crontab 的 @reboot 里。下面以一个 Java jar 为例。
先在应用目录写一个启动脚本 run.sh:
#!/bin/bash
cd $(dirname $0)
source /etc/profile
nohup java -jar Server-1.0-SNAPSHOT.jar > /dev/null 2>&1 &
cd $(dirname $0) 保证不管从哪调用脚本,工作目录都切到脚本所在处;source /etc/profile 是因为 systemd 拉起的环境很干净,JAVA_HOME 之类不一定在,显式加载一下。
再写服务文件 /etc/systemd/system/gamecenter.service:
[Unit]
Description=gamecenter
After=syslog.target network.target remote-fs.target nss-lookup.target
[Service]
Type=forking
ExecStart=/bin/bash /opt/app/run.sh
Restart=on-failure
PrivateTmp=false
User=appuser
[Install]
WantedBy=multi-user.target
几个点:Type=forking 配合脚本里的 nohup ... &,告诉 systemd 进程会 fork 后退到后台;Restart=on-failure 让进程异常退出时自动重启;User= 指定跑服务的账户,别用 root;ExecStart 写脚本的绝对路径。
注意区别:服务文件存在不代表会自启。enable 才是"开机自动启动",start 只是这次手动拉起。
# 启用并立即启动(enable 表示开机自启)
sudo systemctl enable --now gamecenter.service
# 查看状态
sudo systemctl status gamecenter
# 手动启动
sudo systemctl start gamecenter
改了 .service 文件后记得 sudo systemctl daemon-reload 再重启服务,否则 systemd 用的还是旧配置。