# Summary # Cues [[dry-run]] # Notes 这确实是一个写得相当不错的 Shell 脚本!👍 让我点评一下它的优点和可以改进的地方: ## ✨ 优点 ### 1. **错误处理完善** - `set -e` 确保命令失败时立即退出 - 明确的错误检查(如测试失败时的处理) ### 2. **用户体验友好** - 彩色输出让状态一目了然 - 清晰的步骤说明 - 完成后提供具体的使用指引 ### 3. **配置灵活** - 使用环境变量支持自定义配置 - 提供默认值避免配置缺失 ### 4. **同步策略合理** - 排除不必要的文件(缓存、大模型文件等) - 分离代码和数据同步 - 条件性同步数据文件 ### 5. **远程环境管理** - 自动创建目录 - 智能检测并创建虚拟环境 - 自动安装依赖 ## 🔧 可以改进的地方 ### 1. **SSH 端口硬编码** ```bash # 建议改为 SSH_PORT="${SSH_PORT:-10929}" # 然后使用 ssh -p $SSH_PORT $REMOTE_HOST ``` ### 2. **增加日志记录** ```bash LOG_FILE="${LOG_FILE:-sync_$(date +%Y%m%d_%H%M%S).log}" exec 2>&1 | tee -a "$LOG_FILE" ``` ### 3. **添加 dry-run 模式** ```bash if [[ "$1" == "--dry-run" ]]; then RSYNC_OPTS="--dry-run" echo -e "${YELLOW}DRY RUN MODE${NC}" fi ``` ### 4. **更健壮的错误处理** ```bash trap 'echo -e "${RED}Script failed at line $LINENO${NC}"' ERR ``` ### 5. **检查依赖** ```bash command -v rsync >/dev/null 2>&1 || { echo "rsync is required but not installed. Aborting." >&2; exit 1; } ``` ### 6. **添加进度统计** ```bash START_TIME=$(date +%s) # ... 脚本执行 ... END_TIME=$(date +%s) echo "Total time: $((END_TIME - START_TIME)) seconds" ``` ### 7. **支持配置文件** ```bash CONFIG_FILE="${CONFIG_FILE:-.sync.conf}" if [ -f "$CONFIG_FILE" ]; then source "$CONFIG_FILE" fi ``` ## 💡 锦上添花的功能 ```bash # 1. 添加确认提示 read -p "Sync to $REMOTE_HOST? (y/N) " -n 1 -r echo if [[ ! $REPLY =~ ^[Yy]$ ]]; then exit 1 fi # 2. 备份功能 BACKUP_DIR="$REMOTE_DIR.backup.$(date +%Y%m%d_%H%M%S)" ssh -p $SSH_PORT $REMOTE_HOST "cp -r $REMOTE_DIR $BACKUP_DIR" # 3. 同步后验证 ssh -p $SSH_PORT $REMOTE_HOST "cd $REMOTE_DIR && python -c 'import src'" ``` 总的来说,这个脚本已经达到了生产级别的质量,结构清晰、功能完整、用户友好。上面的建议主要是锦上添花,让它更加健壮和灵活。🎯 ```bash #!/bin/bash set -e GREEN='\033[0;32m' YELLOW='\033[1;33m' RED='\033[0;31m' NC='\033[0m' REMOTE_HOST="${REMOTE_HOST:[email protected]}" REMOTE_DIR="${REMOTE_DIR:-/home/user/qwen-training}" LOCAL_DIR="$(cd "$(dirname "$0")/.." && pwd)" echo -e "${GREEN}=== Sync to A800 Server ===${NC}" echo "Local: $LOCAL_DIR" echo "Remote: $REMOTE_HOST:$REMOTE_DIR" echo "" echo -e "${YELLOW}Step 1: Running local tests...${NC}" cd "$LOCAL_DIR" python src/test_local.py if [ $? -ne 0 ]; then echo -e "${RED}Local tests failed! Fix before syncing.${NC}" exit 1 fi echo -e "${GREEN}Step 2: Creating remote directory...${NC}" ssh -p 10929 $REMOTE_HOST "mkdir -p $REMOTE_DIR" echo -e "${GREEN}Step 3: Syncing code...${NC}" rsync -avz --progress \ -e "ssh -p 10929" \ --exclude='*.pyc' \ --exclude='__pycache__' \ --exclude='.git' \ --exclude='outputs/' \ --exclude='*.bin' \ --exclude='*.safetensors' \ --exclude='wandb/' \ --exclude='.DS_Store' \ --exclude='.venv/' \ $LOCAL_DIR/ $REMOTE_HOST:$REMOTE_DIR/ echo -e "${GREEN}Step 4: Syncing data files...${NC}" if [ -f "$LOCAL_DIR/train.csv" ]; then rsync -avz --progress -e "ssh -p 10929" $LOCAL_DIR/*.csv $REMOTE_HOST:$REMOTE_DIR/ fi echo -e "${GREEN}Step 5: Setting up remote environment...${NC}" ssh -p 10929 $REMOTE_HOST << EOF cd $REMOTE_DIR if [ ! -d "venv" ]; then python3 -m venv venvfi source venv/bin/activate pip install -r requirements/a800.txt EOF echo -e "${GREEN}Sync completed successfully!${NC}" echo "" echo "To start training on A800:" echo " ssh $REMOTE_HOST" echo " cd $REMOTE_DIR" echo " bash scripts/train_a800.sh" ```