树莓派5无需重启:CPU核心恢复及虚拟环境自动调整故障排查
树莓派5 .bashrc 自动环境切换+CPU核心控制修复方案
问题根源
你的配置主要存在两个核心问题:
- 路径匹配不严谨:
$PWD与project_dir的精确匹配会因路径格式(如末尾斜杠、符号链接)或进入子目录时触发错误的恢复逻辑 - CPU恢复顺序错误:先设置性能模式再启用核心,导致离线核心无法应用governor配置,看似未恢复
修复后的完整配置
venv_path="$HOME/my_virtualenv" # 虚拟环境路径 project_dir="$HOME/projects/my_project/jh_project" # 项目目录 export PREV_CPU_STATE="full" # 标准化路径,消除斜杠、符号链接差异 normalize_path() { realpath -m "$1" } set_power_save() { echo "🔋 启用低功耗模式" # 仅给在线的CPU0设置powersave模式(其他核心即将被禁用) echo "powersave" | sudo tee /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor > /dev/null echo "🔻 禁用CPU核心1-3..." for i in 1 2 3; do [[ -f "/sys/devices/system/cpu/cpu$i/online" ]] && echo 0 | sudo tee /sys/devices/system/cpu/cpu$i/online > /dev/null 2>&1 done } set_performance_mode() { echo "🔌 启用性能模式" echo "🔺 恢复CPU核心1-3..." for i in 1 2 3; do if [[ -f "/sys/devices/system/cpu/cpu$i/online" ]]; then echo 1 | sudo tee /sys/devices/system/cpu/cpu$i/online > /dev/null 2>&1 sleep 0.1 # 短暂等待核心上线,确保系统识别 fi done # 所有核心在线后统一设置performance模式 echo "performance" | sudo tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor > /dev/null } check_cd_and_activate() { local current_dir=$(normalize_path "$PWD") local target_dir=$(normalize_path "$project_dir") echo "📂 当前目录: $current_dir" echo "📂 上次CPU状态: $PREV_CPU_STATE" # 匹配项目目录及其所有子目录 if [[ "$current_dir" == "$target_dir" || "$current_dir" == "$target_dir"/* ]]; then if [[ "$PREV_CPU_STATE" != "low" ]]; then # 激活虚拟环境(未激活时执行) [[ -d "$venv_path" && -z "$VIRTUAL_ENV" ]] && { echo "✅ 激活虚拟环境: $venv_path" source "$venv_path/bin/activate" } set_power_save export PREV_CPU_STATE="low" fi else # 完全离开项目目录范围时恢复 if [[ "$PREV_CPU_STATE" == "low" ]]; then echo "🔄 切换至性能模式" # 停用虚拟环境(已激活时执行) [[ ! -z "$VIRTUAL_ENV" ]] && { echo "❌ 停用虚拟环境" deactivate } set_performance_mode export PREV_CPU_STATE="full" fi fi } export PROMPT_COMMAND="check_cd_and_activate"
立即生效方法(无需重启)
在当前终端执行:
source ~/.bashrc
额外注意事项
- sudo无密码权限:确保你的用户能无密码执行
tee命令,否则切换时会卡住。执行sudo visudo并添加一行:
替换你的用户名 ALL=(ALL) NOPASSWD: /usr/bin/tee你的用户名为树莓派的实际用户名(默认是pi) - 子目录支持:修复后的配置会在项目目录的所有子目录下保持低功耗模式,若需仅精确匹配根项目目录,可删除
|| "$current_dir" == "$target_dir"/*部分
内容的提问来源于stack exchange,提问作者이정환
相关产品推荐
相关产品推荐

