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 # 查看是否开机自启

相关推荐
张洛闻Eren几秒前
MySQL 维护稳定系统【MySQL第二课】
linux·数据库·mysql·云原生
ltl22 分钟前
Linux 异步 I/O:epoll 与 io_uring 对比
linux
ltl29 分钟前
压缩算法工程实践:吞吐、比率与 CPU 权衡
linux
fiveym1 小时前
01 - iPXE + Clonezilla 网络装机原理解析
linux·运维·服务器·网络
虎头金猫2 小时前
如何在群晖NAS上通过Docker部署CloudSaver?群晖部署CloudSaver教程|聚合资源搜索并实现远程访问
运维·服务器·网络·python·docker·容器·pandas
反转180度2 小时前
Qt 6 + C++17 实现 SFTP 批量部署:工业设备运维工具实战解析
运维·c++·qt
雨辰AI3 小时前
RAG 知识库搭建:基于人大金仓构建信创运维问答机器人|全栈国产化落地完整版
运维·ai·机器人·ai编程
-今昭-3 小时前
Ansible
linux·运维·ansible
星野川崎2063 小时前
电商多店运维:云机长期挂机频繁掉线、账号无故风控原因剖析与解决方案
大数据·运维·云计算·电商
mounter6254 小时前
MACsec 全景解析:从技术演进、核心架构到 DPU 硬件卸载与 K8s 大规模调度实战
linux·kubernetes·linux kernel·kernel·macsec