ubuntu开机自启动脚本

1 准备文件

/usr/local/bin/runrobot.sh

bash 复制代码
#!/usr/bin/env bash
# /usr/local/bin/runrobot.sh

# 设置错误时退出
set -e

# 设置日志文件
LOG_FILE="/var/log/robot-start.log"
exec > >(tee -a "$LOG_FILE") 2>&1

echo "========================================"
echo "Robot Startup Script"
echo "Date: $(date)"
echo "User: $(whoami)"
echo "PID: $$"
echo "========================================"

# 1. 等待必要的服务就绪
echo "[1/4] Waiting for system services..."
sleep 5

# 2. 设置环境变量
echo "[2/4] Setting up environment..."
export HOME=/home/cat
export USER=cat
export SHELL=/bin/bash
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

# 如果使用图形界面
if [ -n "$DISPLAY" ]; then
    export DISPLAY=:0
    export XAUTHORITY=/home/cat/.Xauthority
fi

# 如果使用 ROS(根据实际情况调整)
if [ -f "/opt/ros/humble/setup.bash" ]; then
    source /opt/ros/humble/setup.bash
    echo "ROS environment sourced"
fi

# 3. 切换到用户目录
echo "[3/4] Changing to user directory..."
cd /home/cat

# 4. 执行用户启动脚本
echo "[4/4] Executing user startup script..."
if [ -f "/home/cat/start.sh" ]; then
    if [ -x "/home/cat/start.sh" ]; then
        echo "Starting: /home/cat/start.sh"
        # 使用 bash -c 来确保正确的 shell 环境
        sudo -u cat bash -i -c "cd /home/cat && /home/cat/start.sh"
        EXIT_CODE=$?
        echo "Start script exited with code: $EXIT_CODE"
    else
        echo "ERROR: /home/cat/start.sh is not executable"
        exit 1
    fi
else
    echo "ERROR: /home/cat/start.sh not found"
    exit 1
fi

echo "========================================"
echo "Robot Startup Script Finished"
echo "Date: $(date)"
echo "========================================"

/etc/systemd/system/robot-start.service

bash 复制代码
[Unit]
Description=Robot Startup Service
After=network.target network-online.target multi-user.target
Wants=network-online.target
Requires=multi-user.target

[Service]
Type=simple
User=cat
Group=cat
WorkingDirectory=/home/cat
Environment="HOME=/home/cat"
Environment="USER=cat"
Environment="DISPLAY=:0"
Environment="XAUTHORITY=/home/cat/.Xauthority"
Environment="PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"

# 执行脚本(使用绝对路径)
ExecStart=/usr/local/bin/runrobot.sh

# 重启策略
Restart=on-failure
RestartSec=10

# 日志配置
StandardOutput=journal
StandardError=journal
SyslogIdentifier=robot-start

# 安全设置
NoNewPrivileges=true
ProtectSystem=strict
ReadWritePaths=/home/cat /var/log

[Install]
WantedBy=multi-user.target

2 设置权限

sudo chmod 755 /usr/local/bin/runrobot.sh

sudo chmod 755 /home/cat/start.sh

sudo chmod 644 /etc/systemd/system/robot-start.service

sudo chown cat:cat /usr/local/bin/runrobot.sh

3 启动服务

sudo systemctl daemon-reload

sudo systemctl enable robot-start.service

sudo systemctl start robot-start.service

查看状态

sudo systemctl status robot-start.service --no-pager

查看服务依赖

systemd-analyze critical-chain robot-start.service

查看启动时间

systemd-analyze blame | grep robot

查看服务的所有属性

systemctl show robot-start.service

关闭开机自启动服务,下次开机不会再生效

sudo systemctl disable robot-start.service

systemctl is-active robot-start.service # 查看是否运行

systemctl is-enabled robot-start.service # 查看是否开机自启

相关推荐
.小墨迹16 分钟前
apollo学习之借道超车的速度规划
linux·c++·学习·算法·ubuntu
Lsir10110_35 分钟前
【Linux】中断 —— 操作系统的运行基石
linux·运维·嵌入式硬件
Sheffield41 分钟前
command和shell模块到底区别在哪?
linux·云计算·ansible
历程里程碑1 小时前
Linux20 : IO
linux·c语言·开发语言·数据结构·c++·算法
郝学胜-神的一滴1 小时前
深入浅出:使用Linux系统函数构建高性能TCP服务器
linux·服务器·开发语言·网络·c++·tcp/ip·程序人生
承渊政道1 小时前
Linux系统学习【Linux系统的进度条实现、版本控制器git和调试器gdb介绍】
linux·开发语言·笔记·git·学习·gitee
技术路上的探险家1 小时前
Ubuntu下Docker与NVIDIA Container Toolkit完整安装教程(含国内源适配)
linux·ubuntu·docker
代码AC不AC1 小时前
【Linux】深入理解缓冲区
linux·缓冲区·标准错误
Doro再努力1 小时前
【Linux操作系统12】Git版本控制与GDB调试:从入门到实践
linux·运维·服务器·git·vim
全栈工程师修炼指南1 小时前
Nginx | stream content 阶段:UDP 协议四层反向代理浅析与实践
运维·网络·网络协议·nginx·udp