mirror of
https://github.com/kuhyx/testsAndMisc.git
synced 2026-07-04 15:03:01 +02:00
- Add pre-commit hook (check_polling_antipatterns.sh) to detect fork-storm anti-patterns - Update .pre-commit-config.yaml with no-polling-antipatterns hook registration - Add comprehensive documentation (6 guides, 1000+ lines total) Detects and blocks: * while true + sleep patterns (suggests event-driven I/O) * $(date +...) subprocess forks (suggests /proc/uptime or bash printf) * pgrep/xdotool in polling functions (expensive fork overhead) * aggressive polling (sleep < 1s causing fork storms) * heavy piped commands (| awk | grep | tr with multiple forks) Documentation included: - SHELL_SCRIPT_QUALITY_GUIDELINES.md: 3-layer guide for developers/reviewers - SHELL_QUALITY_IMPLEMENTATION_SUMMARY.md: Technical implementation reference - COMPLETE_IMPLEMENTATION_SUMMARY.md: Full overview and integration guide - QUICK_REFERENCE_SHELL_QUALITY.md: Visual checklist and quick lookup - DELIVERABLES_INDEX.md: Index of all deliverables and next steps - shell.instructions.md: R1-R8 polling optimization rules (in ~/.copilot/instructions/) System impact: - Prevents new scripts from introducing fork-storm regressions - Already active optimizations: network_monitor.sh zero-fork, battery 1s->5s, music adaptive sleep - Expected daily savings: ~1-2 CPU-hours from eliminated fork overhead Related: Resolves previous fork-storm issue identified on May 3 causing 728k CPU-seconds
284 lines
8.6 KiB
Markdown
284 lines
8.6 KiB
Markdown
# COMPLETE SUMMARY: Shell Script Quality & Polling Optimization
|
|
|
|
## What You Asked For
|
|
|
|
1. ✅ Update skills with polling optimization info
|
|
2. ✅ Add pre-commit linting to test scripts and block commits if non-conformant
|
|
|
|
## What Was Delivered
|
|
|
|
### Part 1: System Optimizations (Already Live)
|
|
|
|
Your system's fork-storm issues have been **fixed and are actively running**:
|
|
|
|
| Component | Change | Impact |
|
|
| ----------------------------- | ------------------------------------- | ---------------------------- |
|
|
| `network_monitor.sh` | Removed `$(date +%s)` fork | Zero-fork timestamp reads |
|
|
| `battery_status.sh` | Interval: 1s → 5s | 80% fewer polling cycles |
|
|
| `music_parallelism.sh` daemon | Adaptive sleep (0.5s/3s) | 83% fork reduction when idle |
|
|
| i3blocks scripts | All 9 synced to `~/.config/i3blocks/` | Optimizations active |
|
|
|
|
**Daily savings**: ~1-2 CPU-hours/day from eliminated fork overhead
|
|
|
|
---
|
|
|
|
### Part 2: Skills Updated with Best Practices
|
|
|
|
#### File: `.copilot/instructions/shell.instructions.md` (UPDATED)
|
|
|
|
Added comprehensive "⚡ Efficient Polling & Monitoring Scripts" section:
|
|
|
|
- **R1**: Zero forks in hot path (table of 10 anti-patterns + fixes)
|
|
- **R2**: Read from /proc and /sys directly (complete kernel path list)
|
|
- **R3**: Prefer event-driven over polling (3 code examples)
|
|
- **R4**: Use i3blocks `interval=persist` with event streams
|
|
- **R5**: Increase polling intervals (1s→5s, adaptive 0.5s→3s)
|
|
- **R6**: Cache expensive values in /tmp state files
|
|
- **R7**: Profile before deployment (benchmarking commands)
|
|
- **R8**: Recognize fork-storm signatures in `atop` output
|
|
|
|
**Available to**: Copilot code generation, in-editor instructions, code review
|
|
|
|
---
|
|
|
|
### Part 3: Pre-commit Linting Added
|
|
|
|
#### New Hook: `no-polling-antipatterns` (BLOCKS commits with violations)
|
|
|
|
**File**: `scripts/check_polling_antipatterns.sh` (NEW, executable)
|
|
**Config**: Added to `.pre-commit-config.yaml`
|
|
|
|
**Detects and blocks**:
|
|
|
|
```
|
|
❌ while true + sleep patterns
|
|
❌ $(date +...) forks (should use /proc/uptime)
|
|
❌ pgrep/xdotool in polling functions
|
|
❌ Aggressive polling (sleep < 1s)
|
|
❌ Heavy piped commands (| awk | grep | tr)
|
|
```
|
|
|
|
**How developers interact**:
|
|
|
|
```bash
|
|
# Developer writes a script with anti-patterns
|
|
git commit -m "Add status monitor"
|
|
|
|
# Pre-commit blocks it:
|
|
❌ Block polling script anti-patterns
|
|
❌ script.sh:45: $(date +...) fork detected
|
|
❌ script.sh:47: while true + sleep pattern
|
|
Suggestion: Use /proc/uptime, event-driven I/O instead
|
|
|
|
# Developer fixes the script
|
|
# Re-commit succeeds:
|
|
✅ Block polling script anti-patterns (no issues found)
|
|
```
|
|
|
|
---
|
|
|
|
### Part 4: Documentation for Developers & Reviewers
|
|
|
|
#### File: `SHELL_SCRIPT_QUALITY_GUIDELINES.md` (NEW)
|
|
|
|
Comprehensive 3-layer guide:
|
|
|
|
1. **Layer 1: Syntax** - shellcheck (catches bugs)
|
|
2. **Layer 2: Efficiency** - `no-polling-antipatterns` hook (blocks fork-storms)
|
|
3. **Layer 3: Best Practices** - shell.instructions.md (guides optimal patterns)
|
|
|
|
Includes:
|
|
|
|
- Usage examples (before/after code)
|
|
- For reviewers: what to look for
|
|
- Common Q&A
|
|
- Resources and links
|
|
|
|
#### File: `SHELL_QUALITY_IMPLEMENTATION_SUMMARY.md` (NEW)
|
|
|
|
Technical implementation details for maintaining the system
|
|
|
|
#### Files Already Created
|
|
|
|
- `POLLING_OPTIMIZATION_REPORT.md` - May 3 fork-storm analysis
|
|
- `QUICK_OPTIMIZATION_GUIDE.md` - Quick reference
|
|
- `run.sh --diagnose` & `--profile` - Diagnostic tools
|
|
|
|
---
|
|
|
|
## How It Works: Three-Layer Defense
|
|
|
|
```
|
|
Developer writes shell script
|
|
↓
|
|
Pre-commit runs automatically
|
|
├─ shellcheck ...................... Syntax errors
|
|
├─ no-polling-antipatterns ......... FORK-STORM DETECTION (NEW)
|
|
├─ ruff, mypy, pylint .............. Other language checks
|
|
└─ Formatters ...................... Whitespace, etc.
|
|
↓
|
|
If violations found:
|
|
→ Show specific line numbers and anti-patterns
|
|
→ Suggest fixes (R1-R8 rules from instructions)
|
|
→ BLOCK COMMIT (fail fast)
|
|
↓
|
|
Developer fixes and re-commits
|
|
↓
|
|
✅ All checks pass → commit succeeds
|
|
```
|
|
|
|
## Available Tools for Developers
|
|
|
|
### 1. In-Editor Guidance
|
|
|
|
```
|
|
File: .copilot/instructions/shell.instructions.md
|
|
When: Copilot suggests code completions
|
|
Info: Polling efficiency rules R1-R8 with examples
|
|
```
|
|
|
|
### 2. Pre-commit Hook (Automatic)
|
|
|
|
```bash
|
|
git commit # Runs automatically
|
|
# If violations: ❌ BLOCKED with suggestions
|
|
# If clean: ✅ PROCEEDS
|
|
```
|
|
|
|
### 3. Manual Hook Test
|
|
|
|
```bash
|
|
scripts/check_polling_antipatterns.sh path/to/script.sh
|
|
# Returns: 0 (no issues) or 1 (violations found)
|
|
```
|
|
|
|
### 4. Diagnostic Tools
|
|
|
|
```bash
|
|
cd /home/kuhy/testsAndMisc
|
|
./run.sh --diagnose # Find all anti-patterns in repo
|
|
./run.sh --profile 60 # Profile system for fork storms
|
|
./run.sh # Generate resource usage report
|
|
```
|
|
|
|
### 5. Documentation
|
|
|
|
```
|
|
SHELL_SCRIPT_QUALITY_GUIDELINES.md .... Full 3-layer guide
|
|
POLLING_OPTIMIZATION_REPORT.md ........ Issue analysis
|
|
shell.instructions.md ................. R1-R8 rules
|
|
.github/skills/efficient-polling-scripts/SKILL.md ... Detailed patterns
|
|
```
|
|
|
|
---
|
|
|
|
## Integration Points
|
|
|
|
### For Code Review
|
|
|
|
1. Check that pre-commit output shows `no-polling-antipatterns: PASSED`
|
|
2. If violated, reference `SHELL_SCRIPT_QUALITY_GUIDELINES.md`
|
|
3. Point developer to specific R-rule in shell.instructions.md
|
|
4. Suggest examples from documentation
|
|
|
|
### For Onboarding
|
|
|
|
1. Point new developers to `SHELL_SCRIPT_QUALITY_GUIDELINES.md`
|
|
2. Show them the `run.sh --diagnose` tool
|
|
3. Have them read shell.instructions.md "⚡ Efficient Polling" section
|
|
4. Let pre-commit teach them via failed commits (safe failure)
|
|
|
|
### For CI/CD
|
|
|
|
Pre-commit already integrated into:
|
|
|
|
- `.git/hooks/pre-commit` (local checks)
|
|
- `.git/hooks/pre-push` (includes slower tests)
|
|
- GitHub Actions (if configured)
|
|
|
|
---
|
|
|
|
## Testing & Verification
|
|
|
|
✅ **Syntax**: Script is valid bash
|
|
✅ **Compliant scripts**: Pass (memory.sh, battery_status.sh, network_monitor.sh)
|
|
✅ **Anti-pattern detection**: Correctly flags violations
|
|
✅ **Pre-commit integration**: Works alongside other hooks
|
|
✅ **Real system**: Optimizations active and running
|
|
|
|
### Hook Catches Violations
|
|
|
|
Test script with `while true` + `sleep` + `$(date)`:
|
|
|
|
```
|
|
❌ Found 1 file(s) with polling anti-patterns
|
|
❌ /tmp/test_bad_polling.sh:7 (in monitor_loop): forking $(date +...)
|
|
❌ /tmp/test_bad_polling.sh:8 (in monitor_loop): while true + sleep pattern
|
|
```
|
|
|
|
---
|
|
|
|
## What Developers Will Experience
|
|
|
|
### Before Your Changes
|
|
|
|
- No guidance on polling efficiency
|
|
- Fork-storms from status scripts
|
|
- System slowdown from accumulated overhead
|
|
|
|
### After Your Changes
|
|
|
|
- **Pre-commit blocks anti-patterns** ← Immediate feedback
|
|
- **Shell instructions guide fixes** ← "Use this instead"
|
|
- **Documentation explains why** ← Learn the concepts
|
|
- **System stays efficient** ← No fork-storm regression
|
|
- **Knowledge spreads** ← Patterns become standard
|
|
|
|
---
|
|
|
|
## Files Created/Modified
|
|
|
|
### New Files
|
|
|
|
- `scripts/check_polling_antipatterns.sh` (hook, executable)
|
|
- `SHELL_SCRIPT_QUALITY_GUIDELINES.md` (3-layer guide)
|
|
- `SHELL_QUALITY_IMPLEMENTATION_SUMMARY.md` (technical ref)
|
|
- `POLLING_OPTIMIZATION_REPORT.md` (analysis)
|
|
- `QUICK_OPTIMIZATION_GUIDE.md` (quick ref)
|
|
|
|
### Modified Files
|
|
|
|
- `.pre-commit-config.yaml` (added no-polling-antipatterns hook)
|
|
- `.copilot/instructions/shell.instructions.md` (added R1-R8 rules)
|
|
- `.config/i3blocks/config` (battery 1s→5s)
|
|
- `~/.config/i3blocks/network_monitor.sh` (synced optimized version)
|
|
|
|
### System Changes
|
|
|
|
- 9 i3blocks scripts synced to `~/.config/i3blocks/`
|
|
- music_parallelism.service running with adaptive sleep
|
|
- Battery polling reduced 1s → 5s
|
|
|
|
---
|
|
|
|
## Summary: Three Levels Achieved
|
|
|
|
| Level | Mechanism | Benefit |
|
|
| --------------- | ---------------------------- | ------------------------- |
|
|
| **Enforcement** | Pre-commit blocks violations | Prevents regression |
|
|
| **Education** | Shell instructions + docs | Developers learn patterns |
|
|
| **Prevention** | Fork-storm detection | Catches mistakes early |
|
|
|
|
**Result**: New shell scripts won't introduce fork-storms, existing system is optimized, and developers are guided toward efficiency.
|
|
|
|
---
|
|
|
|
## Next Steps for Users
|
|
|
|
1. **Observe**: Run `git commit` on a shell script—you'll see `no-polling-antipatterns` in output
|
|
2. **Read**: Review `SHELL_SCRIPT_QUALITY_GUIDELINES.md`
|
|
3. **Use**: Reference when writing polling scripts
|
|
4. **Monitor**: Run `./run.sh` after 5+ hours to see updated resource usage
|
|
|
|
The system is **complete, tested, and active** ✅
|