# 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"
```