说明
我们接下来要设置,相关的程序和依赖自启动,这样我们就不用每次开启都要手动运行相关程序了。
创建启动脚本
bash
cd ~/RoboTamerSdk4Qmini/bin && vim boot.sh1
写入以下内容:
特别注意
- 脚本中的
Wireless Controller是蓝牙手柄的设备名称,如果你使用的手柄名称不同,请修改为实际的设备名称。 - 每次运行脚本时都会在
/home/lckfb/robot-logs/目录下生成一个新的日志文件,文件名包含了当前的日期和时间,确保日志不会被覆盖。 - 脚本会自动检查日志文件大小,并在超过指定大小时进行轮转,同时保留一定数量的历史日志文件,避免占用过多磁盘空间。
shell
#!/bin/bash
# ============================================================
# Qmini 机器人启动脚本 - 带日志轮转管理
# ============================================================
set -e
# 配置参数
LOG_DIR="/home/lckfb/robot-logs"
MAX_LOG_SIZE_MB=50 # 单个日志文件最大大小 (MB)
MAX_LOG_FILES=50 # 保留的最大日志文件数
LOG_ROTATE_INTERVAL=3600 # 日志轮转检查间隔 (秒)
# 创建日志目录
mkdir -p "$LOG_DIR"
# 日志轮转函数
rotate_log_if_needed() {
local log_file="$1"
if [ ! -f "$log_file" ]; then
return 0
fi
local size_mb=$(du -m "$log_file" 2>/dev/null | cut -f1)
if [ "$size_mb" -ge "$MAX_LOG_SIZE_MB" ]; then
local timestamp=$(date +%Y%m%d_%H%M%S)
local rotated_file="${log_file%.log}_${timestamp}.log"
mv "$log_file" "$rotated_file"
gzip "$rotated_file" 2>/dev/null || true
echo "[$(date '+%Y-%m-%d %H:%M:%S')] Log rotated: $rotated_file.gz"
fi
}
# 清理旧日志函数
cleanup_old_logs() {
local file_count=$(find "$LOG_DIR" -name "*.log" -o -name "*.log.gz" 2>/dev/null | wc -l)
if [ "$file_count" -gt "$MAX_LOG_FILES" ]; then
local delete_count=$((file_count - MAX_LOG_FILES))
find "$LOG_DIR" -name "*.log" -o -name "*.log.gz" 2>/dev/null | \
sort | head -n "$delete_count" | xargs rm -f 2>/dev/null || true
echo "[$(date '+%Y-%m-%d %H:%M:%S')] Cleaned up $delete_count old log files"
fi
}
# 后台日志轮转守护进程
start_log_daemon() {
local log_file="$1"
local pid_file="$LOG_DIR/.log_daemon.pid"
# 如果已有守护进程在运行,先停止
if [ -f "$pid_file" ]; then
local old_pid=$(cat "$pid_file")
if kill -0 "$old_pid" 2>/dev/null; then
kill "$old_pid" 2>/dev/null || true
fi
rm -f "$pid_file"
fi
# 启动新的守护进程
(
while true; do
sleep "$LOG_ROTATE_INTERVAL"
rotate_log_if_needed "$log_file"
cleanup_old_logs
done
) &
echo $! > "$pid_file"
echo "[$(date '+%Y-%m-%d %H:%M:%S')] Log daemon started (PID: $(cat $pid_file))"
}
# 等待 PS4 手柄
echo "[$(date '+%Y-%m-%d %H:%M:%S')] Waiting for PS4 controller..."
while ! grep -ql "Wireless Controller" /sys/class/input/event*/device/name 2>/dev/null; do
echo "[$(date '+%Y-%m-%d %H:%M:%S')] Controller not found, retrying in 5s..."
sleep 5
done
echo "[$(date '+%Y-%m-%d %H:%M:%S')] PS4 controller connected!"
# 生成日志文件名
LOG_TIME=$(date +%Y_%m_%d-%H)
LOG_FILE="$LOG_DIR/run_interface_$(date +%Y%m%d_%H%M%S).log"
cd /home/lckfb/RoboTamerSdk4Qmini/bin/
# 打印启动信息
echo "============================================================"
echo "Qmini Robot Control System"
echo "Start Time: $(date '+%Y-%m-%d %H:%M:%S')"
echo "Log File: $LOG_FILE"
echo "Max Log Size: ${MAX_LOG_SIZE_MB}MB"
echo "Max Log Files: $MAX_LOG_FILES"
echo "============================================================"
# 启动日志轮转守护进程
start_log_daemon "$LOG_FILE"
# 清理旧日志
cleanup_old_logs
# 运行主程序
exec stdbuf -oL -eL /home/lckfb/RoboTamerSdk4Qmini/bin/run_interface 2>&1 | tee "$LOG_FILE"1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
添加可执行权限:
bash
chmod +x ~/RoboTamerSdk4Qmini/bin/boot.sh1
创建Qmini系统服务
bash
sudo vim /etc/systemd/system/qmini.service1
写入以下的内容:
bash
[Unit]
Description=Qmini Interface Service
After=bluetooth.target
Before=shutdown.target
[Service]
ExecStart=/home/lckfb/RoboTamerSdk4Qmini/bin/boot.sh
ExecStop=/bin/true
Restart=on-failure
User=lckfb
WorkingDirectory=/home/lckfb/RoboTamerSdk4Qmini/bin
[Install]
WantedBy=multi-user.target1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
启动服务:
bash
sudo systemctl daemon-reload
sudo systemctl enable qmini.service
sudo systemctl start qmini.service1
2
3
2
3
检查服务运行是否正常:
bash
sudo systemctl status qmini.service1
创建独立root服务来处理lo的multicast
说明
由于 lo 接口的 multicast 选项需要 root 权限才能修改,我们需要创建一个独立的系统服务来处理这个问题,确保在 Qmini 服务启动之前就已经启用了 lo 的 multicast 功能。
bash
sudo vim /etc/systemd/system/lo-multicast.service1
写入以下的内容:
bash
[Unit]
Description=Enable multicast on loopback
After=network.target
Before=qmini.service
[Service]
Type=oneshot
ExecStart=/sbin/ip link set lo multicast on
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
启动服务:
bash
sudo systemctl daemon-reload
sudo systemctl enable lo-multicast.service
sudo systemctl start lo-multicast.service1
2
3
2
3
检查服务运行是否正常:
bash
systemctl status lo-multicast.service1