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