# 开机启动方法
***
在Ubuntu系统中配置开机自启动脚本可通过以下方法实现:
### 1. 使用systemd服务
在/etc/systemd/system/下创建.service文件(如:rc-local.service),内容示
```ini
[Unit]
Description=rc-local # 可自定义
Requires=network-online.target # 若需要联网后启动的话,则需要加入该参数
After=network-online.target # 若需要联网后启动的话,则需要加入该参数
[Service]
Type=forking
Restart=always
RestartSec=1
ExecStart=/opt/rc-local.sh start # 这里写 rc-local.sh 文件的 绝对地址
ExecStop=/opt/rc-local.sh stop
[Install]
WantedBy=multi-user.target
```
通过systemd服务依赖关系控制
在.service文件中使用After和Wants/Requires字段定义启动顺序:
```ini
After=network.target serviceB.service #确保 network 和 serviceB 就绪后启动
Requires=serviceB.service # 强依赖(serviceB失败则自己不启动)
```
After:指定依赖项
Wants:弱依赖(不影响主服务状态)
Requires:强依赖(依赖失败则服务终止)
### 2. Before: 使用字段反向控制
在服务文件中添加Before=serviceB.service,表示当前服务需在serviceB之前启动。
### 3. 创建rc-local.sh文件
```bash
sudo vim /opt/rc-local.sh
```
输入以下内容:
```bash
#!/bin/bash
# 自动检测并执行当前目录可执行文件
APP_FULLPATH=$(find . -maxdepth 1 -type f -executable | grep -v "\.sh$" | head -n 1)
# 应用名称
APP_NAME=$(basename $APP_FULLPATH)
PID_FILE="/var/log/${APP_NAME}.pid"
LOG_FILE="/var/log/${APP_NAME}.log"
# 检查进程是否存在
is_running() {
[ -f "$PID_FILE" ] && ps -p $(cat "$PID_FILE") > /dev/null 2>&1
}
# 启动应用
start() {
if is_running; then
echo "$APP_NAME 已在运行 (PID: $(cat $PID_FILE))"
else
nohup "$APP_NAME" >> "$LOG_FILE" 2>&1 &
echo $! > "$PID_FILE"
echo "$APP_NAME 已启动 (PID: $(cat $PID_FILE))"
tail -f "$LOG_FILE"
fi
}
# 停止应用
stop() {
if is_running; then
PID=$(cat "$PID_FILE")
kill $PID
rm "$PID_FILE"
echo "$APP_NAME 已停止"
else
echo "$APP_NAME 未运行"
fi
}
# 重启应用
restart() {
stop
sleep 2
start
}
# 查看状态
status() {
if is_running; then
echo "$APP_NAME 正在运行 (PID: $(cat $PID_FILE))"
else
echo "$APP_NAME 未运行"
fi
}
# 主逻辑
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
restart
;;
status)
status
;;
*)
echo "用法: $0 {start|stop|restart|status}"
exit 1
esac
```
### 4. 设置rc.local文件权限
```bash
sudo chmod +x /opt/rc-local.sh
```
### 5. 添加开机启动命令
```bash
sudo systemctl daemon-reload # 重载配置文件
sudo systemctl enable rc-local # 设置开机自启
```
### 6. 启用rc-local服务
```bash
sudo systemctl start rc-local # 立即启动服务
sudo systemctl stop rc-local # 停止
```
验证状态可使用systemctl is-enabled rc-local