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

相关推荐
大树888 小时前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠8 小时前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
霸道流氓气质8 小时前
领域驱动设计(DDD)在 Spring Boot 微服务中的实践指南
运维·spring boot·微服务
bush48 小时前
嵌入式linux学习记录十四、术语
linux·嵌入式
载数而行5209 小时前
Linux 11 动态监控指令top
linux
Inhand陈工9 小时前
基于台达PLC与映翰通IG502的智慧水产养殖精准投喂与远程运维解决方案
运维·人工智能·物联网·阿里云·信息与通信
酣大智10 小时前
ARP代理--工作原理
运维·网络·arp·arp代理
不会C语言的男孩10 小时前
Linux 系统编程 · 第 8 章:进程基础
linux·c语言
shushangyun_10 小时前
2026年快消品B2B系统推荐:支持终端门店订货、促销政策自动化的工具?
java·运维·网络·数据库·人工智能·spring·自动化
古城小栈10 小时前
Unix 与 Linux 异同小叙
linux·服务器·unix